クリックしたら的が移動するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kerotan0820
記事: 91
登録日時: 14年前

クリックしたら的が移動するプログラム

#1

投稿記事 by kerotan0820 » 14年前

こちらのFlashゲームを基とした、STGを作ろうとしています。

的をクリックしたらランダムで指定された座標に的が移動するようにしたいのですが、
まずは前段階として、的をクリックしたら、という判定はないことにしてクリックをしたら的が移動するようにしたいと思っております。

プログラムはこちらです。

コード:

#include "DxLib.h"
 
int MouseInput;
int menu=0,playmusic=1,Key[256],White;
int back1/*menu*/,back2/*play1*/,mato1;
int Sound1/*menu*/,Sound2/*play1*/;
 
/***********色の定義*********/
 
 
/*******************************************************
                      ステージ1
*******************************************************/
void Start1(void){ 
    MouseInput = GetMouseInput(); //マウスの入力状況を取得
    static int x=250,y=130,x1=0,y1=0,x2=0,y2=0;
    static int count=0,move=0;
 
    White = GetColor( 255 , 255 , 255 );
 
    
 
    /*******************************************
    的をクリックしたら、点を加算、的を移動させる
    *******************************************/
    if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0){
        count++;
    }else{
        count=0;
    }
 
    if(move==1){ //xとx1、yとy1、それぞれ大きい値からひく
 
        if( x1 > x){ //x1(ランダムの値)が現在の座標より大きければ
            x2=x1-x;  //ランダムの値(大)から現在の座標(小)を引き、x2変数へ
        }else if( x1 < x){ //x1(ランダムの値)が現在の座標より小さければ
            x2=x-x1;  //現在の座標(小)からランダムの値(大)を引き、x2変数へ
        }
        
        if( y1 > y){ //y1(ランダムの値)が現在の座標より大きければ
            y2=y1-y;  //ランダムの値(大)から現在の座標(小)を引き、y2変数へ
        }else if( y1 < y){ //y1(ランダムの値)が現在の座標より小さければ
            y2=y-y1;  //現在の座標(小)からランダムの値(大)を引き、y2変数へ
        }
 
        move=2; //move 2の処理に移動
    }
        
 
    if(move==2){  //ランダムで選んだ値が現在の座標より+かーか調べイン・デクリメント
        if(y1 > y){ //ランダムで選んだ値が現在の座標より大きけければ。
            if(y2 >= 0){  //y2が0より大きい間、1を引き続ける
                y--; //インデクリメント
            }
        }else if(y1 < y){ //ランダムで選んだ値が現在の座標より小さければ。
            if(y2 <= 0){ //y2が0未満の間1を足し続ける
                y++; //インクリメント
            }
        }
        
        if(x1 > x){ //ラダムで選んだ値が現在の座標より大きければ。
            if(x2 >= 0){ //x2が0より大きい間、1を引き続ける
                x--;
            }
        }else if(x1 < x){ //ランダムで選んだ値が現在の値より小さければ。
            if( x2 <= 0){ //x2が0未満の間1を足し続ける。
                x++;
            }
        }
 
        if(x1==x && y1==y){ //ランダムのx,y座標と現在の座標が等しくなったら!
            move = 3;
            x2=0; //移動処理が終わったので、差を調べる変数を初期化
            y2=0; //上に同じ
        }
    }
 
    if(move==3){  //次のフレームで使うランダムな値をあえて予め計算ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
        x1=GetRand(500);
        y1=GetRand(340);
		
		move=0;
    }
 
 
    /************
    BGM 再生処理
    ************/
    if(playmusic==0){//playmusicが0ならば音楽を再生(playmusicを2で初期化)
        StopSoundMem( Sound1 ) ;
        playmusic=2;
    }
 
    if(playmusic==2)
    PlaySoundMem( Sound2 , DX_PLAYTYPE_LOOP );//バックグラウンド再生
 
    DrawGraph( 0 , 0 , back1  , FALSE ) ;
    DrawGraph( x , y , mato1  , TRUE  ) ;
    playmusic=3;
 
    DrawFormatString(  100,  100, White , "count=%d"   , count  );//文字列表示
}
 
 
 
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    SetMouseDispFlag( TRUE ) ;
    
    /*******色の定義*******************/
    White = GetColor( 255 , 255 , 255 );
 
    /*******画像のメモリ読み込み*******/
    back1 = LoadGraph( "image/back(play).png" ) ;
    back2 = LoadGraph( "image/back(menu).png" ) ;
    mato1 = LoadGraph( "image/mato(play1).png") ;
 
    /*******音声のメモリ読み込み*******/
    Sound1 = LoadSoundMem( "Sound/backmusic/menu(music).wav" );
    Sound2 = LoadSoundMem( "Sound/backmusic/play(music).wav" );
 
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
 
 
        if(menu==0){ //(menuが0の時)メニュー画面(トップ)
            if(playmusic == 1){
                PlaySoundMem( Sound1 , DX_PLAYTYPE_LOOP );//バックグラウンド再生
            }
 
            DrawGraph( 0 , 0 , back2  , FALSE ) ;
            DrawString(100,100,"スペースキーでゲームスタート\n",White);
            playmusic=0; 
        }
        
        if(Key[KEY_INPUT_SPACE]==1 || menu==1){ //スペースキーが押された時、またはmenuが1の時(
                Start1();
                menu=1;
        }
 
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}
丸投げ同然の質問になってしまうので大変申し上げにくいのですが、不具合は

