キャラの移動とともに画像変換

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

キャラの移動とともに画像変換

#1

投稿記事 by PEACH-CELL » 8年前

どうも、PEACH-CELLです。

現在、龍神録プログラミングの第9章「キャラクタの移動制御をしてみよう」を勉強中です。
それでだいたいは理解できたんですが、ちょっとわからないところがあるのです。

自分の自機の画像
あいうえ
おかきく
けこさし
すせそた
ちつてと
なにぬね

↑1文字で1種類の画像です。左キーを押したら「けこさし」の画像、右キーを押したら「すせそた」の画像を順に表示することはできました。
・左キーをx秒押し続けると「ちつてと」の画像をループ
・右キーをx秒押し続けると「なにぬね」の画像をループ
・左キーを離すと「しさこけ」の順で画像を表示、その後「おかきく」の画像をループ
・右キーを離すと「ねぬにな」の順で画像を表示、その後「あいうえ」の画像をループ
以上4つの動きはどうすればできるのでしょうか?

ちなみに前回の質問は自分の壮大な勘違いによるものでした…簡単に言えばSFCのソフトをDSでやろうとしていたようなものです…
前回の質問でいろいろ考えて下さった方には感謝と申し訳なさでいっぱいです。ありがとうございました&申し訳ありませんでした。

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: キャラの移動とともに画像変換

#2

投稿記事 by パコネコ » 8年前

ソースが無いので細かい事はワカリマセンが、
コレは、分割してロードしているのか一枚の画像としてロードしているのかで、書き方が変わります。

常に4つのループはしてるようですので、ループ用のカウンタを創ってループしてあげたら良いと思います。
例えば、double count=0;
count+=0.1;
img[(int)(count)%4]
みたいな感じとかです。

で、
ボタンを押したり特定の条件で描写する画像が変わるのでしたら、
mode=0;
でも創っておいて、
img[(int)(count)%4+(mode*4)];
としたら、できるのではないのかと思います。
例えば、
あいうえをループしたければ、modeの値を0へ
おかきくをループしたければ、modeの値を1へ
なにぬねをループしたければ、modeの値を5へ
みたいな感じにです

〜の後に〜のループ
でしたら、しさこけつまりmodeが5の時ですね。
この時、countの値が(int)(count)%4==0ならば、おかきくつまりmodeを1に変更して上げるプログラムをくんであげたら良いと思います。
(==0か==3かが場所によって変わります。)

ですがこの場合は反対になるので、mode5の時にcountの値が反対に減って行くようにする工夫も必要です。
(マイナス注意...あれ?マイナスなったっけ?)

なんにせよ、modeの値が変わるときにcountの値も書き換えてあげれば問題は減ると思います。

*上の文章はほとんど想像で書いてるため、適切でない場面が多々ある可能性があります。*
*ご注意くださいませ。*
ニャン!!\(゜ロ\)(/ロ゜)/

PEACH-CELL

Re: キャラの移動とともに画像変換

#3

投稿記事 by PEACH-CELL » 8年前

パコネコさんありがとうございました。今はちょっと時間ないので明日あたろやってみます。
あと、一応自分のコード載せときます、といっても第9章をコピペしたものですが。

char.ccp

コード:

#include "../include/GV.h"

void calc_ch(){
        ch.cnt++;
        ch.img=(ch.cnt%40)/10;
        }

