世間は人それぞれ#18
2017・11・19・Su* 前書き* 世間知らずと言われた時は、世間から目を背けたけど、世間を早く知りたいと思った。 世間に是非を問う気が無くなってからは、世間は平気だった。 世間は人それぞれだから。 世間を探しに、新しい旅に出たくなった。世間はいつでも、待っているから。 (旅に出たくなった。新しい世間を探しに。遠くまで、いつまでも。)* 世間は人それぞれ#18 「『大幅修正ですよ!』・・いや、別にいい。逆に言えば、大幅に作成が進むワケだからね。―――昔ファミコンでマインドシーカーやったら予知能力だけ、いつも成績が良くって、エスパーの試験では、91点とか、で、でも念力が落第点だったので、2度目で合格したんですよ。念力35点ぐらいだったんですが、予知能力89点だったんですよ。・・信じたくない。マインドシーカーと言うか、そー言う自分。でも、ゲーム作成している自分とか、ブログ書いてる自分は信じていたい・・です」* はい!よーやく飛び道具表示が昨日出来たので、今日はオフです。で、プログラミング上のルールですね。問題だったのは。->ことアロー演算子です。もちろんアドレス参照のみと言うことで、左辺に持ってくるのは基本的にアウトなんですが、* 引数として、宣言した場合のみ、出来ます。* 実は知らないうちに(その当時は知っていました)プログラムに書いてありました。エディタではエラーにならない厄介なルールって他に2,3見付けました。もちろん、そこでプログラムが止まるので、いずれ、デバックしますか?的なタグ出てきますが、長々とそんなの読む気無いしぃ。で、次ですね、* 変数として宣言していても、中のデータが無い変数は、 ポインター変数のアドレスから、構造体のメンバーは参照できません。止まります。 つまり、 = sta2[i].sta1->fr_Co; ・・みたいな感じです。グローバルで中のデータもちゃんと書いてあれば大丈夫です。 実際にBMP表示では、 //右向き HX0 = tCal1->cu_X + E1_IB0[N].sBmp->frS_X; HX1 = HX0 + E1_IB0[N].sBmp->bm_szX; その他には、 FR1_1[1] = FR1_Hontoniaru[fr_num]; FR2[1].sFR1[0] = &FR1_1[1]; n = FR2[1].sFR1[0]->loO; //0は次、1はループ、2は終了 キャラクター表示には普通に書いてます。= NULL;と記載して試してはいませんが、アドレスからの変数参照となるので、NULLでも悪い結果は同じだと思います。ダミーのようなデータを宣言しても、かえって実際に動くプログラムには、混乱を招くと思います。もっと、問題なのは、今回、この手の計算用構造体が少なくとも100個ある事です。* これは、エディタではエラーになりませんが、->を出してもエディタがメンバーを表示しないので、知ってる人は知ってますね。エディタが、.や->に反応しないメンバーはエラーにならなくとも、基本、使ってはダメってことです。エディタを信じましょう。え~・・と、次!はい、これは僕にとっては、かなりヤバイと言うか致命的なヤツです。* 構造体のメンバーに配列があると、ループ内では転送(代入)不可―――です。 これは、実行してもプログラムは止まりません。データが0として扱われているからです。* 構造体自体が配列で宣言されているのは問題ないです。現にソレでキャラクターを表示しています。while文でループして、構造体のメンバーにboolで、stopと言う変数を用意して、これが、TRUEならば、returnとしているので、宣言した最後の配列のstopのところだけTRUEにしてます。実は今回はこのプロブラミングを応用しようと思っていただけに、かなりの痛手でした。攻撃判定を3つとしていたので、この構造体のメンバーのほとんどが[3]となってました。実際は、打消しも考えて、やられ判定とダメージ情報のアドレスポインタもあったので、エンジンそのものを考え直さないと・・ダメェ~エエエですかぁ。これは、* M_Cal2[1][1].cu_X[0] = (int)MCcy_X; M_Cal2[11].cu_X[0] = (int)MCcy_X;* と、ループに入ってなければ、どちらでも代入可能です。最初は2次元配列に問題があると思って、止む無く[100]で行こうとなりました。でもその前に、プレイヤーが歩くと画面がスクロールするので、修正しないと飛び道具もプレイヤーが移動するとそのままついて行ってしまうので、そこを直そうと思って、100行ぐらいある関数に、MCcy_X -= N;とかMCcy_X += Nu;とか大変でした。Yの方は、Grand_Lineという変数で、既にあった(プレイヤーOR敵のジャンプなどで常に必要だった)のですぐに修正できたので、Xは、まさに地獄でした。とりあえず、ループの外で、必要な配列だけ指定して、代入です。そーしたら、出来てしまったんですよ。でも2次元配列と言っても、自分で宣言した構造体だったので、構造体で2次元だからか?と思って、[100]の覚悟ですか。でも、*int N10 = 0,N01 = 0,N11 =0; N10 = M_P*10; //プレイヤーの飛び道具番号2ケタがプレイヤー用 N01 = i; //ループに使う変数:敵はこれが逆です。 N11 = N10 + N01; M_Cal2[N11] * こー考えれば、そんなに管理は怖くないと思ったので、いやもう、for文まで使って、その挙句ですよ、その挙句ぅ・・。『メンバーに配列のある構造体配列はループの中では代入は不可である。』って答えを出したのは。最後なんかfor文にそのままM_Cal2[11].cu_X[0] = (int)MCcy_X;だけ入れて、ループさせました。「旋(つむじ)がぁ~!」プレイヤーを歩かせると、そのまんま一緒について行っちゃう・・。で、結局最後にコメント文にしていたM_Cal2[11].cu_X[0] = (int)MCcy_X;の、//を外して終了。まぁ、どーせ、このゲームでは、1キャラに基本1個ぐらいしか、実は飛び道具使う予定がないんですよねぇ。プレイヤーなんか、「冷気抜き手」なんで、無理に使う必要も無い・・。むしろ、通常技と同じ扱いの方が簡単で堅実ぅぅぅ。 あ、そーでした、旋(つむじ)ですが、既に画面でクルクル回って消えます。ゲームの中のエディタのキーボードの’O’押すと、敵2(健くんね、たける)「チャリ~ン」って言いながら、手ぇパーにして、旋(つむじ)出して、’Y’押すと後ろ回し蹴り出してくれます。フレームカウント管理とか、モーション管理とか、表示関連は完成しちゃいました。気が付いたら、一斉に終わってた・・。後は判定だけですが、判定情報の転送は終わっているので、まるっきり白紙の関数に以前の関数からコピって、改造ですね。 余談ですが、変数にM_ってありますよね。飛び道具の変数や関数の名前にミサイルのMを付けることにしてたんですよ、最初から。なので、普通にミサイル関数とかミサイル管理とか、ミサイル計算を、って頭の中では考えてました・・6月~10月まで作成が頓挫気味―――うん、何かと、ミサイルと言う活字を出したくなかったので、仕方がないっすねぇ。* 多分、迷惑ってかけ合うために・・あるんだねぇ。* ああ、もちろん、そのほーが、勝ちだからだよ!幸せだからだよ!!