キャラから弾を発射させる

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

キャラから弾を発射させる

#1

投稿記事 by みつなり » 14年前

キャラから弾を発射させたいのですが、いかんせんまったく発射できる気配がありません
コードが汚いですが、どうすればよいでしょうか?

フォーラムルールに記載されていますがcodeタグをご利用下さい。
プログラムコードが格段に読みやすくなります。 be softya(ソフト屋)

コード:

#include "DxLib.h"

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

struct shot{
        int x,y;
        int flag;
		
};
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
char Key[256];
ch_t ch;
int image[20],i,counter=0;
struct shot tama[20]; 

ch.x=320;
ch.y=320;
        if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
        SetDrawScreen( DX_SCREEN_BACK );        
		//裏画面に設定
		LoadDivGraph("char.png",20,4,5,32,32,image);
		//弾準備開始
		for(i=0;i<20;i++){
			tama[i].x=2000;
			tama[i].y=2000;
			tama[i].flag=0;}
		//弾準備終了
        while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
              //↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない
if(Key[KEY_INPUT_RIGHT]==1)
ch.x++;
if(Key[KEY_INPUT_LEFT]==1)
ch.x--;
if(Key[KEY_INPUT_UP]==1)
ch.y--;
if(Key[KEY_INPUT_DOWN]==1)
ch.y++;
if(counter<5)
counter++;
else if(Key[KEY_INPUT_Z]==1){
for(i=0;i<20;i++){
	if(tama[i].flag==0){
		tama[i].flag=1;
	tama[i].x=ch.x;
	tama[i].y=ch.y;
counter=0; break;}}}
for(i=0;i<20;i++){
if(tama[i].flag==1){
	tama[i].y-=8;
  if(tama[i].y<-32){
	  tama[i].y=2000;
	  tama[i].flag=0;}}}
        DrawGraph(tama[i].x,tama[i].y,image[1],TRUE);
		DrawGraph(ch.x , ch.y , image[1] ,TRUE);
                ScreenFlip();//裏画面を表画面に反映
        }
 
        DxLib_End();
        return 0;
}

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

Re: キャラから弾を発射させる

#2

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

とりあえず、動くようにしてみました。
インデントが適当なのでプログラムが読みづらい(可読性が低い)&そのためと思われるバグがありました。
インデントをちゃんとすることはバグの防止につながりますので、ちゃんとインデントする様にしてください。

LoadDivGraph("char.png",20,4,5,32,32,image);
の絵はなかったので
LoadDivGraph("char.png",16,4,4,32,32,image);
を代わりに使っています。

バグは、
DrawGraph(tama.x,tama.y,image[1],TRUE);
がforループの外にあったためだと思います。

コード:

#include "DxLib.h"

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

struct shot{
	int x,y;
	int flag;

};
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	char Key[256];
	ch_t ch;
	int image[20],i,counter=0;
	struct shot tama[20]; 

	ch.x=320;
	ch.y=320;
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
	SetDrawScreen( DX_SCREEN_BACK );        
	//裏画面に設定
	LoadDivGraph("char.png",16,4,4,32,32,image);
	//弾準備開始
	for(i=0;i<20;i++) {
		tama[i].x=2000;
		tama[i].y=2000;
		tama[i].flag=0;
	}
	//弾準備終了
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
		//↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない
		
		//	移動方向
		if(Key[KEY_INPUT_RIGHT]==1)
			ch.x++;
		if(Key[KEY_INPUT_LEFT]==1)
			ch.x--;
		if(Key[KEY_INPUT_UP]==1)
			ch.y--;
		if(Key[KEY_INPUT_DOWN]==1)
			ch.y++;
		
		//	発射
		if(counter<5)
			counter++;
		else
		if(Key[KEY_INPUT_Z]==1){
			for(i=0;i<20;i++){
				if(tama[i].flag==0){
					tama[i].flag=1;
					tama[i].x=ch.x;
					tama[i].y=ch.y;
					counter=0;
					break;
				}
			}
		}

		for(i=0;i<20;i++){
			if(tama[i].flag==1){
				tama[i].y-=8;
				if(tama[i].y<-32){
					tama[i].y=2000;
					tama[i].flag=0;
				}
				DrawGraph(tama[i].x,tama[i].y,image[1],TRUE);
			}
		}
		//	描画
		DrawGraph(ch.x , ch.y , image[1] ,TRUE);
		ScreenFlip();//裏画面を表画面に反映
	}

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

みつなり

Re: キャラから弾を発射させる

#3

投稿記事 by みつなり » 14年前

あ~なるほど!
DrawGraphの位置を直したらできました!
詳しくありがとうございました!

インデント、意味がわからなかったので、調べました
これからは気をつけます

閉鎖

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