|
|
2023/12/15(Fri) 17:34:51|NO.100847
はじめまして、よろしくお願いします。
Excelのオートシェイプみたいに
四角形の図形(太さ、色、サイズの変更可能)を動的に作りたいです。
その際、線の色と太さは変えますが、四角形を枠だけにもしたいです。
[HSP]ドラッグ移動のサンプル(1) というサイトを参考に作ろうと思いましたが
何処を改変したら良いかが良く分かりません。
#modfunc RectDraw
color m_r/1,m_g/1,m_b/1:circle m_x-m_n, m_y-m_n, m_x+m_n, m_y+m_n,1
color m_r/2,m_g/2,m_b/2:circle m_x-m_n,m_y-m_n,m_x+m_n,m_y+m_n,0
return
たぶんここだと思います。
・太さの変えられる直線を引きたい
・ドラッグで動かせるようにしたい
です。
以下、分かれば知りたいです。
・LINEだと太さが変えられない(boxfしかないか?)
・boxfにした場合、boxfが重なる場所の背景を透過できるか(外側内側で重ねるつもり)
回答よろしくお願いいたします。
|
|
2023/12/16(Sat) 10:03:26|NO.100853
こんにちわ
詳しくないけど、Artlet2Dってプラグインを使うのがいいんじゃないですか?
標準で同梱されてますし、高速に図形をかける機能があったと思う。
どこかで質問のようなサンプルコードを見たような気もするが、それは忘れた。
ちなみにHGIMG4と一緒に使うことはできなかった。
|
|
2023/12/16(Sat) 10:19:31|NO.100854
ドラッグで動かす
stickでマウスの左クリック(256)を取得(非トリガー)して、ONならmousexとmouseyの場所に図形を描画、って感じで実装するのかなぁ。
ゲームと同じ感じで作るのがいいと思うけど。
*main
redraw 0
color 255,255,255
boxf
stick keys,256
if keys&256{
x=mousex:y=mousey
pos x,y
;図形の描画
color 255,0,0
boxf x-5,y-5,x+5,y+5
color 0,0,0
mes "ドラッグ"
}else{
pos x,y
color 255,0,0
boxf x-5,y-5,x+5,y+5
color 0,0,0
mes "離した"
}
redraw 1
await 1000/60
goto *main
|
|
2023/12/18(Mon) 18:26:08|NO.100877
なんか興味があったので、それっぽくしてみました。
冗長な部分は堪忍。
HGIMG4で使えたらいいのになぁ。。。
#include "a2d.hsp";Artlet2D
;=====================================
;図形管理モジュール mod_object
#module mod_object m_left,m_top,m_width,m_height,m_penwidth
#modinit
;モジュール変数初期化
m_left=100f
m_top =100f
m_width=100f
m_height=100f
m_penwidth=rnd(30);太さをランダムに
return
#modfunc local update
;描画処理
alPenWidth m_penwidth
alColor 255, 0, 0
alDrawRect m_left,m_top,m_width,m_height
return
#modfunc local move double _mousex,double _mousey
;移動処理
m_left=_mousex
m_top=_mousey
return
#modfunc local hitcheck double _mousex,double _mousey,array _hit
;ヒットチェック処理
;どこをクリックしたかも記憶
_hit=0f,0f,0f
if _mousex>=m_left{
if _mousey>=m_top{
if _mousex<=(m_left+m_width) {
if _mousey<=(m_top+m_height){
_hit.0=1.0f
_hit.1=_mousex-m_left
_hit.2=_mousey-m_top
}
}
}
}
return _hit
#global
;==========================================================
;メインプログラム
button gosub "new",*newobject ;ボタン作成
dimtype objects,vartype("struct"),0 ;モジュール型変数初期化(objects)
newmod objects,mod_object ;1個新規作成
current_obj=-1 ;選択用の変数初期化(-1)未選択
hit=0f,0f,0f
;==========================================================
*main
redraw 0 ;描画停止
alCreateImage 0, 640, 480 ;Artlet2Dのクリア
if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end
color 255,255,255
boxf ;メイン画面クリア
stick keys,256
if (keys&256){ ;ドラッグ中
if current_obj=-1{ ;対象を未選択なら
//マウス位置でヒットチェック
foreach objects
hitcheck@mod_object objects(cnt),mousex,mousey,hit
if hit(0)=1f{//ヒットした
current_obj=cnt ;選択対象を保存
break
}
loop
}
}else{ ;ドラッグしていないなら
current_obj=-1 ;未選択にする
}
if current_obj>-1{ ;対象が選択されているなら図形移動
;図形の移動
move@mod_object objects(current_obj),mousex-hit(1),mousey-hit(2)
}
//全オブジェクトの描画
foreach objects
;図形の描画
update@mod_object objects(cnt)
loop
alCopyImageToScreen 0, 0 ; 仮想イメージから HSP screen に画像転送
;デバッグ確認用
pos 100,0
color 0,0,0
mes "current_obj:"+current_obj
mes "hit(0):"+hit(0);ヒットフラグ
mes "hit(1):"+hit(1);ヒットした相対x
mes "hit(2):"+hit(2);ヒットした相対y
redraw 1
await 1000/60
goto *main
;=============================================================
;ボタン押した処理(新規作成)
*newobject
newmod objects,mod_object
return
| |
|
2023/12/19(Tue) 14:52:20|NO.100884
>buhio様
返答遅れて申し訳ありません。自分で調べてテストしてました。
欲しかったものそのままでビックリしました、ありがとうございます!!
私が考えたのは、仮想イメージを作ってSelect?を変えればいけるのかなと思ってました。
#include "a2d.hsp"
picload "1.jpeg"
; 仮想イメージ 0 を作成
alCreateImage 0, 300, 300
if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end
alPenWidth 10
alDrawRect 50, 50, 240, 120
; 仮想イメージ 1 を作成
alCreateImage 1, 0, 40
alPenWidth 8
alDrawRect 10, 10, 30, 30
; 仮想イメージ 0 から HSP スクリーンにコピー
alCopyImageToScreen 0, 0
alCopyImageToScreen 1, 0
redraw
重くなるだろうし良くないだろうとは思っていたのですが
こんなに良いものを教えて頂けるとは思いませんでした。ありがとうございます!
教えていただいたソースを解読しようと思います。
あとはリスト表示出来たら良いなと思っているのですが、
リストビュー(編集可能なグリッドビュー?)は設定が難しそうだったので
色々調べて分からなければもう一度相談させていだたこうと思います。
この度はありがとうございました!
|
|