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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0120
ラクタンシェSTGのレーザーの表現について53解決


ラクタンシェ

リンク

2012/1/20(Fri) 23:58:16|NO.44427

今hspdxを使ってSTGを作ってます
自機のレーザーのやり方がわからなかったので質問させてください

今はes_apos命令でやっているんですが発射しながら自機が移動すると画像がずれていってしまいます(表現下手でスミマセン)

自機のx座標ぴったりのまま発射できるようにしたいです(永夜抄のアリスのような感じ)

分かりづらいかもしれませんがスミマセン…



この記事に返信する


f(現実逃避中)

リンク

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

そのダメだったコードを貼ればいいじゃない



f(現実逃避中)

リンク

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 }
いろいろおかしいかもしれません
すみません・・・



f(現実逃避中)

リンク

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
を続ける



f(現実逃避中)

リンク

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値を使ったことがなかったのでヘルプを見ながら書いてみませたがダメでした…
どこかおかしいでしょうか?



f(現実逃避中)

リンク

2012/1/21(Sat) 21:19:52|NO.44445

位置合わせするのが、撃った瞬間だけでは、
自機の移動に追従する訳無かろうに?

・・・と、言ったはずなんだが・・・。


もしかして、

「hspdxにはきっと弾が自機に追従するモードが有って、
 設定ひとつで自動でやってくれるに違いない!」

とか、勘違いしてやしないかね。



f(現実逃避中)

リンク

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は暇人さんのアドバイスを元にやってみました



f(現実逃避中)

リンク

2012/1/21(Sat) 21:56:47|NO.44448

伝わらなかった/伝わり難かった/言葉が足りなかった

かもしれんが、
実際にはそのアドバイスは44446の様な事を言っていたのじゃよ・・・



f(現実逃避中)

リンク

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・検索開始位置を、今見つけた弾の次の番号にする
がわかりません…
無知ですみません



f(現実逃避中)

リンク

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座標にならないとか



f(現実逃避中)

リンク

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座標にあわせて動いてくれますが、他は今まで通りです



f(現実逃避中)

リンク

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++してるのに無意味に・・・



f(現実逃避中)

リンク

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
こんな感じにしてみたのですがフリーズしてしまいます…



f(現実逃避中)

リンク

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値のつもりです



f(現実逃避中)

リンク

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
こうですか?



f(現実逃避中)

リンク

2012/1/21(Sat) 23:52:33|NO.44474

聞く前に実行すりゃ分るだろうが・・・
まあ、場合によってはそれで動くかもしれんが、
恐らく駄目だろ?

俺が「ほぼ正解」と言った物と、違いが有る。
もう一息だ。



ラクタンシェ

リンク

2012/1/21(Sat) 23:53:46|NO.44475

>>f(現実逃避中)さん
おっしゃるとおりダメでした
どこが悪いのか自分にはさっぱりです・・・



f(現実逃避中)

リンク

2012/1/21(Sat) 23:54:20|NO.44476

ヒントは、

「そのlfは、repeatに入る時にはどんな値に為ってるんだ?」

だ。



ラクタンシェ

リンク

2012/1/21(Sat) 23:59:24|NO.44477

>>f(現実逃避中)さん
lfは0になってますよね…
ここに問題があるんですか?
全然わかりません



f(現実逃避中)

リンク

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にしようと思わないだ・・・



f(現実逃避中)

リンク

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座標でしょ



f(現実逃避中)

リンク

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(現実逃避中)さん
>>暇人さん
できました!!
ありがとうございます!!
最後は自分でも馬鹿馬鹿しいと思うほど初歩的なミスでした
こんな自分に丁寧かつ迅速に教えていただきありがとうございます
感謝の気持ちでいっぱいです



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(現実逃避中)さん
>>暇人さん

お二人とも本当にありがとうございました

機会があったら是非またご教授願いたいです

また見かけたらその時はアドバイスしてやってくれたら嬉しいです

長時間お付き合いいただきありがとうございました



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