毎度毎度質問ばかりで申し訳ございません…
例によって永夜抄での使い魔らしきものを作ろうと思ったのですが
足掻いてもできなかったので再びご教授願おうと思ってきた次第であります。
龍神録プログラミングの館26章から以下のように改変してきたのですが…。
1・使い魔の構造体を作る(内容はフラグ、x座標、y座標)
*SERVANT_MAX(定数10)によって10個ほど作りました。
2・関数search_servantで空き番号を探させる
使い方はsearch_boss_shotなどと同じで手当たり次第空き番号を探し、
空いていた番号を返り値として渡します
3・関数(void)summonと(int)summon_callで呼べるようにする
input_phy関数とinput_phy_pos関数が非常に便利そうだったのでやろうと思ったのですが…
summon_call(double x,double y)と呼び出すことでフラグを1にし、x座標をx,y座標をyに設定します。
summon_callの中で関数summonを実行するだけで返り値は求めてません。
さて、問題なのは2と3を如何につなぐか、ということです。
一つだけ出すのならsummon_callだけでどうにかなるのですが、
二つ以上出す場合、どうしていいのか分からなくなってしまいます。
拙い文章で分かりにくい点が多いと思いますが
ご指導お願いします・・・
永夜抄の使い魔のような物の作り方
Re:永夜抄の使い魔のような物の作り方
>>THさん
永夜抄やっておいてなんですが、
使い魔と言うのが良く分からないのでイメージできませんでした;
それは置いといて、気になったので質問なのですが、
「一つの使い魔を呼ぶ場合」と「二つ以上の使い魔を呼ぶ場合」の違いと言うのは何でしょうか?
配列の空きを検索して、空きがあるのなら summon_call を呼び出し、
フラグを立て、x, y座標を設定するのですよね?
二つ以上でも変わらないように感じるのですが、なにか特別な設定がいるのでしょうか;
それと、summon_callの中で呼ばれる関数、summonとは具体的に何をするのでしょうか?
特にこちらが解らなくても大丈夫な関数でしょうかね;
理解力乏しくて申し訳ないです;
永夜抄やっておいてなんですが、
使い魔と言うのが良く分からないのでイメージできませんでした;
それは置いといて、気になったので質問なのですが、
「一つの使い魔を呼ぶ場合」と「二つ以上の使い魔を呼ぶ場合」の違いと言うのは何でしょうか?
配列の空きを検索して、空きがあるのなら summon_call を呼び出し、
フラグを立て、x, y座標を設定するのですよね?
二つ以上でも変わらないように感じるのですが、なにか特別な設定がいるのでしょうか;
それと、summon_callの中で呼ばれる関数、summonとは具体的に何をするのでしょうか?
特にこちらが解らなくても大丈夫な関数でしょうかね;
理解力乏しくて申し訳ないです;
Re:永夜抄の使い魔のような物の作り方
>>BEMANIさん
使い魔…ボスが出してくる高速時は丸い玉、低速時には魔方陣のような姿をしている物体です。
ボスとは別に弾を撃ってくるやつですね。
試行錯誤を重ねたらややこしくなってしまい、初期の質問と条件が違うのですが…
一つの使い魔を出す場合、servant[n](コレは構造体、.x や .flagに続く)のnの中が
一つに固定されるのでsummon_call(x,y)で呼び出した後、
boss_shot.bullet[k].x boss_shot.bullet[k].y(龍神録プログラムより、弾の初期位置)にservant[n]の
x座標、y座標を入れることで、そこから弾を出すことができます。
一方で二つ以上の使い魔を出す時、servant[n]のnは(二つ出す場合は)0と1の二つに分かれます。
少し話が離れますが
summon_call(x,y)ではservant[n]のフラグを1(オン)にし、
summon(double x,double y,int n)を呼び出します。
このsummonの中のxはsummon_callのx、yはsummon_callのy、nはsearch_servantで空いていた番号で、
summon関数ではservant[n]のx座標、y座標にsummon_call(x,y)を呼び出したときに使ったx,yを代入します。
他にやり方がわからないので二つ以上呼び出すときには例として以下のようにします
summon(FX+10,ch.y); (画面左端で自機と同じ高さ)
summon(FMX-10,ch.y); (画面右端で自機と同じ高さ)
二つ並べて書いています。(コレでいいのかさえ分からない…)
summonでの返り値をn(空いているservant[n]のnの値)とし、
boss_shot.bullet[k]のx座標、y座標にservant[n]を指定した時、二つ並べて書いているために
下のsummon(FMX-10,ch.y)の返り値だけが適用されるため、弾の発射場所がすべて右側になってしまいました…。
と、カッコで補足を加えて結局グダグダになってしまったのですが…。
質問をまとめると
・二つ以上のservant[n]が存在するとき、boss_shot.bullet[k]のx座標、y座標を二つのservant[n]にあわせたい。nの値をどうすればいいか。
ということです…。
前回の投稿で弾を出したいと書いてなかったのでまったく違う質問になってしまった気がします。
本当に申し訳ございません…
使い魔…ボスが出してくる高速時は丸い玉、低速時には魔方陣のような姿をしている物体です。
ボスとは別に弾を撃ってくるやつですね。
試行錯誤を重ねたらややこしくなってしまい、初期の質問と条件が違うのですが…
一つの使い魔を出す場合、servant[n](コレは構造体、.x や .flagに続く)のnの中が
一つに固定されるのでsummon_call(x,y)で呼び出した後、
boss_shot.bullet[k].x boss_shot.bullet[k].y(龍神録プログラムより、弾の初期位置)にservant[n]の
x座標、y座標を入れることで、そこから弾を出すことができます。
一方で二つ以上の使い魔を出す時、servant[n]のnは(二つ出す場合は)0と1の二つに分かれます。
少し話が離れますが
summon_call(x,y)ではservant[n]のフラグを1(オン)にし、
summon(double x,double y,int n)を呼び出します。
このsummonの中のxはsummon_callのx、yはsummon_callのy、nはsearch_servantで空いていた番号で、
summon関数ではservant[n]のx座標、y座標にsummon_call(x,y)を呼び出したときに使ったx,yを代入します。
他にやり方がわからないので二つ以上呼び出すときには例として以下のようにします
summon(FX+10,ch.y); (画面左端で自機と同じ高さ)
summon(FMX-10,ch.y); (画面右端で自機と同じ高さ)
二つ並べて書いています。(コレでいいのかさえ分からない…)
summonでの返り値をn(空いているservant[n]のnの値)とし、
boss_shot.bullet[k]のx座標、y座標にservant[n]を指定した時、二つ並べて書いているために
下のsummon(FMX-10,ch.y)の返り値だけが適用されるため、弾の発射場所がすべて右側になってしまいました…。
と、カッコで補足を加えて結局グダグダになってしまったのですが…。
質問をまとめると
・二つ以上のservant[n]が存在するとき、boss_shot.bullet[k]のx座標、y座標を二つのservant[n]にあわせたい。nの値をどうすればいいか。
ということです…。
前回の投稿で弾を出したいと書いてなかったのでまったく違う質問になってしまった気がします。
本当に申し訳ございません…
Re:永夜抄の使い魔のような物の作り方
自分が作成したものでは
boss_shotの構造体の中に bullet_t assist[BOSS_ASSIST_MAX]; を追加して弾のように軌道を計算しました。 物理的に動かす場合は input_phy関数に登録番号を渡してやればできました。 高速か低速かで変化させたいのであれば、キャラが高速中のときは1になる変数を作って アシストに当たり判定をつけてやればいいと思います。(あと、弾の種類の変更も array様の龍神録の支館の 「アシストを作ってみる」 が参考になると思いますので、是非一度見られてはいかがですか?
Re:永夜抄の使い魔のような物の作り方
>>THさん
あの透明になるやつですか・・・(合ってるかな)
やりたいことってこの、添付ファイルのようなもので合ってますか?
そうであるという前提でお話します。
↓サンプルソースを書いていました
使い魔を生成し、弾の座標が使い魔の位置になります。
SetServentBullet(GetCreateServent());
SetServentBullet()の引数が、GetCreateServentの戻り値です。
この戻り値と言うのは、上にも書いてますが使い魔が生成された番号です。
その番号を元に、servent[n].x と servent[n].y を弾の座標に格納します。
後はこの弾を動かせば、使い魔から弾発射されたようになると思います。
注意としては、使い魔が生成された瞬間、弾がセットされるということです。
時間をおいて発射させたいなら、別途THさんで拡張させてみて下さいませ。
こんなので大丈夫でしょうか・・・?
あの透明になるやつですか・・・(合ってるかな)
やりたいことってこの、添付ファイルのようなもので合ってますか?
そうであるという前提でお話します。
↓サンプルソースを書いていました
//************************************************************ // 使い魔を生成し、その作成された番号を返す // 引数 : なし // 戻り値 : 生成された使い魔の番号 //************************************************************ int GetCreateServent(void) { for(int n=0; n<使い魔の最大数; n++) { if(配列が空いていれば) { 使い魔を生成する(); return n; } } return 使い魔の最大数+1; // 配列に空きがなかった } //************************************************************ // 使い魔の位置に弾を生成する // 第一引数 : 生成された使い魔の番号 // 戻り値 : なし //************************************************************ void SetServentBullet(int n) { for(int k=0; k<弾の最大数; k++) { if( boss_shot_bulletの空きを検索する() && n<使い魔の最大数 ) { // 配列が空いていれば弾の座標を使い魔の位置へ格納 boss_shot_bullet[k].x = servent[n].x; boss_shot_bullet[k].y = servent[n].y; } } }あとは、下のように呼ぶだけで、
使い魔を生成し、弾の座標が使い魔の位置になります。
SetServentBullet(GetCreateServent());
SetServentBullet()の引数が、GetCreateServentの戻り値です。
この戻り値と言うのは、上にも書いてますが使い魔が生成された番号です。
その番号を元に、servent[n].x と servent[n].y を弾の座標に格納します。
後はこの弾を動かせば、使い魔から弾発射されたようになると思います。
注意としては、使い魔が生成された瞬間、弾がセットされるということです。
時間をおいて発射させたいなら、別途THさんで拡張させてみて下さいませ。
こんなので大丈夫でしょうか・・・?
Re:永夜抄の使い魔のような物の作り方
私は敵機の構造体をそのまま使い魔にも使えるようにしてますね。行動パターンも敵と同じように設定できます
「コースに敵機を配置する関数」があるのですがそれをちょっといじって「敵が敵を配置する関数」みたいにしてます
敵機と使い魔はお互いの構造体配列ポインタを持っているのでどちらかが消えたら両方消えるとか、敵の周りを使い魔が回転するといったことも可能です
使い魔も敵機なのでHPの設定や射撃、当たり判定のサイズや有無も自由です
私のコードは龍神録とはまったく違う形になっていると思うので概念だけ説明させていただきました…^^;
「コースに敵機を配置する関数」があるのですがそれをちょっといじって「敵が敵を配置する関数」みたいにしてます
敵機と使い魔はお互いの構造体配列ポインタを持っているのでどちらかが消えたら両方消えるとか、敵の周りを使い魔が回転するといったことも可能です
使い魔も敵機なのでHPの設定や射撃、当たり判定のサイズや有無も自由です
私のコードは龍神録とはまったく違う形になっていると思うので概念だけ説明させていただきました…^^;
Re:永夜抄の使い魔のような物の作り方
>>yuさん
支館があっただなんて…!
なるほど、弾のように計算する方法があったとは…
ご回答ありがとうございました。
>>BEMANIさん
戻り値で使い魔の番号を指定できましたか…
言われてみれば他の処理でもそうなっているみたいですね…
わざわざサンプルまで作っていただきありがとうございました。
>>めいらるさん
「敵が敵を配置する関数」…非常に便利そうですけど
そんな事ができる技術は無さそうですorz
ですが考え方としては非常に有用そうです。いづれそのような物を作ってみたいですね…
ご回答、ありがとうございました。
皆様のおかげで無事解決できました。感謝します。
支館があっただなんて…!
なるほど、弾のように計算する方法があったとは…
ご回答ありがとうございました。
>>BEMANIさん
戻り値で使い魔の番号を指定できましたか…
言われてみれば他の処理でもそうなっているみたいですね…
わざわざサンプルまで作っていただきありがとうございました。
>>めいらるさん
「敵が敵を配置する関数」…非常に便利そうですけど
そんな事ができる技術は無さそうですorz
ですが考え方としては非常に有用そうです。いづれそのような物を作ってみたいですね…
ご回答、ありがとうございました。
皆様のおかげで無事解決できました。感謝します。