void ch_move(){//キャラクタの移動制御
        int i,sayu_flag=0,joge_flag=0;
        double x,y,mx,my,naname=1;
        double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};//{左,右,下,上}のスピード
        int inputpad[4];
        inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
        inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

        if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
                ch.img+=4*2;//画像を左向きに(けこさしの4種類)
        else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
                ch.img+=4*3;//画像を右向きに(すせそたの4種類)

        for(i=0;i<2;i++)//左右分
                if(inputpad[i]>0)//左右どちらかの入力があれば
                        sayu_flag=1;//左右入力フラグを立てる
        for(i=2;i<4;i++)//上下分
                if(inputpad[i]>0)//上下どちらかの入力があれば
                        joge_flag=1;//上下入力フラグを立てる
        if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
                naname=sqrt(2.0);//移動スピードを1/ルート2に

        for(int i=0;i<4;i++){//4方向分ループ
                if(inputpad[i]>0){//i方向のキーボード、パッドどちらかの入力があれば
                        x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納
                        mx=move_x[i];   my=move_y[i];//移動分をmx,myに代入
                        if(CheckStatePad(configpad.slow)>0){//低速移動なら
                                mx=move_x[i]/3; my=move_y[i]/3;//移動スピードを1/3に
                        }
                        x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
                        if(!(x<10 || x>FIELD_MAX_X-10 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
                                ch.x=x , ch.y=y;//実際に移動させる
                        }
                }
        }
}

PEACH-CELL

Re: キャラの移動とともに画像変換

#4

投稿記事 by PEACH-CELL » 8年前

パコネコさんに教えていただいたのですが、どこにdouble countやmodeを書き加えればいいのかわかりません…
基本的なこと(C++言語入門とか)から学ぶべきなのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: キャラの移動とともに画像変換

#5

投稿記事 by softya(ソフト屋) » 8年前

パコネコさんの代わりに書くと少なくともC言語の入門書はお読みください。C++までは要りません。
基本的なことが分からないと自分では作れるようになりませんので。

とりあえずサイトだと
「苦しんで覚えるC言語」
http://9cguide.appspot.com/
これで勉強してみて下さい。
ただし、ちゃんとした書籍に比べると問題のある記述箇所が見受けられます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

PEACH-CELL

Re: キャラの移動とともに画像変換

#6

投稿記事 by PEACH-CELL » 8年前

softyaさんありがとうございました。やはり基本から学ばねばいけないようですね…
少し勉強してから…また戻ってくると思います。

PEACH-CELL

Re: キャラの移動とともに画像変換

#7

投稿記事 by PEACH-CELL » 8年前

しばらくsoftyaさんが薦めて下さったサイトで勉強しまして、パコネコさんが仰ってるようにmode関数を作ってキャラの画像の変更に一部成功致しました。

コード:

#include "../include/GV.h"

void calc_ch(){
		int mode=0;
		if( CheckStatePad(configpad.left) > 0 ){//左キーが押されていたら
			mode=2;}//画像を左向きに(自機画像の上から3列目の4種類)
		else if( CheckStatePad(configpad.left) > 0 && mode==2 && (int)(ch.cnt)%40/10==0 ){ // 左キーを押している間に画像が一巡したら
			mode=4;}//左移動画像をループ(自機画像の上から5列目の4種類)
		else if( CheckStatePad(configpad.right) > 0 ){//右キーが押されていたら
			mode=3;}//画像を右向きに(自機画像の上から4列目の4種類)
		else if( CheckStatePad(configpad.right) > 0 && mode==3 && (int)(ch.cnt)%40/10==0 ){ // 右キーを押している間に画像が一巡したら
			mode=5;}//右移動画像をループ(自機画像の上から6列目の4種類) 

		double count=0;
        ch.cnt++;
        ch.img=(int)(ch.cnt)%40/10+mode*4;
}

