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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1115
TSUあたり判定の方法5解決


TSU

リンク

2011/11/15(Tue) 16:07:39|NO.43024

縦型のSTGにおいての当たり判定の方法を教えていただきたいです。

ログやサイトなどをみましたがよくわかりません。
何が分からないのかといいますと、


例えば、
http://www.geocities.jp/hspgame2/shooting5.htm ページさんの

 
//敵の処理 repeat 20 if enemy_y(cnt) > 400 : enemy(cnt) = 0 if enemy(cnt) = 1{ enemy_y(cnt)++ if (abs(x - enemy_x(cnt)) < 40) & (abs(y - enemy_y(cnt)) < 40): enemy(cnt) = 0 pos enemy_x(cnt),enemy_y(cnt) gcopy 1,40,0,40,40 } loop return
少し飛びまして・・・

i = cnt repeat 20 if enemy(cnt) = 1 { if (abs(tama_x(i) - enemy_x(cnt)) < 40) & (abs(tama_y(i) - enemy_y(cnt)) < 40): enemy(cnt) = 0 } loop
これで、

if (abs(tama_x(i) - enemy_x(cnt)) < 40) & (abs(tama_y(i) - enemy_y(cnt)) < 40): enemy(cnt) = 0
↑ここの部分が当たり判定なのだとは思うのですが、
何をしているのかよくわかりません。


さっぱりなので、質問させていただきました。
下に自分のスクリプトも載せておきますので、(不要部分の多い長いスクリプトかもしれません。すみません)

「当たり判定」の回答のほうよろしくお願いします。

// // px = プレイヤーのx座標 // py = プレーヤーのy座標 // // ex = 敵のx座標 // ey = 敵のy座標 // // bull = 自機弾管理フラグ // bull_x = 自機弾のx座標 // bull_y = 自機弾のy座標 // // e_bull = 敵機弾管理フラグ // e_bull_x = 敵機弾のx座標 // e_bull_y = 敵機弾のy座標 // // // // // // 変数 // // // dim bull,10 dim bull_x,10 dim bull_y,10 dim e_bull,3 dim e_bull_x,3 dim e_bull_y,3 px = 195 : py = 500;自機座標 ex = 0 : ey = 0;敵機座標 u_check = 0;自機存在チェック e_check = 0;敵機存在チェック //↓   ↓// //↓ プログラム ↓// //↓ ↓// title "STG " buffer 1;背景画像読み込み picload "STGback.gif" buffer 2;プレイヤー画像読み込み picload "STG PLAYER.gif" buffer 3;敵画像読み込み picload "STG ENEMY.gif" buffer 4;弾画像読み込み picload "STGbull.gif" screen 0,439,566 gsel 0 *main redraw 2 color 255,255,255 : boxf color 253,253,253 : pos 0,0 : gmode 4,,,256 color 255,255,255 : pos 0,0 : gmode 4,,,256 gcopy 1,0,0,439,566;背景描画 if (u_write = 0) : gosub*user_bot;自機処理 //自機を描画するかしないか if (e_write = 0) : gosub*enemy_bot;敵機処理 //敵機を描画するかしないか gosub*user_check;自機あたり判定 gosub*enemy_check;敵機あたり判定 redraw 1 await 30 goto*main *user_bot pos px ,py : gcopy 2,0,0,51,70 ;自機描画 stick sti,31 ;キー入力を確認 if (sti & 1 and px>0 ) {;←キーを確認 px -=6;左に6 } if (sti & 2 ) {;↑キーを確認 if ( py>370 ) { py -=6;上に6 } } if (sti & 4 ) {;→キーを確認 if ( px<384 ){ px +=6;右に6 } } if (sti & 8 ) {;↓キーを確認 if ( py<500 ){ py +=6;下に6 } } if (sti & 16){;スペースキーを確認 repeat 10 if bull(cnt) = 0 { bull(cnt) = 1;弾発射用フラグ bull_x(cnt) = (px + 20);自機弾x座標 bull_y(cnt) = py;自機弾y座標 break } loop } repeat 10 if bull_y(cnt) < 0 : bull(cnt) = 0;自機弾が画面外に出たら、フラグを下す if bull(cnt) = 1 { bull_y(cnt)-=10 pos bull_x(cnt)-12,bull_y(cnt)-25;自機弾座標 color 255,255,255 : gmode 4,,,256 gcopy 4,0,0,50,50;自機弾描画 } loop return *enemy_bot color 255,255,255 : gmode 4,,,256 pos ex ,ey : gcopy 3,0,0,70,70;敵機描画 if (ex = 0 ){;左端にいるなら ex+=5;右に5移動し a=1;a=1 } if (a = 1){;a=1 ならば ex+=5;右に5移動 } if (ex > 370){;敵機座標xが397より大きくなれば ex-=5;左に5移動し a=2;a=2 } if (a = 2){;a=2 ならば ex-=5;左に5移動 } e_bullcnt += 1;敵弾発射タイミングカウント用変数 if ( e_bullcnt/4 = 0 ){;e_bullcntを4で割って0の時、弾発射 e_bullcnt = 0 repeat 3 if e_bull(cnt) = 0 { e_bull(cnt) = 1;弾発射用フラグ e_bull_x(cnt) = (ex + 20);敵機弾x座標 e_bull_y(cnt) = ey;敵機弾y座標 break } loop repeat 3 if e_bull_y(cnt) > 566 : e_bull(cnt) = 0;敵機弾が画面外に出たら、フラグを下す if e_bull(cnt) = 1 { e_bull_y(cnt)+=10 pos e_bull_x(cnt)-9,e_bull_y(cnt)-25;敵機弾座標 color 255,255,255 : gmode 4,,,256 gcopy 4,0,0,50,50;敵機弾描画 } loop } return *user_check if ( abc = 1 ) {;ここです。abc = 1 は適当です u_write = 1 } return *enemy_check if ( abc =1 ) {;ここです。abc = 1 は適当です e_write = 1 } return



