このプログラムでジャンプできるようにしたいのですが・・

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

このプログラムでジャンプできるようにしたいのですが・・

#1

投稿記事 by きよし » 13年前

#include "DxLib.h"
#include <math.h>

#define g 9.8
#define y_max 0.500

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

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int y_prev = 0, y_temp = 0;
int time1,time2;
int flag = 0;
double t;
bool jflag = false; //ジャンプしているかを見るフラグ
int image[24];
char Key[256];
int cnt = 0;
int Green = GetColor( 0, 255, 0 );// 緑のコード
ch_t ch;

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

ch.x = 320;
ch.y = 320;
ch.walk_flag = 0;
ch.muki = 0;


SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
LoadDivGraph( "画像/6chara.png" , 24 , 2 , 12 , 55 , 70 , image );//画像を分割してimage配列に保存

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


if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能

//歩くフラグを立てる。
ch.walk_flag=1;

//ジャンプ処理//
if(jflag == true)
{
y_temp = ch.y;
ch.y += ( ch.y - y_prev ) + 1;
y_prev = y_temp;
if( ch.y == 320)
{
jflag = false;
}
}


if( Key[ KEY_INPUT_RETURN ] == 1 )
{ //エンターが押されたら
time1 = GetNowCount(); //time1にエンターが押された時の時間を格納
flag=1; //飛び上がりフラグを立てる。
}
if(flag==1)
{
time2 = GetNowCount() ; // 現在経過時間を得る
t = (double)(time2 - time1) / 1000.000; // ミリ秒を秒に変換して、エンターが押されてからの経過時間を計算
ch.y = (int)((sqrt ( 2.00 * g * y_max) * t - 0.500 * g * t * t ) * 320.000 / y_max);//y座標を計算
if(ch.y>=0) // 1回目に回って来たか、画面内にy座標がある時
DrawGraph( ch.x , 320-ch.y , image[8] , TRUE );//画像を描画
else
ch.walk_flag=0;
flag=0; // 画面外に来ると、飛び上がりフラグを戻す

}




if ( Key[ KEY_INPUT_RIGHT ] == 1 ) //上ボタンが押されたら
{
ch.muki=0; //右向きフラグを立てる
if ( Key[ KEY_INPUT_UP ] == 1 )
ch.muki=2;
if( Key[ KEY_INPUT_DOWN] == 1 ) //下ボタンが押されたら
ch.muki=6; //右下向きフラグを立てる
}
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
{
ch.muki=1; //左向きフラグを立てる
if ( Key[ KEY_INPUT_UP ] == 1 )
ch.muki=4;
if( Key[ KEY_INPUT_DOWN] == 1 ) //下ボタンが押されたら
ch.muki=7; //左下向きフラグを立てる
}
else if( Key[ KEY_INPUT_UP ] == 1 /*&& jflag == false*/ ) //上ボタンが押されたら
{
//jflag = true;
//y_prev = ch.y;
//ch.y = ch.y - 20;
ch.muki=3; //上向きフラグを立てる
}

else //何のボタンも押されてなかったら
ch.walk_flag=0; //歩かないフラグを立てる
}

if(ch.walk_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //右向き
ch.x++;
else if(ch.muki==1) //左向き
ch.x--;
else if(ch.muki ==3 /*&& jflag == false*/) //上向き
{
if(jflag == false)
{
jflag = true;
y_prev = ch.y;
ch.y-=20;
}
}
else if(ch.muki==6) //右下向き(スライディング)
ch.x+=2;
else if(ch.muki==7) //左下向き(スライディング)
ch.x-=2;
else if(ch.muki==2) //右上向き
{
ch.x++;
ch.y--;
}
else if(ch.muki==4) //左上向き
{
ch.x--;
ch.y--;
}
}

ch.img=image[(ch.x%32+ch.y%32)/16 + ch.muki*2]; //画像をセット

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}

nil
記事: 428
登録日時: 14年前