void ch_move(){//キャラクタの移動制御
        int i,sayu_flag=0,joge_flag=0;
        double x,y,mx,my,naname=1;
        double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};//{左,右,下,上}のスピード
        int inputpad[4];
        inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
        inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);
		
        for(i=0;i<2;i++)//左右分
                if(inputpad[i]>0)//左右どちらかの入力があれば
                        sayu_flag=1;//左右入力フラグを立てる
        for(i=2;i<4;i++)//上下分
                if(inputpad[i]>0)//上下どちらかの入力があれば
                        joge_flag=1;//上下入力フラグを立てる
        if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
                naname=sqrt(2.0);//移動スピードを1/ルート2に

        for(int i=0;i<4;i++){//4方向分ループ
                if(inputpad[i]>0){//i方向のキーボード、パッドどちらかの入力があれば
                        x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納
                        mx=move_x[i];   my=move_y[i];//移動分をmx,myに代入
                        if(CheckStatePad(configpad.slow)>0){//低速移動なら
                                mx=move_x[i]/3; my=move_y[i]/3;//移動スピードを1/3に
                        }
                        x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
                        if(!(x<10 || x>FIELD_MAX_X-13 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
                                ch.x=x , ch.y=y;//実際に移動させる
                        }
                }
        }
}
ですが、ひとつ問題が起きました。
「左(右)キーが押されていたら画像を左(右)向きに」は成功するのですが
「左(右)キーを押している間に画像が一巡したら左(右)移動画像をループ」が成功しません。左(右)キーを押し続けてもmode=2(3)の画像がループするだけです。
if文になにか問題あるでしょうか?まったくわかりません… どこがおかしいのか教えて下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: キャラの移動とともに画像変換

#8

投稿記事 by softya(ソフト屋) » 8年前

ローカル変数のmodeで
int mode=0;
は関数に入るたびに0に初期化されます。

