キャラクターの移動と傾き描画について

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

キャラクターの移動と傾き描画について

#1

投稿記事 by 茶釜 » 12年前

 久しぶりにプログラミングをやってみて、分からないことが有りましたので質問させていただきます。
東方のシューティングゲームの様な、キャラを右に押したら右に移動しつつ、右に傾くことをしたいのです。
左キーを押したら、左に移動+左に傾く様な…。右左に傾く様にしたい、という事です。
すごく初歩的なことかもしれないのと、ちょっと分かり難いかと思いますがよろしくお願いします。
画像です↓
[0][1][2][3][4][5][6][7]          その場で待機して服が風に揺れる列です。
[8][9][10][11][12][13][14][15]     左に傾く列です。
[16][17][18][19][20][21][22][23]   右に傾く列です。
コードです↓

コード:

#include "DxLib.h"

typedef struct{
	int x,y,img,muki,walking_flag;
}ch_t;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

	int image[24];
	char Key[256]; //キーが押されているフレーム数を格納
	ch_t ch;

	if ( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
	     //ウィンドウ化と初期化処理


	int flag = 0;
	int w = 0;
	int i = 0;
	int z = 0;
	ch.x   =320;
	ch.y   =160;
	ch.walking_flag=0;
	ch.muki=3;

	SetDrawScreen( DX_SCREEN_BACK );
	LoadDivGraph("画像/自機素材 .png",24,8,3,32,47,image); //画像分割読み込み

	//メッセージ処理       画面をクリア       キーボード入力状態取得    ESCキーで終了
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

			if(flag == 0){
			ch.walking_flag=1;               //歩くフラグ
			if         (Key[KEY_INPUT_UP] ==1)//上
				ch.muki=0;
			else if    (Key[KEY_INPUT_LEFT]==1)//左
				ch.muki=1;
			else if    (Key[KEY_INPUT_DOWN]==1)//↓
				ch.muki=2;
			else if    (Key[KEY_INPUT_RIGHT]==1)//右
				ch.muki=3;
			else
				ch.walking_flag=0;

			}
		if(ch.walking_flag==1){                    //ここからが問題かなと思っています
			if         (ch.muki==0){    //上
				ch.img = image[w%8];
				ch.y--;
		i++;
		if( i > 8 ){
		w++;
		i = 0;
		}
			}
			else if    (ch.muki==1){ //左

				w = 11;
				if(w == 16){
				ch.img = image[w%21];
				}
				w++;
				ch.x--;
			}
			else if    (ch.muki==2){    //↓
				ch.img = image[w%8];
				ch.y++;
		i++;
		if( i > 8 ){
		w++;
		i = 0;
		}
			}
			else if    (ch.muki==3){    //右
				ch.img = image[w%8];
				ch.x++;
		i++;
		if( i > 8 ){
		w++;
		i = 0;
		}
			}

		}

		ch.img = image[w];
		DrawGraph( ch.x,ch.y,ch.img,TRUE); //画像描画

		ScreenFlip(); //裏画面を表画面に反映
	}
	DxLib_End(); //DXライブラリ終了処理
	return 0;
}
見よう見まねで書いたコードですが、お願いします。
参考にしたのは、このサイトです。

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

Re: キャラクターの移動と傾き描画について

#2

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

理解してもらわないと難しいですね。やり方を解説します。
とその前に、とりあえずインデントが乱れまくっていたので修正しました。コード解読が困難なので返答が少ないと思います。

コード:

#include "DxLib.h"

typedef struct {
	int x, y, img, muki, walking_flag;
} ch_t;

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {

	int image[24];
	char Key[256]; //キーが押されているフレーム数を格納
	ch_t ch;

	if ( ChangeWindowMode( TRUE ) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
	//ウィンドウ化と初期化処理


	int flag = 0;
	int w = 0;
	int i = 0;
	int z = 0;
	ch.x   = 320;
	ch.y   = 160;
	ch.walking_flag = 0;
	ch.muki = 3;

	SetDrawScreen( DX_SCREEN_BACK );
	LoadDivGraph( "画像/自機素材 .png", 24, 8, 3, 32, 47, image ); //画像分割読み込み

	//メッセージ処理       画面をクリア       キーボード入力状態取得    ESCキーで終了
	while( !ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE] ) {

		if( flag == 0 ) {
			ch.walking_flag = 1;             //歩くフラグ
			if         ( Key[KEY_INPUT_UP] == 1 ) //上
				ch.muki = 0;
			else if    ( Key[KEY_INPUT_LEFT] == 1 ) //左
				ch.muki = 1;
			else if    ( Key[KEY_INPUT_DOWN] == 1 ) //↓
				ch.muki = 2;
			else if    ( Key[KEY_INPUT_RIGHT] == 1 ) //右
				ch.muki = 3;
			else
				ch.walking_flag = 0;

		}
		if( ch.walking_flag == 1 ) {               //ここからが問題かなと思っています
			if         ( ch.muki == 0 ) { //上
				ch.img = image[w % 8];
				ch.y--;
				i++;
				if( i > 8 ) {
					w++;
					i = 0;
				}
			} else if    ( ch.muki == 1 ) { //左

				w = 11;
				if( w == 16 ) {
					ch.img = image[w % 21];
				}
				w++;
				ch.x--;
			} else if    ( ch.muki == 2 ) { //↓
				ch.img = image[w % 8];
				ch.y++;
				i++;
				if( i > 8 ) {
					w++;
					i = 0;
				}
			} else if    ( ch.muki == 3 ) { //右
				ch.img = image[w % 8];
				ch.x++;
				i++;
				if( i > 8 ) {
					w++;
					i = 0;
				}
			}

		}

		ch.img = image[w];
		DrawGraph( ch.x, ch.y, ch.img, TRUE ); //画像描画

		ScreenFlip(); //裏画面を表画面に反映
	}
	DxLib_End(); //DXライブラリ終了処理
	return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: キャラクターの移動と傾き描画について

#3

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

さて、色々と問題が有るのですが1つのフレームでch.img への代入を2回もしている場合が有るのでこれが1つ目の問題。
あと待機アニメをちゃんとしていません。動く前に片付けておく問題かと思いますが、それ以前の問題が有るので、それを片付けましょう。
ifの分岐と言うかプログラムの流れやら変数の変化が実はよく分かっていないんじゃないかと思うので、例題としてflagの役割を出来るだけ詳しく説明していただけますか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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