Re: このプログラムでジャンプできるようにしたいのですが・・

#2

投稿記事 by nil » 13年前

コードタグを使用してください。
あと、何がわからないのですか?
http://dixq.net/board/board.html
質問は具体的にお願いします。

きよし

Re: このプログラムでジャンプできるようにしたいのですが・・

#3

投稿記事 by きよし » 13年前

申し訳ありません。説明不足でした。

このプログラムを使って、キャラクタを二次元平面で動かしているのですが、
キャラクタをジャンプさせるための、キャラクタ自身の座標変換がうまくいかないのです。

左右に移動させることはできたのですが、
教えて頂きたいです、よろしくお願いします。

nil
記事: 428
登録日時: 14年前

Re: このプログラムでジャンプできるようにしたいのですが・・

#4

投稿記事 by nil » 13年前

とりあえずコードの、その問題となっているであろうところを見ました。
ch.y = (int)((sqrt ( 2.00 * g * y_max) * t - 0.500 * g * t * t ) * 320.000 / y_max);//y座標を計算
問題はここでしょうか?

ぱっと見た感じでは2次関数のグラフを使って放物線を表しているようですが、
ゲームではこれは少し無理のある処理です。

大抵の場合、キャラクタなどの移動物にはx,yの他にvx,vyといったデータを与えます。
vはvelocityの略で、1フレームあたりの物体の移動量を表します。

コード:

double x=0, y=0;
double vx = 1.0, vy = 2.0;
while( ProcessMessage() == 0 ){
    x+=vx;
    y+=vy;
}
かなり大雑把なコードですが、これで1フレームごとにx方向に1.0px, y方向に2.0pxの等速直線運動を表せます。
ならば、あとは簡単で、vyに毎フレーム一定の加速度を与えてやれば……

コード:

double x=0, y=0;
double vx = 1.0, vy = 2.0;
double g = 0.3;
while( ProcessMessage() == 0 ){
    vy+=g;
    x+=vx;
    y+=vy;
}
物体の自由落下を2次関数に頼ることなく表現できます。

きよし

Re: このプログラムでジャンプできるようにしたいのですが・・

#5

投稿記事 by きよし » 13年前

上キーを入力した場合の動作部分を、変更しました。
しかし、座標が-10された状態のままで、 for文の中の+1を行ってくれません。
どこがいけないでしょうか?

上キーが入力される部分を中心に見ていただくと助かります。


#include "DxLib.h"
#include <math.h>

#define g 9.8
#define y_max 1.00

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

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

bool jflag = false; //ジャンプしているかを見るフラグ
int image[24];
char Key[256];
int cnt = 0;
int cnt_y;
int Green = GetColor( 0, 255, 0 );// 緑のコード
ch_t ch;

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

ch.x = 320;
ch.y = 320;
ch.walk_flag = 0;
ch.muki = 0;


SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
LoadDivGraph( "画像/6chara.png" , 24 , 2 , 12 , 55 , 70 , image );//画像を分割してimage配列に保存

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


