|
|
2012/1/20(Fri) 23:58:16|NO.44427
今hspdxを使ってSTGを作ってます
自機のレーザーのやり方がわからなかったので質問させてください
今はes_apos命令でやっているんですが発射しながら自機が移動すると画像がずれていってしまいます(表現下手でスミマセン)
自機のx座標ぴったりのまま発射できるようにしたいです(永夜抄のアリスのような感じ)
分かりづらいかもしれませんがスミマセン…
|
|
2012/1/21(Sat) 00:12:53|NO.44428
自分で座標管理してes_posで表示すれば良いじゃない。
|
|
2012/1/21(Sat) 01:18:05|NO.44429
>>自分で座標管理してes_posで表示すれば良いじゃない
es_ pos も自分なりにやってみましたがダメでした…
|
|
2012/1/21(Sat) 01:28:20|NO.44430
そのダメだったコードを貼ればいいじゃない
|
|
2012/1/21(Sat) 08:35:00|NO.44431
>es_ pos も自分なりにやってみましたがダメでした…
何がどんな風に駄目なのよ?
|
|
2012/1/21(Sat) 14:51:47|NO.44436
すみません遅れました
if tkey=64{
sdelay=0 //発射間隔
es_exnew sp,5,-1
es_set sp,x+10,y+5,10,1
es_get lx,sp,3
es_get ly,sp,5
lx=x
es_apos sp,0,-5,300
es_pos sp,lx,ly
}
いろいろおかしいかもしれません
すみません・・・
|
|
2012/1/21(Sat) 19:14:46|NO.44438
ふむ。
もし tkeyが64 だったら
sdelay(発射間隔)を0にする
新しいスプライト番号を SP に受け取る。->検索開始番号は5から。es_newモードで。
番号SPのスプライトを登録。->X座標はX+10、Y座標はY+5、キャラクタ番号10、描画モードはダイレクト3D
変数LXに番号SPのスプライト情報を取得。->スプライトのX座標。
変数LYに番号SPのスプライト情報を取得。->スプライトのY座標。
変数LXの値を、変数Xと同じにする。
番号SPのスプライトのフレーム毎移動量を設定する。->毎フレームX方向に0、y方向に-5、・・・の300%(3倍の移動量)
番号SPのスプライトの表示位置を指定する。->座標、LX,LY
位置合わせするのが、撃った瞬間だけでは、
自機の移動に追従する訳無かろうに?
|
|
2012/1/21(Sat) 20:27:12|NO.44441
es_type で発射時に弾の識別タイプを設定し
es_find で弾タイプに設定したスプライトが存在するか検索
存在してたら毎フレーム下に書いたスクリプト
es_get ly,sp,5
es_pos sp,x+10,ly
を続ける
|
|
2012/1/21(Sat) 20:40:00|NO.44443
1・フレーム毎に
2・有効に為っている全スプライトからes_getで弾(キャラクタ番号10)を探して
3・弾と同じキャラクタのスプライトのx座標を自機に合わせれば良いんでね?
|
|
2012/1/21(Sat) 21:13:45|NO.44444
if tkey=64{
sdelay=0
es_exnew sp,5,-1
es_set sp,x+10,y+5,10,1
es_type sp,2
es_find lf,2
if lf!=-1{
es_get ly,sp,5
es_pos sp,x+10,ly
}
}
type値を使ったことがなかったのでヘルプを見ながら書いてみませたがダメでした…
どこかおかしいでしょうか?
|
|
2012/1/21(Sat) 21:19:52|NO.44445
位置合わせするのが、撃った瞬間だけでは、
自機の移動に追従する訳無かろうに?
・・・と、言ったはずなんだが・・・。
もしかして、
「hspdxにはきっと弾が自機に追従するモードが有って、
設定ひとつで自動でやってくれるに違いない!」
とか、勘違いしてやしないかね。
|
|
2012/1/21(Sat) 21:33:22|NO.44446
hspdxには
「弾スプライトのx座標を時期x座標に自動で合わせる」
なんて機能はないからな。
無い物は自分で実装するしかないぞ。
type値を使うなら
es_type,es_find,es_get,es_pos
これらの命令を駆使すれば出来る。
他に使いそうなのはif文とループ系命令(whileかそのへんだな)位だろう
1・弾には、最初の登録時にtype値を決めておく
2・表示する前に、全弾に付いて位置合わせを行なう。
2−1・検索開始番号を0にする(最初から探す)
2−2・ループ開始。es_findで検索開始番号から、弾を探す。無ければループを抜ける。
2−3・見つかった弾のX座標を自機に合わせる。
2−4・検索開始位置を、今見つけた弾の次の番号にする
2−5・2−2へ戻る
これが考え方だ。
まあ、やってみれ。
|
|
2012/1/21(Sat) 21:42:55|NO.44447
NO.44444は暇人さんのアドバイスを元にやってみました
|
|
2012/1/21(Sat) 21:56:47|NO.44448
伝わらなかった/伝わり難かった/言葉が足りなかった
かもしれんが、
実際にはそのアドバイスは44446の様な事を言っていたのじゃよ・・・
|
|
2012/1/21(Sat) 21:58:29|NO.44449
ちなみに、「表示前」ってのは、es_sync前って意味な。
|
|
2012/1/21(Sat) 22:03:06|NO.44451
>es_type sp,2
これは発射時だけで良いけど
es_find lf,2
if lf!=-1{
es_get ly,sp,5
es_pos sp,x+10,ly
}
の部分は毎フレーム必要だと書いたんだが・・・
if tkey=64{があるからtkeyが64の時しか上のは実行されないでしょ
後es_find lf,2でlfにスプライトNO代入されるからspをlfに変えるとかしないと間違いの元
|
|
2012/1/21(Sat) 22:04:24|NO.44452
すみません自分はまだまだ初心者なのでいろいろ間違っているかもしれませんが
>>2−1・検索開始番号を0にする(最初から探す)
sp=0ってことですか?
>>2−2・ループ開始。es_findで検索開始番号から、弾を探す。無ければループを抜ける。
type2で検索して、spが-1以外なら繰り返し
こんな感じですか?
また
>>2−3・見つかった弾のX座標を自機に合わせる。
>>2−4・検索開始位置を、今見つけた弾の次の番号にする
がわかりません…
無知ですみません
|
|
2012/1/21(Sat) 22:14:40|NO.44453
>>2−1・検索開始番号を0にする(最初から探す)
> sp=0ってことですか?
他で使ってない変数なら何でもいい。
わかりやすい名前付けとけよ。
>>2−2・ループ開始。es_findで検索開始番号から、弾を探す。無ければループを抜ける。
> type2で検索して、spが-1以外なら繰り返し
そうだ!そんな感じだ!!
>>2−3・見つかった弾のX座標を自機に合わせる。
>>2−4・検索開始位置を、今見つけた弾の次の番号にする
>がわかりません…
2-3は、それこそ「参考にした」と言う44441と同じ話やんか。
2-4は、何が分らんのか分らん。
まず、思うサマにスクリプト書いて見れ。
そしてそれを見せなさい。
そうすれば俺でなくても誰かが間違いを指摘してくれる。
口で分らん分らん言うだけでは、こちらが「何が分らんのか分らん」わ。
俺らエスパーじゃねえからな。
「さあ、ボクが分ってないところは、どこでしょう!?」
とか、クイズ形式の質問されても困るんだ。
まずお前がどんな風に分ってないのか、現物見せろ。
|
|
2012/1/21(Sat) 22:16:05|NO.44454
>>暇人さん
es_find lf,2
if lf!=-1{
es_get ly,lf,5
es_pos lf,x+10,ly
}
if tkey=64{
es_set lf,x+10,y+5,10,1
es_type lf,2
es_apos lf,0,-5
}
spをlfに直してみました
本当、無知ですみません
|
|
2012/1/21(Sat) 22:26:44|NO.44455
NO.44454のは惜しい・・・
es_exnew はどこ行った・・・
|
|
2012/1/21(Sat) 22:28:17|NO.44456
>>f(現実逃避中)さん
ない頭をひねってみましたがダメでした・・・
if tkey=64{
lzr=0
repeat
es_find lzr,2
if lzr=-1:break
es_get ly,lzr,5
es_pos lzr,x+10,ly
lzr++
loop
}
|
|
2012/1/21(Sat) 22:36:13|NO.44457
>>暇人さん
es_exnew lf
es_find lf,2
if lf!=-1{
es_get ly,lf,5
es_pos lf,x+10,ly
}
if tkey=64{
es_set lf,x+10,y+5,10,1
es_type lf,2
es_apos lf,0,-5
}
こうですか?… es_exnewを入れる場所がわかりません…
|
|
2012/1/21(Sat) 22:44:04|NO.44458
NO.44436でちゃんとレーザー発射時にes_exnewを使ってるじゃん・・・
|
|
2012/1/21(Sat) 22:46:26|NO.44459
>>暇人さん
es_find lf,2
if lf!=-1{
es_get ly,lf,5
es_pos lf,x+10,ly
}
if tkey=64{
es_exnew lf
es_set lf,x+10,y+5,10,1
es_type lf,2
es_apos lf,0,-5
}
やはりうまくいきません…
|
|
2012/1/21(Sat) 22:55:29|NO.44460
NO.44459ので画面上1発なら上手く行くはずだから書き込んでない部分に問題ある
上手く行ってない内容を詳しく
弾が出ないとか自機と同じx座標にならないとか
|
|
2012/1/21(Sat) 22:59:32|NO.44461
・・・・。
なるほど。
とりあえず、
「発射」
と、
「弾の位置調整」
は、別々の処理だ。
分けろ。
44459のがイイ感じだ。
弾検索を、「全部の弾」について処理できるように改造するんだ。
|
|
2012/1/21(Sat) 23:01:26|NO.44462
>>暇人さん
自機と同じx座標になりませんし、あと説明しにくいですが
自機の上にレーザーの画像が1つだけ別に表示されていて自機が右に行くほどそれが下がってきて
左に行くと上に上がって行きます
|
|
2012/1/21(Sat) 23:04:40|NO.44463
>>f(現実逃避中)さん
とりあえず
発射
弾の位置調整でラベル分けしました
>>弾検索を、「全部の弾」について処理できるように改造するんだ
これがいまいちやり方がわかりません。。。
|
|
2012/1/21(Sat) 23:07:16|NO.44464
>>暇人さん
説明が悪かったので訂正します
レーザーの画像が1つだけ自機のx座標にあわせて動いてくれますが、他は今まで通りです
|
|
2012/1/21(Sat) 23:12:53|NO.44465
>>弾検索を、「全部の弾」について処理できるように改造するんだ
>これがいまいちやり方がわかりません。。。
ループだ。
ループを使うんだ。
repeatでもできるがwhile等も便利だぞ。
ループの抜け条件は、検索結果が-1になったらと分っているのだろう?
何れにしろループしない事には実現できん。
頑張れ。
|
|
2012/1/21(Sat) 23:17:47|NO.44466
NO.44464
じゃ、1発は成功してるんだよね?
ならes_findを複数検索できるようにすれば良いだけ
NO.44456のはちょっと惜しい
NO.44459のと組み合わせる感じ
es_findには検索開始NOが指定できるけどNO.44456のはしてない
せっかくループ前にlzr++してるのに無意味に・・・
|
|
2012/1/21(Sat) 23:27:53|NO.44467
実際、44456の
lzr=0
repeat
es_find lzr,2
if lzr=-1:break
es_get ly,lzr,5
es_pos lzr,x+10,ly
lzr++
loop
は、ほぼ正解なんだ。
「ほぼ」だから、誤りは有るがな。
es_findの説明をよく読むんだ。
|
|
2012/1/21(Sat) 23:36:59|NO.44468
>>f(現実逃避中)さん
if tkey=64{
lf=0
es_exnew lf
es_set lf,x+10,y+5,10,1
es_type lf,2
es_apos lf,0,-5,300
}
return
*弾の位置調整
repeat
es_find lf,2
if lf=-1:break
es_get ly,lf,3
es_pos lf,x+10,ly
lf++
loop
return
こんな感じにしてみたのですがフリーズしてしまいます…
|
|
2012/1/21(Sat) 23:39:30|NO.44469
それは、
es_findの結果の値が何時までも変わらないから、
ループから抜けられないでいるんだ。
まず、
>es_find lf,2
この、2は何故2なんだ?
|
|
2012/1/21(Sat) 23:42:07|NO.44470
>>f(現実逃避中)
自機弾のtype値のつもりです
|
|
2012/1/21(Sat) 23:43:25|NO.44471
ちがった、その2はいいんだ。
すまん。
es_findでは、「その次」に指定できる値が有るだろう?
よく説明を読むんだ。
|
|
2012/1/21(Sat) 23:43:47|NO.44472
スプライト検索
es_find p1,p2,p3,p4,p5
p1=スプライトNo.が代入される変数名
p2=検索対象となるtype値
p3=検索を開始するスプライトNo.
p4=検索を終了するスプライトNo.
p5=増分
> 検索は、p3で指定されたスプライトNo.からp4で指定されたNo.まで順番に探していきます。
> これを省略すると、No.0からすべてのスプライトを検索します。
>せっかくループ前にlzr++してるのに無意味に・・・
・・・・・・
|
|
2012/1/21(Sat) 23:49:53|NO.44473
if tkey=64{
lf=0
es_exnew lf
es_set lf,x+10,y+5,10,1
es_type lf,2
es_apos lf,0,-5,300
}
return
*弾の位置調整
repeat
es_find lf,2,lf
if lf=-1:break
es_get ly,lf,3
es_pos lf,x+10,ly
lf++
loop
return
こうですか?
|
|
2012/1/21(Sat) 23:52:33|NO.44474
聞く前に実行すりゃ分るだろうが・・・
まあ、場合によってはそれで動くかもしれんが、
恐らく駄目だろ?
俺が「ほぼ正解」と言った物と、違いが有る。
もう一息だ。
|
|
2012/1/21(Sat) 23:53:46|NO.44475
>>f(現実逃避中)さん
おっしゃるとおりダメでした
どこが悪いのか自分にはさっぱりです・・・
|
|
2012/1/21(Sat) 23:54:20|NO.44476
ヒントは、
「そのlfは、repeatに入る時にはどんな値に為ってるんだ?」
だ。
|
|
2012/1/21(Sat) 23:59:24|NO.44477
>>f(現実逃避中)さん
lfは0になってますよね…
ここに問題があるんですか?
全然わかりません
|
|
2012/1/22(Sun) 00:02:08|NO.44478
いやあ、なって無いと思うな。
だってお前、
>es_exnew lf
で、lfの値変えてんじゃん。
最後に登録した弾だけ検索にヒットしてんじゃね?
|
|
2012/1/22(Sun) 00:05:30|NO.44479
>>es_exnew lf
を消してみましたが今度は出なくなってしまいました
|
|
2012/1/22(Sun) 00:08:11|NO.44480
そっちじゃねー
何でループに入る前に0にしようと思わないだ・・・
|
|
2012/1/22(Sun) 00:11:20|NO.44481
そりゃ、新しいスプライト登録番号取得をやめれば、
表示されないに決まってるだろ・・・
ループ前に、変数を初期化しろよ・・・。
|
|
2012/1/22(Sun) 00:16:38|NO.44483
すみませんでした…
if tkey=64{
es_exnew lf
es_set lf,x+10,y+5,10,1
es_type lf,2
es_apos lf,0,-5,300
}
return
*弾の位置調整
lf=0
repeat
es_find lf,2,lf
if lf=-1:break
es_get ly,lf,3
es_pos lf,x,ly
lf++
loop
return
こうですかね?
うまくいかなかったのでまた間違えてると思います
ごめんなさい
|
|
2012/1/22(Sun) 00:20:13|NO.44484
何でいつの間にか
>es_get ly,lf,3
になってるの?
3はx座標でしょ
|
|
2012/1/22(Sun) 00:21:15|NO.44485
よし、形になったな。
次は
>es_get ly,lf,3
es_getの3つ目の引数が3に為っているが
マニュアルによれば「3」で取得できるのは「X座標」だ。
lfのスプライトのx座標を、lyに受けているようだが
そのX座標を
>es_pos
で、Y座標に登録しているぞ。
|
|
2012/1/22(Sun) 00:26:19|NO.44486
サブルーチン分けした時に間違ったんだな・・・
|
|
2012/1/22(Sun) 00:27:17|NO.44487
>>f(現実逃避中)さん
>>暇人さん
できました!!
ありがとうございます!!
最後は自分でも馬鹿馬鹿しいと思うほど初歩的なミスでした
こんな自分に丁寧かつ迅速に教えていただきありがとうございます
感謝の気持ちでいっぱいです
|
|
2012/1/22(Sun) 00:31:06|NO.44488
ふむ、出来たか。
よかったよかった。
|
|
2012/1/22(Sun) 00:33:15|NO.44489
乙
解決チェックしてけw
|
|
2012/1/22(Sun) 00:33:22|NO.44490
>>f(現実逃避中)さん
>>暇人さん
お二人とも本当にありがとうございました
機会があったら是非またご教授願いたいです
また見かけたらその時はアドバイスしてやってくれたら嬉しいです
長時間お付き合いいただきありがとうございました
|
|