自機の移動について
投稿者 : しん(kd121106255135.ppp-bb.dion.ne.jp)
- 2010/04/10(Sat) 18:51
No.12677
|
|
|
|
|
初めまして☆ 最近Tonyuでゲーム製作をはじめた者です。
すみません、宜しければ誰か教えて下さい;
@グラフィックは元々正面や真横ではなく、斜め向き(左下向きと左上向き)になっているキャラクターを使っています。
自機の移動プログラムを組み込んだ際、 上下左右に動く際には画像はちゃんと左右反転して反映されるのですが、 斜めに動いた時や、右に行ってから上や下を向いた際などに、グラフィックが元の左斜め向きのグラフィックになって上がり下がりするので、 これを左右反転と同じく、右斜めのグラフィックになるようにするにはどうすればいいのですか;?
A壁あたり判定を付ける際にも、左右はいいのですが、上下や斜めの際に、下は足で止まり、上は頭ではなく体の半分辺りで止まるようにし、斜めはグラフィックに沿ってあたるようにしたいのですが、そちらもどうすればいいのでしょうか;?
説明が下手ですみませんが、ご回答よろしくお願いいたします(><;;
|
※追記
投稿者 : しん(kd121106255135.ppp-bb.dion.ne.jp)
- 2010/04/10(Sat) 19:59
No.12678
|
|
|
|
Aの上下斜めの壁あたりは一部自己解決しました。 ですが、斜め下や斜め上に移動する際、壁にめり込んだりするのですが、これはどうすればなおるのでしょうか?
@は未解決のままです;
|
Re: 自機の移動について
投稿者 : ロンド(fl1-119-240-81-135.iba.mesh.ad.jp)
- 2010/04/11(Sun) 12:44
No.12679
|
|
|
|
しんさんはじめまして。
クォータービューのゲームでしょうか? おそらく移動プログラムが上下左右でif文が4つだと思うので、斜め移動用のif文を4つ追加すればいいんじゃないかと思います(斜め移動の時は上下左右のif文を無視するように) と、適当なことを言ってみましたが正直@の質問の意味が良く分からないので、もう少し詳しくお願いします。 文字だけだとイメージしづらいので、説明入りの画像かプログラムを添付していただけるとわかりやすくなると思います。
|
Re: 自機の移動について
投稿者 : しん(kd121106255135.ppp-bb.dion.ne.jp)
- 2010/04/11(Sun) 21:26
No.12683
|
|
|
|
12683.zip
ロンド様初めまして☆ ご返答ありがとうございます^^
えと、グラフィックはそんなに立体感が無いので、多分ハーフビューになるかと思うのですが、キャラクターの向きは斜め向きになっています。 しかし、移動形式は上下左右と斜め方向、360度移動可能なクォータービュータイプの移動形式しようと思っています☆
ロンド様のおっしゃるとおり、 「右上・左上・右下・左下」 のif文を加えてみたのですが、やり方が合っていないのかもしれません; あと、斜め移動の際の上下左右if文を無視するプログラムが分からないのですが、宜しければそちらも教えて頂けないでしょうか;?
ちなみにプログラムの組み方としてはこんな感じなのですが、どうでしょうか? ※ちなみに、製作予定のゲームのイメージとしては、ハンゲームのチョコットランドというゲームのような感じにしようと思っています。
添付画像(zipファイル)は試作プログラム用にチョコットランドの画像で代用しています。オリジナルのゲームを作る際は、自作の画像で作る予定です。
↓(キャラクターパターンはribeonです)
extends SpriteChar;
/*キャラクタ歩行プログラム 上下左右のキーを押すとキャラクタが 足踏みしながら移動します。*/
$map.setBGColor(color(0,200,255)); //背景色の変更
p=$pat_ribeon+1;
anim=newAnimation();
while(1){ anim.pause(); if (getkey(39)>2) { //右のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x+16,y)!=$pat_block+0) x=x+1; //右が壁でないなら右へ1ドット移動 f=1; //右を向く } if (getkey(37)>2) { //左のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x-16,y)!=$pat_block+0) x=x-1; //左が壁でないなら左へ1ドット移動 f=-1; //左を向く } if (getkey(38)>2) { //上のキーが押されたとき anim.swing($pat_ribeon+3,$pat_ribeon+5,12); //キャラクタのアニメーション if ($map.getAt(x,y-2)!=$pat_block+0) y=y-1; //上が壁でないなら上へ1ドット移動 f=1; //上を向く } if (getkey(38,39)>2) { //右上のキーが押されたとき anim.swing($pat_ribeon+3,$pat_ribeon+5,12); //キャラクタのアニメーション if ($map.getAt(x,y-2)!=$pat_block+0) y=y-0; //上が壁でないなら上へ1ドット移動 f=-1; //右上を向く } if (getkey(38,37)>2) { //左上のキーが押されたとき anim.swing($pat_ribeon+3,$pat_ribeon+5,12); //キャラクタのアニメーション if ($map.getAt(x,y-2)!=$pat_block+0) y=y-0; //左上が壁でないなら左上へ1ドット移動 f=1; //左上を向く } if (getkey(40)>2) { //下のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x,y+30)!=$pat_block+0) y=y+1; //下が壁でないなら下へ1ドット移動 f=1; //下を向く } if (getkey(40,39)>2) { //右下のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x,y+30)!=$pat_block+0) y=y+0; //右下が壁でないなら右下へ1ドット移動 f=-1; //右下を向く } if (getkey(40,37)>2) { //左下のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x,y+30)!=$pat_block+0) y=y+0; //左下が壁でないなら左下へ1ドット移動 f=1; //左下を向く } if ($map.getAt(x,y+7)==$pat_block+0){ //ブロックに当たった場合 vy=0; //落下速度を0にする y=trunc(y/32)*32+10; //y座標をブロックの上に移動する } else { //ブロックに当たっていなかった場合 vy=vy+0; //落下速度を上げる } y=y+vy; update(); }
|
Re: 自機の移動について
投稿者 : ロンド(fl1-119-240-81-135.iba.mesh.ad.jp)
- 2010/04/12(Mon) 23:21
No.12684
|
|
|
|
上下左右と斜め移動を別々にした場合 ──────────── extends DxChar;
vx = 3; // 移動速度 vy = vx;
while(1) { keyUp = getkey(38); // 上入力 keyDown = getkey(40); // 下入力 keyLeft = getkey(37); // 左入力 keyRight = getkey(39); // 右入力 if(keyRight && keyDown) { x+=vx; y+=vy; } // 右下移動 else if(keyRight && keyUp) { x+=vx; y-=vy; } // 右上移動 else if(keyLeft && keyUp) { x-=vx; y-=vy; } // 左上移動 else if(keyLeft && keyDown) { x-=vx; y+=vy; } // 左下移動 else if(keyUp) { y-=vy; } // 上移動 else if(keyDown) { y+=vy; } // 下移動 else if(keyLeft) { x-=vx; } // 左移動 else if(keyRight) { x+=vx; } // 右移動 update(); } ────────────
getkey()を多用すると割と処理が重くなるので、ループの最初に呼び出し、変数に代入して使いまわします。 ifの集合体のところはどれか1つのifしか通らないので、上下左右の移動と斜め移動で切り分けることが出来ます。
あとはそれぞれの移動方向にアニメーションや向きなどを記述すれば良いと思います。
>>if (getkey(40,37)>2) { //左下のキーが押されたとき 複数の判定をするときは「 if (getkey(40)>2 && getkey(37)>2) 」という感じで && を付けます。
|
Re: 自機の移動について
投稿者 : しん(kd121106255135.ppp-bb.dion.ne.jp)
- 2010/04/13(Tue) 21:54
No.12685
|
|
|
|
ご返答遅くなり申し訳ありません; 仕事により、ご返答できる時間が7時〜10時or11時になります;
すみません、あまり知識が無いため理解が曖昧なのですが、 自分なりに解釈してプログラムを打ち込んでみた所、 ロンド様のおかげで斜め移動の際のグラフィックの左右反転には成功しました☆
ですが、 左キーを押した後に上キーや下キーを押して移動した際、 上キーや下キーの時のグラフィック(右向きのグラフィック)になってしまい、不自然なので、
左キーで左を向いてから上下のキーを押したときは、左向きのグラフィックのまま移動 右キーで右を向いてから上下のキーを押したときは、右向きのグラフィックのまま移動
となるようにはプログラミング出来ないでしょうか;?
下に自分が書いたプログラムを載せておきますので、ご指摘お願いいたします;
extends SpriteChar;
/*キャラクタ歩行プログラム 上下左右のキーを押すとキャラクタが 足踏みしながら移動します。*/
$map.setBGColor(color(0,200,255)); //背景色の変更
p=$pat_ribeon+1;
anim=newAnimation();
while(1){ anim.pause(); if (getkey(38)>2) { //上のキーが押されたとき anim.swing($pat_ribeon+3,$pat_ribeon+5,12); //キャラクタのアニメーション if ($map.getAt(x,y-2)!=$pat_block+0) y=y-1; //上が壁でないなら上へ1ドット移動 f=1; //上を向く } if (getkey(40)>2) { //下のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x,y+30)!=$pat_block+0) y=y+1; //下が壁でないなら下へ1ドット移動 f=1; //下を向く } if (getkey(37)>2) { //左のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x-16,y)!=$pat_block+0) x=x-1; //左が壁でないなら左へ1ドット移動 f=-1; //左を向く } if (getkey(39)>2) { //右のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x+16,y)!=$pat_block+0) x=x+1; //右が壁でないなら右へ1ドット移動 f=1; //右を向く } if (getkey(38)>2 && getkey(39)>2) { //右上のキーが押されたとき anim.swing($pat_ribeon+3,$pat_ribeon+5,12); //キャラクタのアニメーション if ($map.getAt(x,y-2)!=$pat_block+0) y=y-0; //上が壁でないなら上へ1ドット移動 f=1; //右上を向く }
if (getkey(40)>2 && getkey(39)>2) { //右下のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x,y+30)!=$pat_block+0) y=y+0; //右下が壁でないなら右下へ1ドット移動 f=1; //右下を向く } if (getkey(38)>2 && getkey(37)>2) { //左上のキーが押されたとき anim.swing($pat_ribeon+3,$pat_ribeon+5,12); //キャラクタのアニメーション if ($map.getAt(x,y-2)!=$pat_block+0) y=y-0; //左上が壁でないなら左上へ1ドット移動 f=-1; //左上を向く }
if (getkey(40)>2 && getkey(37)>2) { //左下のキーが押されたとき anim.swing($pat_ribeon+0,$pat_ribeon+2,12); //キャラクタのアニメーション if ($map.getAt(x,y+30)!=$pat_block+0) y=y+0; //左下が壁でないなら左下へ1ドット移動 f=-1; //左下を向く }
if ($map.getAt(x,y+7)==$pat_block+0){ //ブロックに当たった場合 vy=0; //落下速度を0にする y=trunc(y/32)*32+10; //y座標をブロックの上に移動する } else { //ブロックに当たっていなかった場合 vy=vy+0; //落下速度を上げる } y=y+vy; update(); }
|
Re: 自機の移動について
投稿者 : ロンド(flh1abw113.iba.mesh.ad.jp)
- 2010/04/19(Mon) 18:37
No.12686
|
|
|
|
すみません、国家試験があったり足を骨折したりで返信遅くなりました。
>左キーで左を向いてから上下のキーを押したときは、左向きのグラフィックのまま移動 >右キーで右を向いてから上下のキーを押したときは、右向きのグラフィックのまま移動
簡単なサンプルだと
muki=0; // 0=左向き 1=右向き while(1) { if(getkey(38)) { y-=3; } // 上移動 if(getkey(40)) { y+=3; } // 下移動 if(getkey(39)) { x+=3; muki=1;} // 右移動 右向きになる if(getkey(37)) { x-=3; muki=0;} // 左移動 左向きになる
f = muki;
update(); }
こんな感じになります。 右移動のときに muki に 1 を代入し、左移動のときには 0 を代入します。 muki を f に代入するタイミングはキー入力判定の外にします。
キー入力のif文の中では f に値を代入しないようにしてください。
|
Re: 自機の移動について
投稿者 : しん(kd121106255135.ppp-bb.dion.ne.jp)
- 2010/04/19(Mon) 21:26
No.12687
|
|
|
|
エェΣ((○Д◎ノ)ノ ?!! ロンド様、お体はもう大丈夫なのですか;?!
無理をなさらずに療養に専念してください(><;
国家試験という事は公務員職へ就職されるご予定ですか??
とても分かりやすく丁寧なご説明ありがとうございます^^ おかげ様で自機の8方向移動に関する問題点は無事解決できました☆
次は自機の攻撃モーションのプログラムを始めようと思っているのですが、また躓いてしまった際には、お手数お掛け致しますが、ご指導宜しくお願い致します(><☆
ちなみに、一つ疑問があるのですが、Tonyu Systemで作成した自作ゲームを、 各種(au,docomo,softbank対応)携帯アプリとして移植し、PC用のゲームとデータを共有する事は可能なのでしょうか??
|
Re: 自機の移動について
投稿者 : Triangle Ld.(softbank219014238038.bbtec.net)
- 2010/04/21(Wed) 20:04
No.12688
|
|
|
|
割り込み失礼。 そしてはじめまして。
Tonyu製のゲームをWindows以外(PSPとか)に持っていけるのかという質問は、極めて頻繁に起こるようなので一応補足しておきます。
Tonyu Systemのランタイムは、プレイヤー(Player.exe)とTonyuのシステムオブジェクトとかのクラス群(Kernelフォルダ)とユーザーが作成したゲーム本体のクラス群(Usrフォルダ)で構成されます。 なので、Player.exeをほかのシステムに移植できれば、Windows以外の環境でも論理上実行できるかもしれません。
ただ、携帯のアプリとなると、Tonyu Systemのランタイム構成からはとてもかけ離れた状態になってしまうので(ちなみに携帯アプリといえば私はJavaで作ったものしか知りません)、Tonyu System製のゲームをまんま携帯に持って行く事は不可能に近いです。
ただ、自分がJavaについて良く知っていて、簡単なゲームくらいなら作れる、という事なら、自分で作ってそれを入れることは(たぶん)可能です。
もうひとつのほうですが、PCと携帯が何らかの形式で「自由に」データを受け渡しできれば一応可能です。 「自由に」と書いたのは、携帯が「あるデータしか送受信できません」という仕組みであれば、不可能ということです。
まとめれば、「Tonyu System製のゲームは、(移植先がWindowsと似たような構成に対応している限り)移植が可能に近いです。」ということです。
|
上の記事+α
投稿者 : Triangle Ld.(softbank219014238038.bbtec.net)
- 2010/04/21(Wed) 20:05
No.12689
|
|
|
|
ちなみに、この掲示板の基本ルールとして、 「1スレッド1質問」 があります。 別の質問がある場合は、新しくスレッドを立てるようにして下さい。
|
Re: 自機の移動について
投稿者 : しん(kd121106255135.ppp-bb.dion.ne.jp)
- 2010/04/21(Wed) 21:25
No.12690
|
|
|
|
Triangle Ld.様初めまして☆
ご回答ありがとう御座います^^
まずはTonyuでベースとなるゲーム製作を勉強し、 後々似たようなゲームをJavaで作成する等して、 「Tonyu製のPC版ゲーム」 と 「Java製の携帯版ゲーム」 をリンクさせてデータの共有が出来たらと考えています。
ちなみに私が使用している携帯電話はauのW61CAですが、友人らが使用している携帯電話がdocomoやsoftbank等様々なので、どの機種に対応するアプリを作るのかは形態アプリ対応版の製作を手がけるようになるまで分かりません;;
もしデータ共有が出来ないのであれば仕方ないので諦めて別のものとして製作しようと思っています^^;
すみません;質問を書き込みしてからそのことに気づき、どうしようかと思っていました;以後気をつけます; 御指摘ありがとう御座います^^
まだプログラミング自体が全くの初心者で分らない事ばかりですが、ご教授よろしくお願いいたします(><☆
|
|