if(ch.x%32==0 && ch.y%32==0)
{ //座標が32で割り切れたら入力可能

//歩くフラグを立てる。
ch.walk_flag=1;



if ( Key[ KEY_INPUT_RIGHT ] == 1 ) //上ボタンが押されたら
{
ch.muki=0; //右向きフラグを立てる
if ( Key[ KEY_INPUT_UP ] == 1 )
ch.muki=2;
if( Key[ KEY_INPUT_DOWN] == 1 ) //下ボタンが押されたら
ch.muki=6; //右下向きフラグを立てる
}
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
{
ch.muki=1; //左向きフラグを立てる
if ( Key[ KEY_INPUT_UP ] == 1 )
ch.muki=4;
if( Key[ KEY_INPUT_DOWN] == 1 ) //下ボタンが押されたら
ch.muki=7; //左下向きフラグを立てる
}
else if( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
{
ch.muki=3; //上向きフラグを立てる
}

else //何のボタンも押されてなかったら
ch.walk_flag=0; //歩かないフラグを立てる
}

if(ch.walk_flag==1)//歩くフラグが立っていたら
{
if (ch.muki==0) //右向き
ch.x++;
else if(ch.muki==1) //左向き
ch.x--;

else if(ch.muki ==3 ) //上向き
{
ch.y -= 10;

for( cnt_y = -10; cnt_y > 0; cnt_y++)
{
ch.y++;
}
}

else if(ch.muki==6) //右下向き(スライディング)
ch.x+=2;
else if(ch.muki==7) //左下向き(スライディング)
ch.x-=2;
else if(ch.muki==2) //右上向き
{
ch.x++;
ch.y--;
}
else if(ch.muki==4) //左上向き
{
ch.x--;
ch.y--;
}
}

DrawFormatString( 0, 0, Green, "ロック座標[%d,%d]", ch.x, ch.y ); // 文字を描画

ch.img=image[(ch.x%32+ch.y%32)/16 + ch.muki*2]; //画像をセット

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}

きよし

Re: このプログラムでジャンプできるようにしたいのですが・・

#6

投稿記事 by きよし » 13年前

それと、
上キーを一回押すと、プログラム通り、 y座標を -10 してほしいのですが、

なぜか、y座標が
初期値の 320 から 160 になってしまいます。

なにか変なループに入ってしまっているのでしょうか?

きよし

Re: このプログラムでジャンプできるようにしたいのですが・・

#7

投稿記事 by きよし » 13年前

あっ、解決しました。
上記の一部分を以下のように変更したらジャンプの動きになりました。



else if( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
{
ch.y -= 100;
ch.muki=3; //上向きフラグを立てる
}

else //何のボタンも押されてなかったら
ch.walk_flag=0; //歩かないフラグを立てる
}

