弾の動きについて

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

弾の動きについて

#1

投稿記事 by 弾の動きについて » 13年前

いつもご回答ありがとうございます。
無事に弾を発射することができるようなりました。
しかし弾を発射(Wボタン)を押してから移動キーを入力すると弾が勝手に軌道を変えてしまいます。
プレイヤーの座標を弾の座標に代入しているのが原因かと自分では思っていますが、なかなかうまくいきません。
ご回答よろしくお願いします。

コード:

#include"DxLib.h"

int able_walk(struct player);//進行方向を判定する

struct player{//player構造体
	int x,y;
	int direction;
};

struct shot{//shot構造体
	int x,y;
};


int map[5][5]={{0,0,1,1,0},//ダンジョン形
               {0,1,0,0,0},
               {0,1,1,0,1},
               {0,0,0,0,1},
               {1,1,1,0,1}};


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode(TRUE);
	SetDrawScreen(DX_SCREEN_BACK);


	if(DxLib_Init()==-1)
		return -1;
	int graph;
	int walk_flag=0;
	int shot_flag=0;
	int map_color;
	int cr=GetColor(255,255,0);
	int i,j,m;

	struct shot shots;
	struct player pc;//0:上向き,1:下,2:右,3:左

	shots.x;
	shots.y;

	pc.x=0;
	pc.y=0;
	pc.direction=1;

	map_color=GetColor(255,255,255);
       
       graph=LoadGraph("円.jpg");//20pc.x20の円の画像

	while(1){  
		ProcessMessage();
		ClearDrawScreen();
		/*-------------------------------------
		キャラクターの移動処理
		---------------------------------------*/
		if(pc.x%20==0&&pc.y%20==0){
			walk_flag=1;
			if(CheckHitKey(KEY_INPUT_UP)==1)
				pc.direction=0;		
			else if(CheckHitKey(KEY_INPUT_DOWN)==1)
				pc.direction=1;
			else if(CheckHitKey(KEY_INPUT_RIGHT)==1)
				pc.direction=2;
			else if(CheckHitKey(KEY_INPUT_LEFT)==1)
				pc.direction=3;
			else 
				walk_flag=0;
			if(walk_flag==1){
				if(able_walk(pc)==1)
					walk_flag=0;
			}
		}
		if(walk_flag==1){
			if     (pc.direction==0)
				pc.y--;
			else if(pc.direction==1)
				pc.y++;
			else if(pc.direction==2)
				pc.x++;
			else if(pc.direction==3)
				pc.x--;
		}

		//ショット
		if(CheckHitKey(KEY_INPUT_W)==1&&shot_flag==0){
			shots.x=pc.x;
			shots.y=pc.y;

			if(pc.direction==0)
				DrawBox(shots.x+7,shots.y-10,shots.x+13,shots.y-1,cr,TRUE);
			else if(pc.direction==1)//下向き
				DrawBox(shots.x+7,shots.y+20,shots.x+13,shots.y+29,cr,TRUE);
			else if(pc.direction==2)//右向き
				DrawBox(shots.x+20,shots.y+7,shots.x+29,shots.y+13,cr,TRUE);
			else if(pc.direction==3)//左向き
				DrawBox(shots.x-10,shots.y+7,shots.x-1,shots.y+13,cr,TRUE);

			shot_flag=1;
		}
		if(CheckHitKey(KEY_INPUT_ESCAPE)==1)//※ゲーム終了
			break;

		//キャラクター描写
		DrawGraph(pc.x,pc.y,graph,TRUE);

		//弾描写
		if(shot_flag==1){
			if(pc.direction==0)
				shots.y--;
			else if(pc.direction==1)
				shots.y++;
			else if(pc.direction==2)
				shots.x++;
			else if(pc.direction==3)
				shots.x--;

			if(shots.x<0||shots.y<0||shots.x>100||shots.y>100)
				shot_flag=0;
			if(pc.direction==0)
				DrawBox(shots.x+7,shots.y-10,shots.x+13,shots.y-1,cr,TRUE);
			else if(pc.direction==1)//下向き
				DrawBox(shots.x+7,shots.y+20,shots.x+13,shots.y+29,cr,TRUE);
			else if(pc.direction==2)//右向き
				DrawBox(shots.x+20,shots.y+7,shots.x+29,shots.y+13,cr,TRUE);
			else if(pc.direction==3)//左向き
				DrawBox(shots.x-10,shots.y+7,shots.x-1,shots.y+13,cr,TRUE);


		}


		//map描写	
		for(i=0;i<5;i++){
			for(j=0;j<5;j++){
				if(map[j][i]==1)
					DrawBox(i*20,j*20,i*20+20,j*20+20,map_color,TRUE);
			}
		}

		ScreenFlip();
	}

	DxLib_End();

	return 0;
}