なので
else if( CheckStatePad(configpad.left) > 0 && mode==2 && (int)(ch.cnt)%40/10==0 ){ // 左キーを押している間に画像が一巡したら
else if( CheckStatePad(configpad.right) > 0 && mode==3 && (int)(ch.cnt)%40/10==0 ){ // 右キーを押している間に画像が一巡したら
の2つの条件は永久に成立しません。

static int mode = 0;
と書けば1回だけ初期化されるようになります。
これについては、変数の寿命を学んで下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: キャラの移動とともに画像変換

#9

投稿記事 by softya(ソフト屋) » 8年前

もう一つありました。

プログラムの流れ的に
if( CheckStatePad(configpad.left) > 0 ){//左キーが押されていたら
が先に成立しますので、
else if( CheckStatePad(configpad.left) > 0 && mode==2 && (int)(ch.cnt)%40/10==0 ){ // 左キーを押している間に画像が一巡したら
が通ることは絶対ありません。これは根本的に考えるべき問題です。

プログラムのステートメント(文)の実行順番をちゃんと把握されていないと思われます。

よく分からない時はフローチャートで流れをよく考えてみてください。
「C言語入門 御構造・1」
http://rina.jpn.ph/~rance/c_language/p04.html
「C言語入門 御構造・2」
http://rina.jpn.ph/~rance/c_language/p12.html
絶対に使えというわけではないですが頭を整理するのに役立つと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

PEACH-CELL

Re: キャラの移動とともに画像変換

#10

投稿記事 by PEACH-CELL » 8年前

softyaさんありがとうございました。一回だけ初期化する変数なんてあったんですね… これは便利… しばらく勉強して多分理解できました。

コード:

#include "../include/GV.h"

void calc_ch(){
		static int mode=0;//一回だけ初期化
		if ((mode==2) && CheckStatePad(configpad.left) > 0 && (int)(ch.cnt)%40/10==0 ){//左を押し続けた場合
			mode=4;}//左移動画像ループ(自機画像の上から5列目ループ)
		else if ((mode==3) && CheckStatePad(configpad.right) > 0 && (int)(ch.cnt)%40/10==0 ){//右を押し続けた場合
			mode=5;}//右移動画像ループ(自機画像の上から6列目ループ)
		if ((mode==0 || mode==1) && CheckStatePad(configpad.left) > 0 ){//左を押した場合
			mode=2;}//左移動画像に変換(自機画像の上から3列目)
		else if ((mode==0 || mode==1) && CheckStatePad(configpad.right) > 0 ){//右を押した場合
			mode=3;}//右移動画像に変換(自機画像の上から4列目)
		if ((mode==2 || mode==4) && CheckStatePad(configpad.left)==0 ){//左を押して離した場合
			mode=0;}//左待機画像ループ(自機画像の上から1列目ループ)
		else if ((mode==3 || mode==5) && CheckStatePad(configpad.right)==0 ){//右を押して離した場合
			mode=1;}//右待機画像ループ(自機画像の上から2列目ループ)

		double count=0;
        ch.cnt++;
        ch.img=(int)(ch.cnt)%40/10+mode*4;
}

void ch_move(){//キャラクタの移動制御
        int i,sayu_flag=0,joge_flag=0;
        double x,y,mx,my,naname=1;
        double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};//{左,右,下,上}のスピード
        int inputpad[4];
        inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
        inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);
		
        for(i=0;i<2;i++)//左右分
                if(inputpad[i]>0)//左右どちらかの入力があれば
                        sayu_flag=1;//左右入力フラグを立てる
        for(i=2;i<4;i++)//上下分
                if(inputpad[i]>0)//上下どちらかの入力があれば
                        joge_flag=1;//上下入力フラグを立てる
        if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
                naname=sqrt(2.0);//移動スピードを1/ルート2に

        for(int i=0;i<4;i++){//4方向分ループ
                if(inputpad[i]>0){//i方向のキーボード、パッドどちらかの入力があれば
                        x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納
                        mx=move_x[i];   my=move_y[i];//移動分をmx,myに代入
                        if(CheckStatePad(configpad.slow)>0){//低速移動なら
                                mx=move_x[i]/3; my=move_y[i]/3;//移動スピードを1/3に
                        }
                        x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
                        if(!(x<10 || x>FIELD_MAX_X-13 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
                                ch.x=x , ch.y=y;//実際に移動させる
                        }
                }
        }
}
こうするとだいたいうまくできました。ですが、この場合だとmode=2(3)からmode=4(5)に移るときに問題が。
自機画像 縦6×横4の24枚
あいうえ
おかきく
けこさし
すせそた
ちつてと
なにぬね

ch.imgが0~10(あ)のときに左を押し続けると あ→い→う→え→け(けこさしでループ) と変換されるのですが、ch.imgが11~20のときは い→う→え→け(けこさしでループ) となってあが飛ばされてしまいます。ch.imgが21~30のときはあといが、ch.imgが31~40のときはあといとうが飛ばされます。
解決策としては

コード:

int=nowa,nowb,nowc;
nowa= ch.img >= 11 && ch.img <=20 ? 1 : 0;//自機画像がいのときでも
nowb= ch.img >= 21 && ch.img <=30 ? 1 : 0;//自機画像がうのときでも
nowa= ch.img >= 31 && ch.img <=40 ? 1 : 0;//自機画像がえのときでも
ch.img=(int)(ch.cnt)%40/10+mode-nowa-nowb-nowc;//modeを8とすればいつ左を押しても あ→い→う→え となる
です。ch.imgが21~30、つまり画像がうのときはなぜかうまくいきませんが妥協します。上の方法以外で「左を押すとch.imgの値に関係なく画像があ→い→う→えとなる」方法ってあるのでしょうか?自分はこれ以外に思いつきません。
それと、countの値の書き換える方法がどうしてもわかりません… どうすればよいでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: キャラの移動とともに画像変換

#11

投稿記事 by softya(ソフト屋) » 8年前

申し訳ないですが表示パターン(ch.img)とch.cntとmodeの関係を整理し直してもらえませんか?
あ→い→う→え
と変化するのはch.imgの番号ですよね? ch.imgが1の時は「い」の状態が表示されるのでは無いのでしょうか?
ch.img=0 → あ
ch.img=1 → い
ch.img=2 → う
ch.img=3 → え
どういう風に番号の変化を狙っているのかつかめません。
ch.imgが0~10(あ)のときに左を押し続けると あ→い→う→え→け(けこさしでループ) と変換されるのですが、ch.imgが11~20のときは い→う→え→け(けこさしでループ) となってあが飛ばされてしまいます。ch.imgが21~30のときはあといが、ch.imgが31~40のときはあといとうが飛ばされます。
chr.imgではなくch.cntでは無いのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

PEACH-CELL

Re: キャラの移動とともに画像変換

#12

投稿記事 by PEACH-CELL » 8年前

申し訳ないです…いろいろ間違えてました… そうですね…ch.imgではなくch.cntです。

キーを何も押さない状況だと あ→い→う→え がループします。これは(int)(ch.cnt)%40/10+mode*4で40/10と指定しているのでcountが10増えるごとに画像がひとつ変わる(あ→い→う→え)、countが0に戻ると画像も一番初めに戻る(え→あ)ってことですよね?
で、左を押すと け→こ→さ→し と画像が変換されるようにします。
現在の画像があのとき、つまりcountが0~11のときに左を押すと問題なく あ→け→こ→さ→し と変換されます。しかし、
現在の画像がいのとき、つまりcountが11~20のときに左を押すと い→こ→さ→し と変換され、けの画像が飛ばされます。
画像がうのときは け と こ が、画像がえのときは け と こ と さ が飛ばされます。
これを画像がいのときでも、うのときでも、えのときでも、左を押すと け→こ→さ→し と変換されるようにしたいのです。
おそらく、画像を変換するときにもcountは増え続けてるのでこのようなことが起こるのでしょう(と自分は思っております)。

で、画像があ、い、う、えのどの場合でも左を押すと け→こ→さ→し と変換されるように考えたものが

コード:

int=nowa,nowb,nowc;
nowa= (int)(ch.cnt)%40/10 >= 11 && (int)(ch.cnt)%40/10 <= 20 ? 1 : 0;//自機画像がいのときでも
nowb= (int)(ch.cnt)%40/10 >= 21 && (int)(ch.cnt)%40/10 <= 30 ? 2 : 0;//自機画像がうのときでも
nowa= (int)(ch.cnt)%40/10 >= 31 && (int)(ch.cnt)%40/10 <= 40 ? 3 : 0;//自機画像がえのときでも
ch.img=(int)(ch.cnt)%40/10+mode-nowa-nowb-nowc;//左を押せば け→こ→さ→し となる 
上のプログラムでのmodeの役割は「現在の画像から8つ先の画像を描画する」です。具体的には画像がいのとき+8されてこが描画されます。
で、画像がいのときはmodeが7だったら い→(+7)け→こ→さ→し となると考え、nowa,nowb,nowcを用意しました。この3つはmodeに代入された数字を変化させるものです。
具体的には画像がいのときにはmodeが7に、画像がうのときにはmodeが6に、画像がえのときにはmodeが5になるようにします。
これで画像があ、い、う、えのどのときでも左を押すと け→こ→さ→し と変換されるはずです。
前のレスで試したようなことを書いていますが、まだ試していません。まぁ、画像が変換されるときもcountが増え続けるとしたら、このままだとさやしが飛ばされることになりますが。
上記の方法以外に左を押せば け→こ→さ→し と変換される方法はあるのでしょうか?

あとcountの値を書き換える方法がわかりません。ある場合に++を--に換えるようにしたいのですが… どうすればよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: キャラの移動とともに画像変換

#13

投稿記事 by softya(ソフト屋) » 8年前

別々にカウントすれば解決する気がします。あ→い→う→えのカウンタとけ→こ→さ→しのカウンタは別のものって事です。
それとあ→い→う→えに戻ったときにけ→こ→さ→しのカウンタを0にしておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

PEACH-CELL

Re: キャラの移動とともに画像変換

#14

投稿記事 by PEACH-CELL » 8年前

softyaさんいつもありがとうございます。いろいろ考えてswitch case文を使ってみました。

コード:

ch.cnt++;
static int n=0,mode=0,modea=0;
	if ((mode==0 || mode==1) && CheckStatePad(configpad.left) > 0 ){//左を押した場合
		n=1;
		modea=2;}//左移動画像に変換(自機画像の上から3列目)
	else if ((mode==0 || mode==1) && CheckStatePad(configpad.right) > 0 ){//右を押した場合
		n=1;
		modea=3;}//右移動画像に変換(自機画像の上から4列目)
	if ((modea==2) && CheckStatePad(configpad.left)==0 ){//左を押して離した場合
		n=0;
		mode=0;}//左待機画像ループ(自機画像の上から1列目ループ)
	else if ((modea==3) && CheckStatePad(configpad.right)==0 ){//右を押して離した場合
		n=0;
		mode=1;}//右待機画像ループ(自機画像の上から2列目ループ)
	switch(n){
                case 0:
			ch.cnta=0;
                	ch.img=(ch.cnt%40)/10+mode*4;
			break;
                case 1:
			ch.cnt=0;
			ch.cnta++;
			ch.img=(ch.cnta%40)/10+modea*4;
			break;
                default:
                	printfDx("不明なfunc_state\n");
                	break;
        }
これで画像があ、い、う、えのどのときでもけ→こ→さ→しと変換することが可能になりました。
ですが、今度はけ→こ→さ→しからち→つ→て→とに変換することができなくなりました。

コード:

case 1:
    ch.cnt=0;
    ch.cnta++;
    ch.img=(ch.cnta%40)/10+modea*4;
    if ((modea==2) && CheckStatePad(configpad.left) > 0 && (ch.cnt%40)/10==0 )
	modea=4;
    break;
とすると左を押して離したときにmodea=4が代入されます。switch case文の外に書くと画像が変換することもできません。今度はもうひとつch.cntcを用意して

コード:

case 1:
    ch.cnt=0;
    ch.cnta++;
    ch.cntc++;
    ch.img=(ch.cnta%40)/10+modea*4;
    if (ch.cntc>=40)
	modea=4;//ch.cntcが40以上になったら左移動画像がループするつもり
    break;
にしても同じく左を離したときにmodea=4が代入されます。次にcase 2を作って

コード:

case 1:
    ch.cnt=0;
    ch.cnta++;
    ch.cntb=0;
    ch.cntc++;
    ch.img=(ch.cnta%40)/10+modea*4;
    if (ch.cntc>=40)
	n=2;
    break;
case 2:
    ch.cnt=0;
    ch.cnta=0;
    ch.cntc=0;
    ch.cntb++;
    ch.img=(ch.cntb%40)/10+4*4;//とりあえず左移動画像ループ
    break;
にしてもcase 2に分岐することすらないようです。もうどうすればいいかわかりません。教えて下さい…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: キャラの移動とともに画像変換

#15

投稿記事 by softya(ソフト屋) » 8年前

とりあえずインデントをキレイに整理してください。すごく読みづらいです。
あとコメントが無いので変数の狙いが良く分かりません。ただ、すごく難しく使いづらく組んでるように思えてなりません。

それぞれの変数の役割とあ→い→う→え、け→こ→さ→し、ち→つ→て→との変化との関係を書いてみてください。
n
mode
modea
ch.cnt
ch.cnta
ch.cntb
ch.cntc
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

PEACH-CELL

Re: キャラの移動とともに画像変換

#16

投稿記事 by PEACH-CELL » 8年前

毎度お世話になってます。PEACH-CELLです。インデント修正中にsoftyaさんが仰った『プログラムのステートメント(文)の実行順番』に気付き、ステートメントを組み直したところ、ようやく自分の思い通りにキャラを動かすことに成功致しました。

コード:

void calc_ch(){
		static int n=0,mode=0,modea=0;
		if ((mode==0 || mode==1) && CheckStatePad(configpad.left) > 0 ){//左を押した場合
			n=1;//case1へ
			modea=2;}//けこさしに変換
		else if ((mode==0 || mode==1) && CheckStatePad(configpad.right) > 0 ){//右を押した場合
			n=1;//case1へ
			modea=3;}//すせそたに変換
		if ((modea==2 || modea==4) && CheckStatePad(configpad.left)==0){//左を押して離した場合
			n=0;//case0へ
			mode=6;}//しさこけに変換
		else if ((modea==3 || modea==5) && CheckStatePad(configpad.right)==0){//右を押して離した場合
			n=0;//case0へ
			mode=7;}//たそせすに変換
		switch(n){
			case 0:
				ch.cnt++;//静止中の画像の描画のカウンタ
				ch.cnta=0;//移動中の画像の描画のカウンタ
				ch.cntb=0;//移動中に画像を変換させるためのカウンタ(case1で使用)
				ch.cntc++;//静止中に画像を変換させるためのカウンタ(case0の間、この値は増え続ける)
				if(mode==6 && ch.cntc>=40)//左を押して離してそのままの場合
					mode=0;//あいうえをループ
				else if(mode==7 && ch.cntc>=40)//右を押して離してそのままの場合
					mode=1;//おかきくをループ
				ch.img=(ch.cnt%40)/10+mode*4;//静止中の画像の描画
				break;
			case 1:
				ch.cnt=0;
				ch.cnta++;
				ch.cntb++;//case1の間、この値は増え続ける
				ch.cntc=0;
				if(ch.cntb>=40 && (modea==2))//左を押し続けると
					modea=4;//ちつてとをループ
				else if(ch.cntb>=40 && (modea==3))//右を押し続けると
					modea=5;//なにぬねをループ
				ch.img=(ch.cnta%40)/10+modea*4;//移動中の画像の描画
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
        }
}
これで
・初期状態ではあいうえをループ
・左キーを押すとけこさし→ちつてとのループ
・右キーを押すとすせそた→なにぬねのループ
・左キーを押して離すとしさこけ→あいうえのループ
・右キーを押して離すとたそすせ→おかきくのループ
という様に描画することができました。

ただ、countの値を--にするとうまくいきませんでした(例えば、mode=0のときにcountを--に変更するとあ→描画されない→あ→…を繰り返す)
なので対策として、使用する自機画像を
あいうえ
おかきく
けこさし
すせそた
ちつてと
なにぬね
しさこけ
たそせす
に変更しました。
パコネコさん、softyaさん。今まで丁寧に教えて下さってありがとうございました。
また疑問が浮かんだとき、よろしければ御指導御鞭撻のほど、よろしくお願い申しあげます(_ _)

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: キャラの移動とともに画像変換

#17

投稿記事 by ISLe » 8年前

左キーを長押しして、“ちつてと”のループ中、瞬時に右キーに入力が切り替わると、“すせそた”を飛ばして一気に“なにぬね”に移行しますけど。
#左右逆も同様

意図したとおりですか?


画像は左右に傾いたイメージでしょうか。
もっと整理してさらに3分の1くらいにコードを減らせますよ。
良い経験になるはずなので頑張ってみては?

PEACH-CELL

Re: キャラの移動とともに画像変換

#18

投稿記事 by PEACH-CELL » 8年前

ISLeさん… わざわざ確かめていただいたんですか…(それとも、プログラム見ただけでわかったのでしょうか) 恐縮です。

>左キーを長押しして、“ちつてと”のループ中、瞬時に右キーに入力が切り替わると、“すせそた”を飛ばして一気に“なにぬね”に移行しますけど。
>#左右逆も同様

>意図したとおりですか?

いえ、意図したとおりではありません。妥協しました…

コードを減らす… ですか… いろいろ頑張ってみます。ありがとうございました。

閉鎖

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