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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0320
す²pgetを範囲で13解決


す²

リンク

2022/3/20(Sun) 18:54:48|NO.95784

当たり判定の計算などが難しくてよくわからんので、色で当たり判定を調べようと思いました。
なので、pgetを範囲で使う方法を知りたいです。



この記事に返信する


zrs90(5さい)

リンク

2022/3/20(Sun) 20:52:24|NO.95785

当たり判定で検索。
(※的ハズレでしたらすみません。)

http://hsp.tv/play/pforum.php?mode=pastwch&num=18036

18049 の で似たような事
やってましたが、どうでしょう?
この方の投稿は、他の物も
割と簡単と思いますが...

ただし、そのまま実行すると
タスクマネージャーからしか
終了出来ないので

テスト時は
if stat = 1 : end を最終行の手前に
記述して下さい。



す²

リンク

2022/3/20(Sun) 21:02:52|NO.95786

う〜ん...
例えば赤色に黒色が当たったら 何とか or xからx+100、yからy+100 の範囲内に黒が当たったら 何とか
みたいにしたいんですよね...



hspfun

リンク

2022/3/20(Sun) 23:58:58|NO.95788

恐らくお求めのプログラムは
正攻法で行くと下記の様な感じです。

;自機と敵のサイズ、敵の初期位置を宣言 jibunXsize=50 jibunYsize=50 tekiXsize=50 tekiYsize=50 tekiX=320 tekiY=240 *main ;メインループ jibunX=mousex jibunY=mousey redraw 0 ;描画開始 color 255,255,255:boxf color 0,0,255:boxf jibunX,jibunY,jibunX+jibunXsize,jibunY+jibunYsize ;自機の描画 color 0,0,0:boxf tekiX,tekiY,tekiX+tekiXsize,tekiY+tekiYsize ;敵?の描画 redraw 1 ;描画終わり ;以下で 自機の縦方向の大きさ x 横方向の大きさ のドット数分pgetで取得 ;(50x50だと250箇所をpgetで取得) repeat jibunYsize cnt2=cnt repeat jibunXsize pget jibunX+cnt,jibunY+cnt2 ;色取得 if ginfo_r=0 & ginfo_g=0 & ginfo_b=0{ ;判定 tekiX=rnd(640):tekiY=rnd(480) break } loop loop await 16 goto *main
一つ判定するのにpgetを250回とか行う事になるので
ゲーム等に使用すると重いかもしれないです。
下記のソースは一般的な箱型の当たり判定の式だと思いますが
軽い処理で同じ事ができます。

;自機と敵のサイズ、敵の初期位置を宣言 jibunXsize=50 jibunYsize=50 tekiXsize=50 tekiYsize=50 tekiX=320 tekiY=240 *main ;メインループ jibunX=mousex jibunY=mousey ;以下で 四つの条件式にて当たり判定 if jibunX+jibunXsize >= tekiX & jibunX <= tekiX+tekiXsize & jibunY+jibunYsize >= tekiY & jibunY <= tekiY+tekiYsize{ ;当たり判定 tekiX=rnd(640):tekiY=rnd(480) } redraw 0 ;描画開始 color 255,255,255:boxf color 0,0,255:boxf jibunX,jibunY,jibunX+jibunXsize,jibunY+jibunYsize ;自機の描画 color 0,0,0:boxf tekiX,tekiY,tekiX+tekiXsize,tekiY+tekiYsize ;敵の描画 redraw 1 await 16 goto *main



す²

リンク

2022/3/21(Mon) 13:27:55|NO.95792

ありがとうございます。
解決しました。
でもやはり1どっとづつ調べるしかないのですね...



zrs90(5さい)

リンク

2022/3/21(Mon) 15:16:03|NO.95793

hspfun さん
ありがとうございました。

「色指定」と「pget」いう条件下で
比較的、分かりやすそうな物を、探したつもりでしたが...
ゲームとしての実装までは、考えが至りませんでした。



hspfun

リンク

2022/3/22(Tue) 18:54:18|NO.95803

あとmrefを使って
より高速にドット単位で取得する手法もあります。
(vramに直接アクセスします。)

参考(難しいかもしれないです。)
http://hsp.tv/play/pforum.php?mode=pastwch&num=59115



す²

リンク

2022/3/22(Tue) 19:01:09|NO.95804

ありがとうございます。もし足りなかったら使おうと思います



窓月らら

リンク

2022/3/22(Tue) 20:14:53|NO.95805

横からですが、オブジェクトが増えるとpgetは速度的に使えないと思います。
Windows Vista以降くっそ重たくなったはずです。GDIの関係で。

