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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0221
リュウHSPDXFIXでの弾幕STGについて6未解決


リュウ

リンク

2014/2/21(Fri) 23:51:25|NO.60177

HSPのHSPDXFIXで、下記のURLの
https://www.youtube.com/watch?v=Nr79KW9xdzI
の32秒から59秒当たりの二つの弾幕を再現したいんですが、うまくできません。
一つは最初の「三方向に撃って真ん中が自機を狙う弾」です。
要するに3wayの自機狙いです。
もう一つは「一つの弾を何個も繋げて、それを円形に発射する」です。
動画の44秒あたりから撃たれている弾幕のことです。
まだ知識が浅く、わからないところが多くあるので
よろしくお願いします。



この記事に返信する


暇人

リンク

2014/2/22(Sat) 05:38:34|NO.60182

>うまくできません。
どううまく出来ないのか詳しく

自機の方向を取得
目的の方向に弾を移動させる
同時に複数発射
特定の回数間隔を開けて発射

必要な処理はこんな感じだが、どこが分からない?

因みに自機の方向を取得、目的の方向に弾を移動させるは
HSPDXにそのまま使える命令がある



MillkeyStars

リンク

2014/2/22(Sat) 08:39:35|NO.60186

円弾については、自身で解決してるのでそれを応用すればいいのでは?

追尾弾は、自機に対して、座標計算すればいいだけ。
自機が 320,240 にあって、弾が初期座標 240,160 で目的座標 320,240 の場合、
x320-240 = 80 : y240-160 = 80 を計算し、あとそれにフレーム速度を割り出せばいい。
初期位置 240,160 から 30フレーム で自機到達すると仮定すると
x80 / 30 = 2.667 : y80 / 30 = 2.667
上記フレーム速度が算出できたら、それを弾位置に加算すればいい。

そうすれば、追尾弾の完成。
自機の移動と同時に弾も一緒についてくるなどの場合、一定フレームで再計算すればいい。
そうすれば、無限についてくる追尾弾もできる。

最初から難しいように考えようとするからできないのであって、まずは一個の弾を作ってみようね。
一個の弾ができたら、それをいろいろな動きができるように改良してみよう。



リュウ

リンク

2014/2/22(Sat) 13:08:03|NO.60191

>暇人さん
自機を狙ったショットは、es_aimでできたんですが
それをどうやっても3方向に撃てないんです。
実際は撃つことはできるんですが、なんというか…
きれいに間隔を開けることができないんです。
なんか左側に二つの弾が固まってしまっているんです。
なので同時に複数発射ができません。
そこの処理を教えていただければ嬉しいです。
よろしくお願いします。
>MillkeyStarsさん
円弾に関しては撃つことはできます。
しかし、応用に仕方が分からず…
できればその応用の仕方を教えてくださいませんか?



暇人

リンク

2014/2/22(Sat) 15:26:01|NO.60192

>自機を狙ったショットは、es_aimでできたんですが
es_aimは座標に向けて移動させる命令で今回の目的には適してない

>自機の方向を取得
>目的の方向に弾を移動させる
ここで言ってるように「方向」を取得指定して動かせれば簡単に3方向も出来る

>HSPDXにそのまま使える命令がある
具体的には

角度取得
es_ang p1,p2,p3,p4

スプライト移動方向設定
es_adir p1,p2,p3

この二つの命令

es_ang ex,ey,mx,my ang=stat-5 //HSPDXの角度は初期設定だと360度を64分割してるので 5は(360.0/64)*5=28.125度になる(度の分割数はes_iniで最初に設定できる) repeat 3 es_new bid if bid<0 {break} es_set bid,ex,ey,弾キャラクタNo,1 es_adir bid,ang+5*cnt,500 //自機方向から-5を引いてるので2発目で+5されて自機方向に飛ばして、次の弾で更に+5ずれる loop

円状の弾幕もes_adirで簡単に出来る

>特定の回数間隔を開けて発射
これは弾発射状態をカウントする変数を作って管理

たとえばカウントする変数をbtcntとした場合
btcntが0で弾発射状態になったら btcnt=50 とし
実際に弾を発射するタイミングは