・クリックしても的が動かない(プログラムを多少改編する前は動いたが、すこしずつ 上にあがって行って画面外に消えてしまった)

ご教示いただけると幸いです。
けろけろにゃー (」・ω・)」うー!

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: クリックしたら的が移動するプログラム

#2

投稿記事 by dic » 14年前

こちらに書き込みますね
ゆっくり見たところ 最初のStart1()関数内の
static int move = 0;
となってますけど
下のところでは
if( move == 1 )
..
if( move == 2 )
...
if( move == 3 )
...
と move == 0 の時の処理がないようです

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: クリックしたら的が移動するプログラム

#3

投稿記事 by dic » 14年前

暇だったので時間があったのでおおまかな流れをマネして作ってみました

move = 0 の処理がなかったのと
多分いまの方法で x,y の位置を更新しないと一回しか的が動かない気がします

コード:


//==================================================================
void	func1()
{
//	int	MouseInput = GetMouseInput();	//	?
	static	int	x, y, x1, y1; /*x2, y2;*/
	static	int	count = 0, move = 0;

	//	的を描画
	DrawCircle( x, y, 32, GetColor(128,128,128), TRUE );

	//	move:0	的の位置を決める
	//	move:1	クリックを待つ
	//	move:2	次の的の位置を決める
	//	move:3	的の移動	->	move = 1

	if( move == 0 )
	{
		x = GetRand( 500 );
		y = GetRand( 340 );
		move = 1;
	}

	if( move == 1 )
	{
		//	クリックしたらカウントする
		if( (GetMouseInput() & MOUSE_INPUT_LEFT ) )
		{
			count++;
			move = 2;
		}
		else
			count = 0;
	}

	if( move == 2 )
	{
		x1 = GetRand( 500 );
		y1 = GetRand( 340 );
		move = 3;
	}

	if( move == 3 )
	{
		if( x1 != x )
		{
			if( x1 > x )
				x++;
			else
				x--;
		}
		if( y1 != y )
		{
			if( y1 > y )
				y++;
			else
				y--;
		}

		if( (x1==x) && (y1==y) )
		{
			x = x1;
			y = y1;
			move = 1;
		}
	}

	//	デバック用
	DrawFormatString( 0, 20, GetColor(255,255,255), "move:%d", move );
	DrawFormatString( 0, 40, GetColor(255,255,255), "count:%d", count );
}

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: クリックしたら的が移動するプログラム

#4

投稿記事 by ISLe » 14年前

コード:

    /*******************************************
    的をクリックしたら、点を加算、的を移動させる
    *******************************************/
    if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0){
        count++;
        if(move==0){
	        x1=GetRand(500);
	        y1=GetRand(340);
	        move=1;
	    }
    }else{
        count=0;
    }
 
    if(move==1){
		x2=x1-x;
		y2=y1-y;
		if(x2==0&&y2==0){
			// 座標が一致したら停止
			move=0;
		}
		else{
			// 座標がずれていたら近い方へ1ピクセル移動
			if (x2) x2 < 0 ? --x : ++x; // X座標
			if (y2) y2 < 0 ? --y : ++y; // Y座標
		}
    }
 
    /************
    BGM 再生処理
    ************/
こんな感じでしょうか。
日記の方にコメント付いてますが、こちらはコピペできるようにしてみました。

kerotan0820
記事: 91
登録日時: 14年前

Re: クリックしたら的が移動するプログラム

#5

投稿記事 by kerotan0820 » 14年前

>>dicさん
成程… 
何故動かなかったのか分かりました。
わざわざ時間を割いて書きなおしてくださってありがとうございます。

>>ISLeさん
ありがとうございます。
無事動きました。
一応私の要望として、移動時もクリックによる移動をさせたいのですよね。
コピペして動作させてみて、移動中にクリックしても移動できなかったのでプログラム見てみたところそういう仕様に組んだものみたいなので
クリックしたらいつでも動くようにいじってみたいと思います。

そののち私がしっくりくるほうを選んで使わせていただきますね^^  



それともう一つ質問なのですが、的の移動があまりにも遅いです。
もっと高速で移動させるためにはどうすれば良いのでしょうか
座標の移動を1づつのプラス、マイナスだと、ゆっくり過ぎて・・・。
5づつとか移動させると座標が合わないし、、、
何か案が有りますでしょうか;
けろけろにゃー (」・ω・)」うー!

kerotan0820
記事: 91
登録日時: 14年前

Re: クリックしたら的が移動するプログラム

#6

投稿記事 by kerotan0820 » 14年前

しめます
けろけろにゃー (」・ω・)」うー!

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: クリックしたら的が移動するプログラム

#7

投稿記事 by ISLe » 14年前

kerotan0820 さんが書きました:一応私の要望として、移動時もクリックによる移動をさせたいのですよね。
コピペして動作させてみて、移動中にクリックしても移動できなかったのでプログラム見てみたところそういう仕様に組んだものみたいなので
クリックしたらいつでも動くようにいじってみたいと思います。
x1,y1に乱数を放り込むのをmoveが0のときだけ行うようになっているからですね。
kerotan0820 さんが書きました:それともう一つ質問なのですが、的の移動があまりにも遅いです。
もっと高速で移動させるためにはどうすれば良いのでしょうか
参考にしているFlashゲームは一定のフレーム数で目標に到達するように動いています。
移動を開始した元座標を覚えておいて、目標座標と元座標の距離に対して、経過フレーム数に対応した比率を掛けるようにするのが簡単だと思います。

閉鎖

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