剣を使いたい
投稿者 : 犬夫(i186142.ap.plala.or.jp)
- 2003/01/13(Mon) 19:39
No.2355
|
|
|
|
|
こんばんは。はじめましてです。 今、横スクロールのアクション製作に挑戦中です。チュートリアルを見ながら、床を作り、自作キャラクタをつくり、ジャンプできるようになりましたが、剣を振って敵を倒すという方法がわかりません。弾を撃つのではなくて、剣を振らせたいのです。どのようにやればいいかお教えください。よろしくお願いします。
|
Re: 剣を使いたい
投稿者 : T(catv-149-091.tees.ne.jp)
- 2003/01/13(Mon) 21:26
No.2362
|
|
|
|
結構難しいですが、 剣を振ったら剣の近くに新しいオブジェクトを作り、 そこに当たり判定をとらせるという方法があります。
まず、キャラクタのプログラムです。 剣を振る処理の中に、 appear(new ken_atari(x+10,y)); //当たり判定用オブジェクトを自機の右に作成 という処理を追加します。 次に、ken_atariというオブジェクトを追加して、 次のようにプログラムします。 extends SpriteChar;
p=-1; updateEx(60); //剣を振っている時間だけ表示
これで60フレーム表示してから消えるというオブジェクトができます。 あとは敵のプログラムです。 for (t in $chars){ if (t is ken_atari && crashTo(t)){ die(); } } このようにすれば、一通りできると思います。 ヘルプも何も見てないので、間違いがあるかもしれません。 しっかり確認してからやってみてください。 あと、剣を振るアニメや、剣を振っている時間、 当たり判定オブジェクトの位置などは自分で設定してください。 改造点としては、当たり判定を上から下にずらす、 敵を消す条件を付け足す・・・、などがあると思います。
|
Re: 剣を使いたい
投稿者 : T(catv-149-091.tees.ne.jp)
- 2003/01/13(Mon) 21:53
No.2363
|
|
|
|
2363.lzh
サンプルプログラムを添付します。 これを参考に頑張って下さい。 決して、こんな下手な絵を真似しないでください(笑)。
|
Re: 剣を使いたい
投稿者 : 犬夫(i186142.ap.plala.or.jp)
- 2003/01/13(Mon) 22:23
No.2364
|
|
|
|
わがままな質問にお答えくださってありがとうございます。 サンプルまでありがとうございます。 じっくり学ばせて頂き、チュートリアルも見直しながら意味を理解するところからがんばるようにします。
サンプル(かわいい)を実行させて頂きました。剣は、キーボードの何のキーで振れるんでしょうか?
ほんとに初歩をお伺いして申し訳ないのですが、剣を振るという動作はどのようにすればできるですか。まず、キーボードの設定の仕方も分からないんですが、ヘルプのどこに書いてありますでしょうか?
すいませんです。剣で戦う横スクロールゲームがつくりたくて始めた初心者なもので・・・急に難しいことに手を出しちゃいましたでしょうか・・?
|
Re: 剣を使いたい
投稿者 : T(catv-149-091.tees.ne.jp)
- 2003/01/14(Tue) 07:30
No.2369
|
|
|
|
剣を振る操作は↑でできます。 キーボードの設定は、getkey()のところをいじればできると思います。
|
Re: 剣を使いたい
投稿者 : T(catv-149-091.tees.ne.jp)
- 2003/01/14(Tue) 18:31
No.2370
|
|
|
|
あ〜!説明を一生懸命(20行くらい)書いてたのに、 間違えてリセットボタンを押してしまった・・・。 ショック・・・。
また20行入れる元気がないので、手短に説明します。 元気が出てきたらまた詳しく答えます。
まず、剣を振るのは↑キーでできますが、変えることは可能です。 剣を振る動作は、$myCharの次の部分: if (getkey(38)){ anim.loop($pat_myimg+2,$pat_myimg+4,10); if (f) kx=-10; else kx=10; appear(new ken_atari(x+kx,y)); updateEx(30); p=$pat_myimg+0; anim.pause(); } で行っていますが、この1行目、getkey(32)の32を変えれば どんなキーにも対応できます。 ヘルプを起動し、 命令リファレンス(旧APIリファレンス) ↓ getkey(「入出力」のすぐ下) をクリックすれば分かりやすい説明が載っていますので。 他の部分のキーボードの設定も、 getkey()の部分を探していじればいいです。
剣を振る動作は、サンプルに添付のmyimg.bmpみたいに 連続して見ると振っているように見えるなぁって画像を 何枚でも(たくさん描いたほうがきれいに見えます) 描いて画像ファイルを保存した後、 anim.loop($pat_myimg+2,$pat_myimg+4,10); の部分をいじればいいです。 いじり方は、ヘルプを起動し、 命令リファレンス(旧APIリファレンス) ↓ AnimationAdaptorの使い方(アニメーション制御の下) を見たほうが、僕の説明より親切です(笑)
あとで元気がでたらもうちょっとがんばって説明します。
|
Re: 剣を使いたい
投稿者 : 犬夫(n235208.ap.plala.or.jp)
- 2003/01/14(Tue) 21:18
No.2372
|
|
|
|
すいません。 何から何まで聞いてしまって・・・ おかげさまで要領がわかりました。ヘルプにもやはりちゃんと書いてあるのですね。注意不足です。。
赤い剣も振れました。ズバッって感じで。 すごいですね。自分もいろいろ自由に応用できるようになりたいです。
ほんとに感謝です。ありがとうございました。
|
Re: 剣を使いたい
投稿者 : HeLP(gw.kure-u.ac.jp)
- 2005/04/18(Mon) 16:08
No.8012
|
|
|
|
添付してあったサンプルプログラム2363でもそうなんですが、剣を一度振ってそのまま歩かずにもう一度振るとアニメーションが途中で終わってしまいます。 当たり判定は出ているので、それでも敵は倒せるのですが…
何か対処法はないでしょうか。
いきなり失礼しました。
|
Re: 剣を使いたい
投稿者 : T(catv-149-113.tees.ne.jp)
- 2005/04/18(Mon) 19:09
No.8014
|
|
|
|
当事者登場(^^;) 久しぶりに自分の作ったサンプルを見て、「それにしても汚い絵だな〜」と思ってしまったり(爆)
で、本題ですね。 myCharクラスの
if (getkey(38)){ anim.loop($pat_myimg+2,$pat_myimg+4,10); if (f) kx=-10; else kx=10; appear(new ken_atari(x+kx,y)); updateEx(30); p=$pat_myimg+0; anim.pause(); }
の、anim.loop(...)を
anim.play($pat_myimg+2,$pat_myimg+4,10);
に直すと、ちゃんと最後までアニメーションが動きます。
なんで動かないのかはただいま検討中です。 誰か知っている方、ご一報を。
// 以下推論。 // AnimationAdapterを使っているのに、pをいじったのが悪かったか? // その証拠に、pをいじらなければきちんと作動する。 // それなら、playの時はなぜpをいじっても作動するのか?
|
Re: 剣を使いたい
投稿者 : T(catv-149-113.tees.ne.jp)
- 2005/04/18(Mon) 20:09
No.8016
|
|
|
|
自分なりに理解できたので、とりあえず書いておきます。 ちょっと難しくなりますが、ご容赦ください。 こんなこと分からなくても、Tonyuでゲームは作れます(笑)
AnimationAdaptorクラスの中身を覗くと、 ・基本的には、newAnimation()で生成された後、ずっと無限ループを繰り返している ・play()、loop()等が呼ばれると、変数に値が代入され ・その値の変化を見張ることで、自動的にplay()、loop()等の動作を始める という仕組みになっているようです。
さて、問題は一度目のループを止めるところからあったようです。 サンプルではanim.pause()と止めましたが、この中身は function pause() { paused=1; } となっています。これによってpausedが真になると function update2(wt) { while (wt>0) { if (update3()) return 1; if (!paused) wt--; } return 0; } でwtが減らなくなるため、停止状態になります。 (update3()関数が真を返すのは値の変化に気づいたときだけ)
その次に連続でloop()を呼ぶと、やはり変数に値が代入されるのですが、 代入される値は前回と一緒(同じ引数を渡しているから)です。 したがって、値が変化する変数はpaused=0;だけになります。
ループ内では、update3()関数によって値の変化が見張られていますが、 paused以外の変数は値が変化していないのですから、 当然AnimationAdaptorは値が変化したことには気づきません。 pausedが偽に戻ったため、ループ動作は再開されますが、 リセット作業(オブジェクトに最初の画像をセットし、始めからループを行えるようにする作業)は行われません。
AnimationAdaptorのポーズ中に、p=$pat_myimg+0に設定していますから、 アニメーションはこの画像から始まり $pat_myimg+1 -> $pat_myimg+2 -> $pat_myimg+3 と動いて時間切れになります。 これが最後まで動かなかった真相のようです。
ちなみにplay()関数だと正常に動くのは、 play()によるアニメーションが最後まで終わると
if (target.p>=t) stop();
と、stop()関数で変数の値をアニメ開始前に戻すからです。
というわけで、AnimationAdaptor使用中にpの値を変更したい場合は、 anim.pause(); の代わりに anim.stop(); とでもして値をリセットすべきかもしれません(動作未確認・非推奨)。
// と、ここまで書いて気がついたこと。 // 「同じ内容のplay()、loop()等を呼ぶと、そのアニメーションを「再開」する」 // …どっかで見たような気がする。それなら理屈は簡単だ。 // 何も元を覗いていろいろと悩む必要はなかったかも…。
…無駄レスごめんなさい。
|
Re: 剣を使いたい
投稿者 : HeLP(gw.kure-u.ac.jp)
- 2005/04/20(Wed) 15:46
No.8022
|
|
|
|
なんだかとってもよくわかったような気がします(w
どうもありがとうございました。
|
|