if btcnt>0 {//弾発射状態中 if (btcnt\10)=0 {//10で割った余りが0なら(初期値が50なので10カウント毎に5回発射する) // ここに発射処理 } btcnt-1 //カウンタを減らす }
こんな感じ

複数敵を出したい場合はbtcntを配列にして管理する



暇人

リンク

2014/2/22(Sat) 18:36:03|NO.60196

スプライトIDをカウンタのIndexとして使って管理するとこんな感じ


#include "hspdx.as" es_ini 1024,1024,360 ; 角度の分割を360に設定 es_screen 640,480,32,,1,1 ; スクリーン初期化 if stat : end *start boxf font msgothic, 31, 1 color 0,255,255 mes "自" color 128,255,0 mes "A" color 255,128,0 mes "B" color 0,255,0 mes "●"; 弾A color 255,0,255 mes "・"; 弾B es_buffer 0,2,,,1 if stat : rnd es_size 32,32,60 es_pat 0, 0,0 ; 自 es_pat 1, 0, 32 ; 敵A es_pat 2, 0, 32*2 ; 敵B es_pat 3, 0, 32*3 ; 弾A es_pat 4, 0, 32*4 ; 弾B gsel 0,1 es_cls es_sync wait 100 myx=200:myy=400 es_set 0,myx,myy,0,1 ; メインのスプライト es_type 0,1 //自機のタイプを1 es_new enid,1 es_set enid,50,50,1,1 es_type enid,2 //敵Aのタイプを2 b_tcnt(enid)=0 //弾の発射準備カウンタ初期化 es_new enid,1 es_set enid,600,50,2,1 es_type enid,4 //敵Bのタイプを4 b_tcnt(enid)=0 *main stick ky,$1f if ky&1 : myx-=8 if ky&4 : myx+=8 if ky&2 : myy-=8 if ky&8 : myy+=8 enid=1//検索開始ID repeat es_find enid,2+4,enid if enid<0 {break} if b_tcnt(enid)=0 {//現在弾は出してない es_get type,enid,13 if type=2 {//敵Aだった if rnd(100)>95 {//100分の5で弾発射準備 es_get enx,enid,3 es_get eny,enid,5 es_ang enx-16,eny-16,myx-16,myy-16 b_ang(enid)=stat-25 //自機の方向から-25度ずらす b_fps(enid)=10 //10フレーム毎に発射(必ず1以上を設定) b_tcnt(enid)=5*b_fps(enid) //5初発連続発射 } }else{//敵Bだった if rnd(1000)>980 {//1000分の20で弾発射準備 es_get enx,enid,3 es_get eny,enid,5 es_ang enx-16,eny-16,myx-16,myy-16 b_ang(enid)=stat+3//自機の方向から3度ずらして弾が直接自機を狙わないように b_fps(enid)=5 //5フレーム毎に発射(必ず1以上を設定) b_tcnt(enid)=4*b_fps(enid) //4発連続発射 } } } if b_tcnt(enid) { gosub *Fire :b_tcnt(enid)--}//弾発射処理 enid++ //同じIDを検索しないように+1(これを忘れると無限ループになる) loop if ky&$80 : goto *owari es_pos 0,myx,myy es_cls 0,70,60 es_draw es_sync 16 await 0 goto *main //弾発射処理 *Fire es_get type,enid,13 es_get enx,enid,3 es_get eny,enid,5 if type=2 { if (b_tcnt(enid)\b_fps(enid))=0 {//b_tcnt(enid)/b_fps(enid)の余りが0なら発射 repeat 3 es_new a,2 if a<0{break} es_set a,enx,eny,3,1 es_type a,16 es_adir a,b_ang(enid)+cnt*25,500//+25ずつずらして指定 loop } }else{ if (b_tcnt(enid)\b_fps(enid))=0 { repeat 60 es_new a,2 if a<0{break} es_set a,enx,eny,4,1 es_type a,16 es_adir a,b_ang(enid)+cnt*6,300//6度ずつずらして指定 loop } } return *owari es_bye end



aaa

リンク

2014/4/13(Sun) 02:40:59|NO.61532

stat変数使えばOK



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