歩くのをテクテクさせる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
garugaru

歩くのをテクテクさせる

#1

投稿記事 by garugaru » 16年前

何度も質問してしまって申し訳ございません。検索しても、ヒントが得られなかったので、また質問してしまいました。

今、1枚の画像を12枚に分割し、歩いているのをテクテクさせるようにする処理をしようとしています。
しかし、右キーを押す何とか進むのですが、一瞬裏向きになってまた元に戻ります。

図で説明すると

[下歩1][下止][下歩2]※キャラ画像の目線でみるとこちらを見ている
[左歩1][左止][左歩2]
[右歩1][右止][右歩2]
[上歩1][上止][上歩2]※キャラ画像の目線でみると後ろを見ている
  ↑図1

のキャラ画像があり、右に移動するので、 右止から右歩1(又は2)→右歩き2(又は1)になります。
しかし、プログラミングの館にある画像は

[上止][上歩1][上止][上歩2]
[左止][左歩1][左止][左歩2]
[下止][下歩1][下止][下歩2]
[右止][右歩1][右止][右歩2]
↑図2
となっているので、

ch.img=image[(ch.x%32)/8 +12];

で正常に(右キーを押したら右にテクテク移動する)移動します。



そこで、図1でも右止→右歩1(または2)右歩2(または1)→右止になるように自己流にアレンジし

c_character.chief_image = image[(c_character.chief_x%33)/11+7];

にしました。
しかし、図1の7番目の画像から8番目の画像→9番目の画像→7番目の画像となるので後ろ向きの
画像が一瞬出てしまいます。(9番目の画像が一瞬出る)

そこで、 7番目→8番目(又は6番目)→6番目(又は8番目) という順番にすればよいのですがその方法が分かりません。
どうすれば 7→8(6)→6(8)になるでしょうか?

説明不足だったらすみません・・・。

チルチル

Re:歩くのをテクテクさせる

#2

投稿記事 by チルチル » 16年前

自信はありませんが

c_character.chief_image = image[((c_character.chief_x+11)%33)/11+6];

で行けるかもしれません

7→8→6と変化します

しかし行けたとしても無駄に複雑になるので
やはり配置を変えた方が良いと思います

zwi

Re:歩くのをテクテクさせる

#3

投稿記事 by zwi » 16年前

こんな場合は歩くパターンの配列を用意します。
static int right_walk[3]={7,8,6};
で、これを使って歩くパターンを作ります。
c_character.chief_image = image[ right_walk[ (c_character.chief_x%3) ] ];
この方法なら色んなパターンに対応できますよ。

kazuoni

Re:歩くのをテクテクさせる

#4

投稿記事 by kazuoni » 16年前

プログラミングの館のようにやるのならば、
mukiが
down=0
left=1
right=2
up=3
のように対応するとして、
int i=(int)pow(-1.0,(int)((player.x%32+player.y%32)/11));
int j=((player.x%32+player.y%32)/11)&&1;
ch.img=image[ j*i + player.muki*3+1];
っとすれば一応は動きますが・・・
ほぼゴリ押しですw

zwiさんのやりかたが一番簡単でしょうねぇ^^;

garugaru

Re:歩くのをテクテクさせる

#5

投稿記事 by garugaru » 16年前

皆様返信ありがとうございます。

>>チルチル様

>c_character.chief_image = image[((c_character.chief_x+11)%33)/11+6];

これを4方向で動かすにはどうすればよいでしょうか?

c_character.chief_image = image[((c_character.chief_x+11)%33+(c_character.chief_y+11)%33)/11+???]

この ???  の部分をどう改造すればよいか分かりません・・・。





>>zwi様


>static int right_walk[3]={7,8,6};
で、これを使って歩くパターンを作ります。
c_character.chief_image = image[ right_walk[ (c_character.chief_x%3) ] ];


やってみましたが、テクテクの速さがかなり早くなってしまいました。どうすれば直るでしょうか?
また、4方向の場合は

up_walk[3]={1,2,0};
down....
left....
right...

if(Key[KEY_INPUT_UP]==1)
 c_character.chief_up = 1;

if(c_character.chief_up==1)
c_character.chief_y --;
c_character.chief_image = image[up_walk[(c_character.chief_x%3)]];

if....

if....

if....


のようにすれば出来ますか?


>>kazunoni様


>int i=(int)pow(-1.0,(int)((player.x%32+player.y%32)/11));
int j=((player.x%32+player.y%32)/11)&&1;
ch.img=image[ j*i + player.muki*3+1];


む・・・難しい・・・。

移動の処理方法は
構造体で right left up down を作りそれを
if(right==1)if(left==1)if(up==1)if(down==1)のようにしています。

構造体で 4方向作ってifで処理する方法で右テクテク左テクテク上テクテク下テクテクのようにするには
どうすればよいでしょうか?

zwi

Re:歩くのをテクテクさせる

#6

投稿記事 by zwi » 16年前

パターンの速度変えたい場合は、用は同じコマを続ければ良いわけですので
#define SPEED 2
c_character.chief_image = image[ right_walk[ ((c_character.chief_x/SPEED)%3) ] ];
って感じでスピードを調整してください。

あと、4方向の件ですがy方向しか動かないのでパターン変化にxを使うのは無理です。
こんな場合は、歩きパターン専用のカウンタを構造体に追加してください。
int ptn_count;
このカウンタを参照してイメージを決めます。
c_character.chief_image = image[ right_walk[ ((c_character.ptn_count/SPEED)%3) ] ];
このptn_countは移動があったときのみカウントアップします。

それと歩きの処理の件ですが、
if(Key[KEY_INPUT_UP]==1)
 c_character.chief_up = 1;

if(c_character.chief_up==1) {
 c_character.chief_y --;
 c_character.ptn_count++;
 c_character.chief_image = image[ up_walk[ ((c_character.ptn_count/SPEED)%3) ] ];
}
これと同じパターンで全方向やればいけます。

実はwalk配列を2次元化して、kazunoniさんの提案にあるmukiを番号化するって方法を使うともっとシンプルなプログラムにすることも可能ですので考えてみてください。

garugaru

Re:歩くのをテクテクさせる

#7

投稿記事 by garugaru » 16年前

返信ありがとうございます!

上下左右の移動が出来ました!

32じゃなかったら32になるまでマイナスし続ける処理が出来ないのですが、
止まってる時中途半端に手が上がってもいいのでほっときます。
とりあえず解決しました!

閉鎖

“C言語何でも質問掲示板” へ戻る