if(ch.walk_flag==1)//歩くフラグが立っていたら
{
if (ch.muki==0) //右向き
ch.x++;
else if(ch.muki==1) //左向き
ch.x--;

else if(ch.muki==3 ) //上向き
{
ch.y+=10;
}

nil
記事: 428
登録日時: 14年前

Re: このプログラムでジャンプできるようにしたいのですが・・

#8

投稿記事 by nil » 13年前

前も言ったようにコードタグを使用してください。

きよし

Re: このプログラムでジャンプできるようにしたいのですが・・

#9

投稿記事 by きよし » 13年前

申し訳ありません。
コードタグの利用方法を見たのですが、どうもうまくいかなくて、、

コードタグの利用の仕方を教えていただけないでしょうか?
初歩的な質問で申し訳ありません。

nil
記事: 428
登録日時: 14年前

Re: このプログラムでジャンプできるようにしたいのですが・・

#10

投稿記事 by nil » 13年前

コード:

[code]
コード
のように、

コード:

でコードを囲むだけです。
[/code]

きよし

Re: このプログラムでジャンプできるようにしたいのですが・・

#11

投稿記事 by きよし » 13年前

できました、ありがとうございます。

連続した質問で申し訳ないのですが、
以下のプログラムで斜めジャンプをさせたいのですが、
通常ジャンプの時には、ジャンプの動作をおこない、
初期y座標に座標が戻ると、動作を終了してくれるのですが、

斜めのジャンプの動作を行うと、動作が終了せず
座標が増え続けていってしまいます。

それの改善のために、配列を利用して、
行けないところを作ってみましたが、そちらも上手く動作してくれません。


どこを改善すればよろしいでしょうか。
長くなりましたが、よろしくおねがいします。


コード:


#include "DxLib.h"
#include <math.h>
 
#define g 9.8
#define y_max 1.00

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


int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
 
int IsAbleToGo(int x,int y,int muki)
{  //進めるかを判定する
        if(muki==0)//上向きなら
                if(hantei[y/32-1][x/32]==1)//進めるか判定
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(hantei[y/32][x/32-1]==1)
                        return 1;
        if(muki==2)//下向きなら
                if(hantei[y/32+1][x/32]==1)
                        return 1;
        if(muki==3)//右向きなら
                if(hantei[y/32][x/32+1]==1)
                        return 1;
        return 0;//正常
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
		bool jflag = false; //ジャンプしているかを見るフラグ
        int image[24];
        char Key[256];
		int cnt = 0;
		int cnt_y;
		int Green = GetColor( 0, 255, 0 );// 緑のコード
        ch_t ch;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
        ch.x    = 320;
        ch.y    = 320;
		ch.walk_flag = 0;
		ch.muki = 0;

 
        SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
        LoadDivGraph( "画像/666chara.png" , 24 , 2 , 12 , 55 , 70 , image );//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
	{            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
            

	   if(ch.x%32==0 && ch.y%32==0)
	   {         //座標が32で割り切れたら入力可能
            
			//歩くフラグを立てる。
			ch.walk_flag=1;



            if     ( Key[ KEY_INPUT_RIGHT   ]  == 1 )  //上ボタンが押されたら
			{
                    ch.muki=0;         //右向きフラグを立てる
					if ( Key[ KEY_INPUT_UP ]  == 1 )
					{
						ch.y -= 100;
						ch.muki=3;
					}
					if( Key[ KEY_INPUT_DOWN]  == 1 )  //下ボタンが押されたら
						ch.muki=5;         //右下向きフラグを立てる
			}
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )
			{
                    ch.muki=1;         //左向きフラグ
					if ( Key[ KEY_INPUT_UP ]  == 1 )
					{
						ch.y -= 100;       //左上フラグ
						ch.muki=4;
					}
					if( Key[ KEY_INPUT_DOWN]  == 1 )
						ch.muki=6;         //左下向きフラグ
			}
            else if( Key[ KEY_INPUT_UP ]  == 1 )//上
			{
					ch.y -= 100;
					if( Key[ KEY_INPUT_RIGHT   ]  == 1 )//右上
					{
						ch.x += 1;
					}
				    ch.muki=2;
			}
				
            else                      //何のボタンも押されてなかったら
                    ch.walk_flag=0; //歩かないフラグ
        }
 
        if(ch.walk_flag==1)//歩くフラグが立っていたら
		{
            if     (ch.muki==0)        //右向き
                    ch.x+=2;
            else if(ch.muki==1)        //左向き
                    ch.x-=2;

            else if(ch.muki==2 )        //上向き
			{
				ch.y+=10;
			}

            else if(ch.muki==5)        //右下向き(スライディング)
                    ch.x+=2;
			else if(ch.muki==6)        //左下向き(スライディング)
                    ch.x-=2;
			else if(ch.muki==3)        //右上向き
			{
					ch.x++;
					ch.y+=10;
			}
			else if(ch.muki==4)        //左上向き
			{
					ch.x--;
					ch.y+=10;
			}
        }

		DrawFormatString( 0, 0, Green, "ロック座標[%d,%d]", ch.x, ch.y ); // 文字を描画
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*2];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

きよし

Re: このプログラムでジャンプできるようにしたいのですが・・

#12

投稿記事 by きよし » 13年前

すこし改善しました。
配列のx座標が1になったときは、それ以上進まないようにflagをoffにします。
y座標も同じようにしているのですが、斜めジャンプを行うと、
配列の1,0関係なしに、値を増やし続けてしまいます。

どこを改善すればよろしいでしょうか。
長くなりました、よろしくお願いします。

コード:


#include "DxLib.h"
#include <math.h>
 
#define g 9.8
#define y_max 1.00

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


int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
 
int IsAbleToGo(int x,int y,int muki)
{  //進めるかを判定する
        if(muki==0)//右向きなら
                if(hantei[y/32][x/32+3/2]==1)//進めるか判定
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(hantei[y/32][x/32-1]==1)
                        return 1;
        if(muki==2)//上向きなら
                if(hantei[y/32-1][x/32]==1)
                        return 1;
        if(muki==3)//右上向きなら
                if(hantei[y/32-1][x/32+1]==1)
                        return 1;
		if(muki==4)//左上向きなら
                if(hantei[y/32-1][x/32-1]==1)
                        return 1;
		if(muki==5)//右下向きなら
                if(hantei[y/32][x/32+1]==1)
                        return 1;
		if(muki==6)//左下向きなら
                if(hantei[y/32][x/32-1]==1)
                        return 1;
        return 0;//正常
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
	    int i,j;
		int Handle2;     // 音データハンドル
		bool jflag = false; //ジャンプしているかを見るフラグ
        int image[24];
        char Key[256];
		int cnt = 0;
		int cnt_y;
		int Green = GetColor( 0, 255, 0 );// 緑のコード
        ch_t ch;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
        ch.x    = 320;
        ch.y    = 320;
		ch.walk_flag = 0;
		ch.muki = 0;

 
        SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
        LoadDivGraph( "画像/666chara.png" , 24 , 2 , 12 , 55 , 70 , image );//画像を分割してimage配列に保存
        Handle2 = LoadSoundMem("サウンド/1up.wav"); // サウンドをロード


    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
	{            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
            
		/*白い壁を描画*/
                for(i=0;i<15;i++)
                        for(j=0;j<20;j++)
                                if(hantei[i][j]==1)
                                        DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
 



	   if(ch.x%32==0 && ch.y%32==0)
	   {         //座標が32で割り切れたら入力可能
            
			//歩くフラグを立てる。
			ch.walk_flag=1;



            if     ( Key[ KEY_INPUT_RIGHT   ]  == 1 )  //上ボタンが押されたら
			{
                    ch.muki=0;         //右向きフラグを立てる
					if ( Key[ KEY_INPUT_UP ]  == 1 )
					{
						ch.y -= 100;
						ch.muki=3;
					}
					if( Key[ KEY_INPUT_DOWN]  == 1 )  //下ボタンが押されたら
						ch.muki=5;         //右下向きフラグを立てる
			}
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )
			{
                    ch.muki=1;         //左向きフラグ
					if ( Key[ KEY_INPUT_UP ]  == 1 )
					{
						ch.y -= 100;       //左上フラグ
						ch.muki=4;
					}
					if( Key[ KEY_INPUT_DOWN]  == 1 )
						ch.muki=6;         //左下向きフラグ
			}
            else if( Key[ KEY_INPUT_UP ]  == 1 )//上
			{
					ch.y -= 100;
					PlaySoundMem( Handle2, DX_PLAYTYPE_BACK ); // 効果音を再生
					if( Key[ KEY_INPUT_RIGHT   ]  == 1 )//右上
					{
						ch.x += 1;
					}
				    ch.muki=2;
			}
				
            else                      //何のボタンも押されてなかったら
                    ch.walk_flag=0; //歩かないフラグ
			if(ch.walk_flag==1)    //もし歩くなら
                if(IsAbleToGo(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
                    ch.walk_flag=0;                  //歩かないフラグを立てる。

        }
 
        if(ch.walk_flag==1)//歩くフラグが立っていたら
		{
            if     (ch.muki==0)        //右向き
                    ch.x+=2;
            else if(ch.muki==1)        //左向き
                    ch.x-=2;

            else if(ch.muki==2 )        //上向き
			{
				ch.y+=10;
			}

            else if(ch.muki==5)        //右下向き(スライディング)
                    ch.x+=2;
			else if(ch.muki==6)        //左下向き(スライディング)
                    ch.x-=2;
			else if(ch.muki==3)        //右上向き
			{
					ch.x++;
					ch.y+=10;
			}
			else if(ch.muki==4)        //左上向き
			{
					ch.x--;
					ch.y+=10;
			}
        }

		DrawFormatString( 0, 0, Green, "ロック座標[%d,%d]", ch.x, ch.y ); // 文字を描画
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*2];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

閉鎖

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