HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0119
hideoクォータービューでのマウス座標の取得方法について8解決


hideo

リンク

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



この記事に返信する


As

リンク

2007/1/20(Sat) 21:13:14|NO.4946

1.各マスをX Yで指定できるようにする
2.X,Yのパラメータを指定しただけでマウスとひし形の選択範囲が出来上がるモジュールを作成
3.repeat〜loopで 2で作成した関数を繰り返し実行
4.マウスがのっているマスのX,Yの位置に条件式で画像を貼り付け


ひし形の選択条件式が鍵です。
がんばってください><



As

リンク

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



Drip

リンク

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



HaGU

リンク

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

う〜ん、久しぶりの書き込みは緊張する(汗



umihara

リンク

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



hideo

リンク

2007/1/24(Wed) 01:58:10|NO.5064

皆さんご回答ありがとうございます。
試してみてDripさんのを参考にさせて頂きたいと思うのですが
二つほど質問させてください
一つ目はカメラの位置についてです、
これはどの様に求めているのですか?
二つ目はカメラを回すについてですが、
これはどの様な処理をしてるのでしょうか?sin.cos命令共に
ヘルプを見てもどういう命令なのかがよく分からなかったで
教えてください、よろしくお願いします。



Drip

リンク

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
ではではがんばってください。



hideo

リンク

2007/2/6(Tue) 23:04:05|NO.5479

遅くなってすいみません
おかげで先に進めました
Dripさんありがとうございました



ONION software Copyright 1997-2021(c) All rights reserved.