この記事に返信する


暇人

リンク

2011/11/15(Tue) 18:57:53|NO.43026

>if (abs(tama_x(i) - enemy_x(cnt)) < 40) & (abs(tama_y(i) - enemy_y(cnt)) < 40): enemy(cnt) = 0

弾座標から敵座標を引いてx,y両方が40未満なら接触として生存フラグクリア
敵座標が大きい場合マイナスになるからabs()で整数に変換
判定範囲にしてる40は衝突判定させたい二つの判定範囲を足して半分にした物
弾が10
敵が30
なら20を使う事になる

tama_x=100 enemy_x=110 mes "tama_x - enemy_x = "+(tama_x - enemy_x) mes "abs(tama_x - enemy_x) = "+abs(tama_x - enemy_x) mes "(abs(tama_x - enemy_x) < 40) = "+(abs(tama_x - enemy_x) < 40) mes "1 & 1 = "+(1 & 1) mes "1 & 0 = "+(1 & 0) mes "0 & 0 = "+(0 & 0)



TSU

リンク

2011/11/16(Wed) 07:31:19|NO.43040


*enemy_check if (abs(bull_x(cnt) - ex) < 40) & (abs(bull_y(cnt) - ey) < 40){ e_write = 1 }

これでやってみたのですが、始めから敵がいません。
なぜなのでしょうか?

教えてください



暇人

リンク

2011/11/16(Wed) 19:36:23|NO.43048

発射もしてない弾と判定してるからでしょ
もう少し自分で書いた部分ぐらいは把握した方が良い
後repeatloop間でも無いのに何故cntを使ってるのか・・・



TSU

リンク

2011/11/17(Thu) 06:35:02|NO.43059

できました!!

ありがとうございました



TSU

リンク

2011/11/17(Thu) 06:35:22|NO.43060

チェック



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