やってるゲームとかの雑記

こうはんはまだです。
スポンサーサイト
コメント
この記事へのコメント
このコメントは管理人のみ閲覧できます
2015/07/27(月) 15:18 | | #[ 編集]
> ロープショットのような敵を引き寄せる技を作りたくてネットを彷徨っていたらこのサイトを見つけました。
> しかしキャラ制作ははじめてで一二三さんのCNSをみてもさっぱりでして・・・
> なのでもしよろしければロープショットの記述周りなどをご教授願えませんでしょうか?

-グラフィックの用意-
・伸びていくロープのスプライトを別個に準備し、本体の投擲スプライトと軸位置を合わせて登録
・ロープが伸びていくグラフィックを作る際は2で割り切れるドット数ずつ伸ばすグラフィックを作る
 (D4の場合はその1/2になるので4で割り切れるドット数ずつ伸ばすのが良いかと思います)

-air登録-
・ロープを投げるモーション~ロープが一番伸びたところまで飛んで行くモーション
・ロープを引き戻す(ヒットしなかった時のモーション)
・ロープが手元に戻ってきた時のモーション(失敗時の硬直モーション)
・ロープが相手にヒットして引き戻す時のモーション(成功時の引き戻しモーション)
・ロープで引き寄せられた相手を手元まで引き戻した時のモーション(成功時のダメージを与えるモーション)

A:投げられたロープが一番先まで伸びるときのアニメ(必要に応じて伸びきった時だけ長めに入れる)
B:投げられたロープが一番伸びた状態から手元に戻るまで(↑のアニメの逆回しで入れます)

-ロープを投擲して伸び切るまでのCNS-
・キャラクターがロープを投げる~伸びきるまで(A)の間、適当な変数に常にAのアニメ番号を格納する
・攻撃判定はヘルパーにつけてもOKですが、面倒なら本体のhitdefをロープの見た目にだけ合うようにつけても良いです
・↑この方法だと必然的に本体とロープのアニメは同期されるので、ロープを伸ばしている最中のアニメを別アニメにしておけば
 たいへんシンプルに本体のコマ数×ロープの長さが現在のロープの先端の座標になります
・特定のドット数ごとに当たり判定をずらすのが面倒な場合はairをテキスト編集して座標を足しながらコピペしていくと良いです

ここでロープのアニメ番号を変数に格納するのは現在ロープがどこまで伸びているかを確認するためで、
上で書いたように事前にロープの長さをきちんと管理できていればロープが1コマごとに伸びる長さ×変数
ロープが今何枚目まで進んでいるかとヒットした際に相手の位置を管理するのに便利だからです。

-ロープがヒットし、敵をキャッチして戻ってくる場合のCNS-
・Bのアニメに切り替えるが、そのままだと最大まで伸びたアニメが表示されてしまう
・ので、上で使ったロープの長さを監視する変数を使用して逆回しのアニメを再開する位置を頭出しする
(changeanimのelemオプションで指定した番号のコマから始めることが出来ます)
・例を挙げるとAで一番伸びた時のアニメが15コマ目であれば、Bのアニメでは一番伸びたときは15コマめになるようにする
 10コマ目でヒットした場合は5コマぶん進めて10コマ目と同じ長さから引き戻しがスタートするようにする

・敵の位置を管理するときはtargetbindの座標指定でpos =var(ロープ長さ)*20,0などのように一箇所で管理してしまうと楽。
・後は毎Fごとか数Fに一回かこの変数を1ずつ減らしていく記述を入れれば、変数が1減るごとにp2の座標は
 自分に指定のピクセル数ごと近づいてくるように見えます(厳密にはずれることもあるかもしれませんが・・・)

・早い話が引き戻すステートでは「変数で管理して相手の位置をずらす」のと
 「変数で管理してロープの見た目の長さをかえる」のを同じ変数をもとに実行しているだけで
 厳密にはロープが引っ張っているのではなく、ひとりでにずれる相手にロープの位置を見た目上合わせているだけです。

-敵にヒットした時のロープを引き戻した時のCNS-
・上で変数を-1していると敵が一番近づいた時は必ず1ないし0になるので、これを条件に投げ技に飛ばします。
 (見た目上打撃技でも投げにしてしまったほうがおそらく不具合は少なくなると思います)
・もしくは、「一定時間行動できない特殊なくらい状態」などを作りたい場合はそうしたステートへとばしてください。

-敵にヒットしなかった時のロープを引き戻すcns-
・敵にヒットしなかった(ガードされた)場合などは特に難しい要素はなく、Aで最大までロープを伸ばしたので
 帰りはBの1コマ目から再生してBのアニメが終了したらロープ引き戻し完了動作のアニメ(硬直)を表示すれば終わりです。
 帰りのアニメには攻撃判定etcはいりません。



ロープのヘルパーが絡んでくると少し混乱するかもしれませんが(私も大いに混乱しましたが)、まとめると
1:本体とロープの長さを同期させれば後は本体のアニメコマ数×ロープの1アニメで伸びる長さがロープの先端の座標になる
2:相手を捕まえて帰ってくるロープが伸びきる前にヒットした時は変数を使って頭出し(縮む途中のアニメから始める)する
3:引っ張られて引き寄せられる相手は上の変数を元に変数×ロープの1アニメで伸びる長さで位置を算出
4:変数を直接1ずつ減らしていく仕組みを作って、3で書いた相手の位置指定が自動で敵を引き寄せてくれるようにする
5:密着まで引き寄せたら攻撃や投げの演出に入れておしまい
…ということになります。要するに、伸びていくロープのヘルパーは完全に飾りで構わないということで。

これでもヘルパーと変数を使うため少しややこしさはあるので、難しいことを考えたくないなら
妥協して
・本体とロープが伸びていく絵をくっつけてスプライト化(攻撃判定も合わせてつける)
・攻撃判定に当たったら敵は打撃投げのようにステートをとって特殊なくらい状態にしてvelsetで思いっきり引っ張る
・その際自分は適当にロープを勢い良く振り戻すようなアニメにしてごまかす
…なんてのもありかもしれません。簡易的な技としてはこっちでも用をなすことはできるので
こういうタイプの技はこうした簡易実装にしている作者さんもいるようです。
2015/07/28(火) 19:15 | URL | くんしょうも #-[ 編集]
詳しい解説ありがとうございます!
 さらに質問になるのですが解説の「ロープがヒットし、敵をキャッチして戻ってくる場合」というのは一二三さんで言うなら[Statedef 11004]で
 targetbindの座標指定は
[State 11003,ロープ弾頭]
type = bindtoparent
trigger1 = 1
time = 1
pos = 418-((parent,AnimElemNo(0)-1)*19),0
の部分ということでよろしいのでしょうか?
 あと一二三さんの場合はロープの発射と戻りのAIRが同じ22枚ですが発射、戻りのどちらかの枚数が多い場合も同じやり方で可能なのでしょうか?
2015/07/28(火) 21:32 | URL | #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://midorinobiotop.blog.fc2.com/tb.php/2096-5f5cb0ee
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック