お願い
テクニックを共有することは、キャラのクオリティ・製作速度の向上につながります。
どうかご協力お願いいたします。
逆引きリファレンス
移動
位置
- (double) pdat->x, pdat->y
- 現在の座標。 x は右に行くほど増加し、 y は上に行くほど減少します。yが間違えやすいので注意。
- 描写はcellのお仕事なので、cellが無茶苦茶ズレてたりするとあれ?ってなります。
速度
- (double) pdat->vx, pdat->vy
- 現在の速度。 vx と x には直接的な繋がりはありません。
- movex()などを使わずに vx だけを変更しても x は変わりません。 vy も同様。
加速度
- (double) pdat->ax, pdat->ay
- 現在の加速度。 ax と(ry
向き
- (BOOL) pdat->muki
- 現在の向き。自分が相手より左にいて、右を向いていれば false 。逆なら true 。
- これがあべこべだと、相手の方にレバーを倒したのに後退動作をはじめたりすることになります。
- BOOLはtrueかfalseしかとらないので、飛び道具のGo()で
なんとか->Go(!(pdat->muki), x, y, vx, vy)
とすればわざと逆向きに打ったりできます。
横方向への移動
- movex(double dx)
- 向きを考慮して横移動(double版)。
- 向きを考慮するので、dx>0なら常に「前方」に、dx<0なら常に「後方」に移動します。
- dxには直接数字を入れたり、pdat->vxを入れたり。
- movex(int dx)
- 向きを考慮して横移動(int版)。エラーよけのために存在しているのだと思われます。
- 別にdouble版と使い分ける必要はありません。
- pdat->x = pdat->x + (double)
- 向きを考慮せず横移動。
- 自分の向きが右でも左でも、常に一定の方向に動かします。
pdat->x += 5; //右向きでも左向きでも、右に5移動します。
movex(5); //右向きなら右に、左向きなら左に5移動します。
縦方向への移動
- pdat->y = pdat->y + (double)
- 縦方向には向きという考えは存在しないので、movex()と対になるmovey()なんてものはありません。
- movex()とは異なり、これに直接数字を入れることはめったにしません。
- 基本的にpdat->vyを入れることになると思います。
- …理由は誰か他の人に聞いてください。ごめんなさい。
- JiyuuRakka(double acc_g,BOOL cyakuchi,DWORD toaid)
- 自由落下をします。
引数 |
説明 |
acc_g |
重力加速度。1.0が標準で、大きくすれば早く、小さくすればゆっくり落下する。 |
cyakuchi |
y座標が0以上に達した際に行動遷移するか否か。普通に着地させたいならTRUEでおk。 |
toaid |
y座標が0以上に達した際に遷移する行動ID。省略するとニュートラルに遷移する。 |
- 内部的には↓な感じなので、原理的には1つ上のと同じです。ただ、こっちの方が安全。
pdat->y += pdat->vy;
pdat->vy += acc_g;
体力
現在の体力量
- (int) pdat->hp
- 現在の体力量。これがマイナスになると死亡確認されます。
最大体力量
- (DWORD) pdat->hpmax
- 最大体力量。1000を基準に性能やタイプに合わせて増減するといい感じ。
- hp は死亡判定のためにマイナスまでいく必要があるので、int型(-2147483648~2147483647)ですが、
- hpmax はマイナスを設定されると初期化時に困るので、DWORD型(0~4294967295)です。
- そのため、 hpmax の最大値は理論上は4294967295ですが、実質的には2147483647です。
必殺技ゲージ
現在のゲージ量
- (double) pdat->gauge
- 現在のゲージ量。
- 本体側で別にチェックはしていないので、直接いじればgaugemaxを超えることも可能です。
最大ゲージ量
- (DWORD) pdat->gaugemax
- 最大ゲージ量。1~9のどれかを指定してください。
ゲージの種類
- (enum) pdat->gaugetype
- ゲージの種類。
数値 |
説明 |
GOBJFLGA_POWGAUGE_NONE (0x00000000) |
ゲージを隠す。 |
GOBJFLGA_POWGAUGE1 (0x00000001) |
ストック制ゲージ。gaugemaxがいくつであっても大丈夫。 |
GOBJFLGA_POWGAUGE2 (0x00000002) |
100%制ゲージ。 gaugemax=1 のときはこっちでも可。 |
- 一般的には1か2が使われます。独自にゲージを描写したい・ゲージシステムを全く使用しないときはNONEで。
ゲージの増減
- AddPowerGauge(double dp)
- ゲージがマイナスにならないように、かつ最大値(pdat->gaugemax)を超えないように増減します。
- Addという名前ではあるものの、 dp<0 なら減少にも使えます。
- 何か事情がない限りはこれを使っておけば安全。
- pdat->gauge = pdat->gauge + (double)
- こちらはより直接的な方法。最大値のことは考慮しないので、自分で
if(pdat->gauge > pdat->gaugemax)
pdat->gauge = pdat->gaugemax;
という処理をしないとゲージがどこまでも伸びていきます。それはそれで面白いけど。
相手のゲージを操りたいときはこっちを応用することになると思います。
描写
表示するセル
- (DWORD) pdat->cnow
- 現在表示しているセル。これに様々な CELL_なんとか を代入して、絵を切り替えていきます。
- pdat->counter と組み合わせて超使います。
反転
- (BOOL) pdat->revx, pdat->revy
- 反転するかどうか。TRUE なら反転させます。
- 例えば、後退動作に前進用のセルを反転させて使うことでセルを節約できます。
act_walkb(){ //後退
pdat->cnow = CELL_前進; //前に歩くセルを表示させ、
pdat->revx = TRUE; //x方向に反転させれば後ろに歩くように見える
}
角度(回転)
- (int) pdat->rot
- 角度。プラスなら時計回りに、マイナスなら反時計回りに角度を変更します。
- ↓みたいに連続的に角度を変えれば、回転になります。おにぎりの登場シーンが代表例。
PreAction(){
pdat->rot ++; //ほっとけば延々と回転します。
}
拡大率
- (float) pdat->magx, pdat->magy
- 拡大率。1.0を基準に、0から遠ざければ拡大、0に近づければ縮小です。
- マイナスになると反転し、-1.0を基準に拡縮します。
- つまり pdat->revx=TRUE と pdat->magx=-1.0 は同じってことです。
z座標(奥行き)
- (float) z
- z座標。zは手前になる(近づく)ほど減少します。これもたまに間違えることがあるとかないとか。
色
- (DWORD) pdat->color
- 色。普段は 0xFFFFFFFFです。
- 16進なのでまず頭に0x、あとの8ケタは透明度、R、G、Bです。
合成方法
- (DWORD) alphamode
- 合成方法?非推奨だしよくワカンネ。情報求む。
x方向にズラす
- zurex(double x)
- 向きを考慮してズラします。これもint版あり。
- 例えば、飛び道具を pdat->x から100だけ「前方から」発射したいときに
飛び道具->Go(~, pdat->x + 100, ~)
とすると、 pdat->muki に関わらず100だけ「右側から」発射されてしまいます。(左向き時は前≠右、前=左)
向きを考慮する zurex() を使い、
飛び道具->Go(~, pdat->x + zurex(100), ~)
と書けば、100だけ「前方に」ズラせます。
テクニック
滑らせる
PreAction()内でmovex()を使えば、とりあえず常時移動するようになります。
PreAction(){
movex(pdat->vx);
}
が、このままだと本当に常時移動するので、喰らい動作など滑ってほしくないときも滑ってしまいます。
滑ってほしくないときがあるなら
PreAction(){
if(pdat->aid != ACTID_KURAI) //喰らい動作以外のときは
movex(pdat->vx); //滑ってよし
}
みたいな感じでifで対応してください。
なお、このままだと明確に vx=0 にしない限り一生止まれません。
ニュートラル時に減速させたい場合は、 Command_Normal(DWORD key) でいい感じに減速させましょう。
Command_Normal(DWORD key){
~(中略)~
else{//ニュートラルポーズ
pdat->aid = ACTID_NEUTRAL;
double suberi = 0.2; //減速量。もっと滑らせたかったら小さくしてください。
if(pdat->vx > suberi)
pdat->vx -= suberi;
else if(pdat->vx < suberi*(-1))
pdat->vx += suberi;
else //vxが+-0.2以内なら即停止。これやらないとvxがドンピシャ0のとき以外停止できない
pdat->vx = 0;
}
return FALSE;
}
最も近くにいる敵のキー入力を取得する(モナーRより)
GetInfo(DWORD oid)、GetKeyInput(DWORD oid)、GetKey(DWORD keyinput, DWORD interval)の3つを組み合わせます。
CGoluahObject::GetKey(CGoluahObject::GetKeyInput(GetInfo(pdat->eid)->id), 0)
これをそのままifにぶち込んでも悪くはないですが、複数回使用するときのことを考えて短縮します。
GOBJECT* pedat = GetInfo(pdat->eid);
DWORD key_now = CGoluahObject::GetKey(CGoluahObject::GetKeyInput(pedat->id), 0);
これで準備OKです。これを Command_Normal() とか PreAction() とか適当なところに書いておけば、
if(key_now & KEYSTA_BA2) //相手がAを押したら
movex(10); //自分が10前進する
という感じに短縮できます。見やすい。
これを応用したのが
モナーRの投げ抜けや、
園崎魅音の私の名を言ってみろです。
頑張れば相手にテトリスさせたりできます。超頑張れば。
なお、題名のとおり「最も近くにいる敵」の入力を拾うので、Cooperationのときは注意が必要です。
GetCharacterIDも使うといい感じになりそう。
一定時間無敵化(パモス君より)
普通に pdat->muteki を true にするだけでは、行動IDが変化すると無敵が解けてしまいます。
行動IDに関わらず一定時間無敵にするには、まずcharacter.h に
int muteki_time;
を作っておきます。
そして実装にはやはりPreAction()を使います。PreAction万能すぎ。
PreAction(){
if(muteki_time>0){
pdat->muteki = true;
muteki_time --;
}
}
あとはお好きなところで
muteki_time = 100; //100F無敵にしたい
という感じで無敵化したいフレーム数を代入するだけです。
体力ゲージをなるべく隠す
何らかの特殊な事情で体力ゲージを表示したくない場合。
必殺技ゲージとは異なり正攻法では隠せないので、体力ゲージが 現在HP/最大HP の比率で変化することを利用します。
InitParameters(){
pdat->hpmax = 2147483647;
}
そして戦闘開始前にいじれる act_tojyo() や OnChangeRound() に
act_tojyo(){
pdat->hp = 1000; //実質的なhpmaxを代入
~登場シーン~
}
という感じで、設定したい体力値を直接入れてください。
これで体力ゲージは表示されなくなります。Marvelで回復したとしてもせいぜい1ドット。
ただし hpmax と hp が一致しないため、 hpmax を参照してくる技(一撃必殺など)に対しては不利になります。
最終更新:2014年04月27日 23:28