int able_walk(struct player pc)//進行方向が壁ならばエラー(1)を返す
{
	if(pc.direction==0)//上
		if(map[pc.y/20-1][pc.x/20]==1)
			return 1;//エラー
	if(pc.direction==1)//下
		if(map[pc.y/20+1][pc.x/20]==1)
			return 1;
	if(pc.direction==2)//右
		if(map[pc.y/20][pc.x/20+1]==1)
			return 1;
	if(pc.direction==3)//左
		if(map[pc.y/20][pc.x/20-1]==1)
			return 1;

	return 0;//正常
}

※管理人がタイトルを変更しました

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: mk.

#2

投稿記事 by みけCAT » 13年前

弾の動きについて さんが書きました:

コード:

			if(pc.direction==0)
				shots.y--;
			else if(pc.direction==1)
				shots.y++;
			else if(pc.direction==2)
				shots.x++;
			else if(pc.direction==3)
				shots.x--;
原因はここですね。
弾の構造体(shot)に向きの情報も持たせないといけません。
弾の動きについて さんが書きました:

コード:

			if(pc.direction==0)
				DrawBox(shots.x+7,shots.y-10,shots.x+13,shots.y-1,cr,TRUE);
			else if(pc.direction==1)//下向き
				DrawBox(shots.x+7,shots.y+20,shots.x+13,shots.y+29,cr,TRUE);
			else if(pc.direction==2)//右向き
				DrawBox(shots.x+20,shots.y+7,shots.x+29,shots.y+13,cr,TRUE);
			else if(pc.direction==3)//左向き
				DrawBox(shots.x-10,shots.y+7,shots.x-1,shots.y+13,cr,TRUE);
この部分についても同様です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

トントン
記事: 100
登録日時: 15年前

Re: mk.

#3

投稿記事 by トントン » 13年前

質問の回答ではありませんが、

DXライブラリのリファレンスに
宣言 int ProcessMessage( void ) ;


概略 ウインドウのメッセージを処理する


引数 なし
戻り値  0:成功
  -1:エラー発生・若しくはウインドウが閉じられた


解説  この関数はWindows環境でのソフトプログラムに付きまとう メッセージループ処理を肩代わりしてくれる関数です。
 この関数がなにをしているのか、というのは特に気にする 必要はありませんが、とにかく定期的にこの関数を呼び出して やる必要があります。
 目安としては60分の1秒に一回程度、用はゲームのループに 一回程度です。この関数を呼び出さないと結果としてシステムが 異常に重くなったり不安定になったりします。
 あと、戻り値が-1( エラー発生・若しくはDXライブラリのウインドウが閉じられた )になったらなるべく早めにDxLib_Endでライブラリ使用を終了し、同時にプログラムも終了する必要があります。( そうしないとウインドウを閉じてもプロセスが残るという事態になります )
とあります。
ESC以外で閉じるとプロセスが残ってしまうので抜ける処理を入れてほしいなぁと思いました。

Mk.
記事: 4
登録日時: 13年前
住所: 石川県

Re: mk.

#4

投稿記事 by Mk. » 13年前

なるほど。だから一度閉じた後に開けないということが起こったのですね

Mk.
記事: 4
登録日時: 13年前
住所: 石川県

Re: 弾の動きについて

#5

投稿記事 by Mk. » 13年前

ありがとうございます。
解決しました。

閉鎖

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