|
|
2007/1/19(Fri) 22:58:37|NO.4910
現在クォータービューSLGを作ろうとしてるのですが
マスの上にマウスが乗っている時のみカーソルを表示させるには
どうすればいいでしょうか?
状況としては二次元配列変数mapに地形データを入れて描画させています
ユニットも同じようにして描画させる予定です
以下簡単に組んだマップ描画プログラムです
screen 0,356,320
buffer 1 : picload "map.bmp",0
dim map,10,10
bx=160 :by=64
lx=bx :ly=by
gsel 0
gmode 2
repeat 10 :cntt=cnt
if cntt>0 {
lx=bx-(cnt*16)
ly=by+(cnt*8)
}
repeat 10
pos lx,ly
gcopy 1,map.cnt.cntt*32,0,32,32
lx+=16
ly+=8
loop
loop
stop
|
|
2007/1/20(Sat) 21:13:14|NO.4946
1.各マスをX Yで指定できるようにする
2.X,Yのパラメータを指定しただけでマウスとひし形の選択範囲が出来上がるモジュールを作成
3.repeat〜loopで 2で作成した関数を繰り返し実行
4.マウスがのっているマスのX,Yの位置に条件式で画像を貼り付け
ひし形の選択条件式が鍵です。
がんばってください><
|
|
2007/1/20(Sat) 21:16:12|NO.4947
>>実行例
Y=0
repeat Y
repeat X
if hisi(X,Y,mousex,mousey)=1{
pos X,Y:gcopy *******
}
X+
loop
Y+
loop
|
|
2007/1/21(Sun) 00:01:34|NO.4956
Dripです。
クォータービューのマップからマウスポインタの座標を取得するのは
ちょっと難しいかもしれませんね。
3Dゲームを作るときみたく、カメラの概念を持たせてできるだけシンプルに作りたいところです。
マウスポインタをマップ上の座標に変換するときは、X座標÷2ずつY座標が変化することに
注意しなければなりません。似たことがY座標にも言えます。
サンプルを用意しましたので、『//mx,myにマウス座標取得』の部分を特に入念に調べてみてください。
(ちなみにこの手のアルゴリズムは他人が書いたプログラムを調べるより
自分で頑張った方がわかりやすい事が多いです。
‥というのも、やろうとしてる事は単純なのに処理はこんがらがってるジャンルだからです。
一度スパゲティになってしまったスクリプトは一旦破棄して、一から作り直すと
案外うまくいくことも多いのでがんばってくださいね。^^;)
//チップサイズ
#define size 32
//1マス描画するためのマクロ。画像を使う場合はpos+gcopyで充分です。
#define qv(%1,%2) macro1=%1*size/2-camx-%2*size/2,%1*size/2+size/2-camx-%2*size/2:\
macro1(2)=%1*size/2+size-camx-%2*size/2,%1*size/2+size/2-camx-%2*size/2:\
macro2=%2*size/4+size/4-camy+%1*size/4,%2*size/4-camy+%1*size/4:\
macro2(2)=%2*size/4+size/4-camy+%1*size/4,%2*size/4+size/2-camy+%1*size/4:\
gsquare -1,macro1,macro2
camx=-300:camy=-150 //カメラの位地
mapx=10:mapy=10:dim map,mapx,mapy //マップセットアップ
repeat 200
map(rnd(mapx),rnd(mapy))=rnd(4)
loop
repeat //メイン
camx=-300+sin(double(cnt)/50)*100 //カメラを回す。
camy=-150+cos(double(cnt)/50)*50
redraw 0
color 255,255,255:boxf
mousex_=mousex+camx-size/2 //mx,myにマウス座標取得
mousey_=mousey+camy
mx=(mousey_+mousex_/2)/(size/2)
my=(-mousex_+mousey_*2)/size
repeat mapx:x=cnt:repeat mapy:y=cnt //マップ描画
if mx=x & my=y:{ //マウスポインタの位置のチップを光らせる
color 255,c,c
qv x,y
color:pos 80,80:mes "座標:"+x+","+y
continue
}
switch(map(x,y))
case 1:color ,255:qv x,y:swbreak
case 2:color 255,128:qv x,y:swbreak
case 3:color ,128:qv x,y:swbreak
default:color ,,255:qv x,y:swbreak
swend
loop:loop
redraw
await 30
c+=16
loop
| |
|
2007/1/21(Sun) 01:54:50|NO.4959
Dripさんとは、ちょっと違ったアプローチのサンプルおば。
マスの四点の座標が分かれば、下の命令でマスの中にマウスカーソルが入っているか判定できます。
もし処理の内容を詳しく知りたいのでしたら「外積」について調べてみてください。
まあ、座標を「反時計回りに指定する」等の条件を守れば、内容はそんなに気にしなくても使えるはずです。
四点の座標を求めるのはクォータービューならそれほど難しくはないと思うので、自力で頑張って下さい。
//四角形とマウス座標の内外判定サンプル
#module
;--マウスが四角形内に入っているか判定する命令--;
#deffunc SquareInChk array Vtx, array Pnt
Flg=0
repeat 4
a = ( Vtx(2*(cnt+1)+0) - Vtx(2*cnt+0) ) * ( Pnt(1) - Vtx(2*cnt+1) );
b = ( Vtx(2*(cnt+1)+1) - Vtx(2*cnt+1) ) * ( Pnt(0) - Vtx(2*cnt+0) );
if ( (a-b) > 0.0) :break;
Flg++
loop
if Flg=4 { return 1 }else{ return 0 } ;
;--もし、入っているなら「stat」に 1 が入ります--;
#global
dim Pnt,2;マウスの座標用の配列(1点分)
dim Vtx,10;四角形の頂点を入れる配列(5点分) X座標とY座標を交互に入れてください。
;X座標 : Y座標
Vtx(0) = 50 : Vtx(1) = 100 ;1点目
Vtx(2) = 200 : Vtx(3) = 150 ;2点目
Vtx(4) = 350 : Vtx(5) = 100 ;3点目
Vtx(6) = 200 : Vtx(7) = 50 ;4点目
Vtx(8) = Vtx(0) : Vtx(9) = Vtx(1);計算簡単の為に5点目は1点目と同じ値にしてください。
;頂点の座標は必ず 「 反時計回り 」 に入れてください
;凹形の部分があると、正確に判定できません。(わかり難いかもしれませんが…)
;全て凸形の部分で構成してください。
screen 0,400,200
*main
await 10
redraw 0
color 0,0,0:boxf
color 255,255,255
repeat 4
line Vtx(2*cnt+0),Vtx(2*cnt+1),Vtx(2*(cnt+1)+0),Vtx(2*(cnt+1)+1);
mes "["+cnt+"]"
loop
Pnt(0) = mousex : Pnt(1) = mousey;マウス座標入力
SquareInChk Vtx,Pnt;判定
pos 0,0
if stat=1 { mes "入ってる" }else{ mes "入ってない" }
redraw 1
goto *main
う〜ん、久しぶりの書き込みは緊張する(汗
| |
|
2007/1/22(Mon) 23:43:30|NO.5027
座標取得はこんな感じはどうでしょうか?
超手抜きですが・・・
裏画面の同位置に、colorのRとGに座標を入れて描画し、それを読んでるだけです、
色は分かりやすくするため25倍してます。
screen 0,356,320
buffer 1 : picload "map.bmp",0
screen 2,356,320
buffer 3
dim map,10,10
bx=160 :by=64
lx=bx :ly=by
gsel 0:gmode 2
gsel 2:gmode 2
repeat 10 :cntt=cnt
if cntt>0 {
lx=bx-(cnt*16)
ly=by+(cnt*8)
}
repeat 10
gsel 0
pos lx,ly
gcopy 1,map.cnt.cntt*32,0,32,32
gosub *table
gsel 2
pos lx,ly
gcopy 3,0,0,32,32
lx+=16
ly+=8
loop
loop
*main
gsel 0,2
repeat
gsel 0:mx=mousex:my=mousey
gsel 2:pget mx,my:r=ginfo_r:g=ginfo_g
gsel 0:title "X="+str(r/25)+" Y="+str(g/25)
await 50
loop
stop
*table //菱形描画
gsel 3
cls 4:color cnt*25,cntt*25,255
repeat 16
x=(cnt+1)*(cnt<8)+(8*(cnt>=8))-((cnt-8)*(cnt>=8))
line 16+x*2,cnt,16-x*2,cnt
loop
return
color
|
|
2007/1/24(Wed) 01:58:10|NO.5064
皆さんご回答ありがとうございます。
試してみてDripさんのを参考にさせて頂きたいと思うのですが
二つほど質問させてください
一つ目はカメラの位置についてです、
これはどの様に求めているのですか?
二つ目はカメラを回すについてですが、
これはどの様な処理をしてるのでしょうか?sin.cos命令共に
ヘルプを見てもどういう命令なのかがよく分からなかったで
教えてください、よろしくお願いします。
|
|
2007/1/27(Sat) 18:43:06|NO.5220
Dripです。
レス遅くなりました。
カメラの位置とsin,cosについてですが、
私が上げたサンプル上でカメラの位置は、camx,camyの2つの変数により管理されています。
これはクォータービューのマップとは独立した座標系を持つため、単に
camxが増えればマップの描画開始位置が左にずれるだけです。
同じく、camyが変化すると縦に描画開始位置がずれるだけです。
これは自分で動かして調べてみてください。
sin,cosは三角関数と呼ばれるもののひとつで、三角関数を先に学ばないと意味がわからない
かと思います。google等で調べてみてください。
http://www.google.co.jp/search?hl=ja&q=%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0&lr=
参考にsin,cosを使用した簡単なプログラムを以下に示します。
応用すればシューティングゲーム等で、追尾ミサイルや、美しい弾幕等を
作成することができるようになります。
repeat 31416
myt=double(cnt)/1000
pset 320+sin(myt)*320,240+cos(myt)*240
loop
ではではがんばってください。
|
|
2007/2/6(Tue) 23:04:05|NO.5479
遅くなってすいみません
おかげで先に進めました
Dripさんありがとうございました
|
|