当たり判定なんて座標判定するだけです。
x,y が一定の範囲内なら当たったとするだけだと思いますが。

自分の座標をx,yとして
敵か何かをex,eyとした場合で敵のサイズが16x16pxの場合

ex=280: ey=220 *main x=mousex: y=mousey redraw 0 color: boxf: color 255,255,255 pos 8,8: mes "マウスカーソルを自機に見立ててください。" ex+=sin(double(c)/16)*4 // 敵の動き boxf ex,ey,ex+16,ey+16 // 敵に見立てたボックス if x>ex & x<ex+16 & y>ey & y<ey+16 { mes "当たった!" } redraw 1 await 17-(c\3=0) // 60FPS c++ goto *main



す²

リンク

2022/3/22(Tue) 20:38:10|NO.95806

正直1個1個当たり判定の指揮を入れるのがめんどうで...色で判別できればどんな形でもできるし
一括でできるので...と思ったのですけど...やはり重かったですね.
とりあえずvramの方法を試そうと思います。



窓月らら

リンク

2022/3/22(Tue) 21:17:47|NO.95807

1個1個なんて入れません、1個だろうと1000個だろうと記述コストはほぼ変わりません。
配列変数を使ってループ処理するだけです。弾幕シューティングだろうとみんなこれです。

#define OBJ 50 // オブジェクト数 randomize // 初期値 repeat OBJ ex(cnt)=100+rnd(440) ey(cnt)=rnd(460) loop *main x=mousex: y=mousey redraw 0 color: boxf repeat OBJ color 0,0,255 i=cnt ex(i)+=sin(double(c+i*8)/16)*4 // 敵の動き if x>ex(i) & x<ex(i)+16 & y>ey(i) & y<ey(i)+16 { color 255: mes "当たった! No="+i } boxf ex(i),ey(i),ex(i)+16,ey(i)+16 // 敵に見立てたボックス loop color 255,255,255: pos 8,8: mes "マウスカーソルを自機に見立ててください。" redraw 1 await 17-(c\3=0) // 60FPS c++ goto *main



メルクーフ

リンク

2022/3/22(Tue) 21:25:16|NO.95808

 最初に作ったゲームの時から当たり判定にpgetを多用している者です。

 最初のゲームは主人公の中心から45度ずつ8か所の相対座標を配列に入れて、その8カ所だけをpgetして調べていました。
 他にはここが当たっていれば当然他の場所にも当たっているという位置だけピンポイントでpgetしたり、別のbufferに敵や敵の弾より大きな図形を配置して、主人公の中心1点だけをpgetしたりもしました。
 こうやって必要な位置だけをpgetで調べれば、遅いと感じるようなことはありません。

 どういった物を作ろうとしているのかは知りませんが、全体を調べないと分からないような複雑な図形かつ位置座標変動の激しい動きをするゲームだったらとても遊べるレベルとは思えませんし、何らかの実験シミュレーションだったらしばらく放置してその間に別のことでもやっていればいいんじゃないかと思いますが。



窓月らら

リンク

2022/3/22(Tue) 21:30:06|NO.95809

試しに
#define OBJ 50 // オブジェクト数
ここを 1000 とかに書き換えてみてください。
いくつだろうとコード側のコストは変わりません。



GENKI

リンク

2022/3/22(Tue) 23:29:58|NO.95811

解決したようだったので放置してたんですが、まだ続いてたんですね。
窓月ららさんがおっしゃられている通り、ドットの数が増えるとpgetでは遅いのでVRAMを使った方法を採用する必要があります。

VRAMを直接操作してみる - HSP開発wiki
https://wiki.hsp.moe/%E5%B0%8F%E3%83%AF%E3%82%B6%EF%BC%8FVRAM%E3%82%92%E7%9B%B4%E6%8E%A5%E6%93%8D%E4%BD%9C%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B.html

vramでも面積が増えると負荷が大きくなり動作が遅くなります。適当にvram読み書きするだけの物を書いて d3getfps で監視すると体感できると思います。
pgetにしろvramにしろ、例えばメルクーフさんが書かれているような処理を軽量化する何らかの工夫は必要になります。
他に今思いついたところでは、gzoomで小さくした画像で判定する…とか?
画面全体をチェックするのではなく、判定が必要なキャラクタの周辺だけをチェックする…とか?



もし単純な図形であればこちらの利用もご検討ください。

衝突判定もできるモジュール
https://mclab.uunyan.com/dl/dl50.htm



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.95784への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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