弾の描画について

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

弾の描画について

#1

投稿記事 by Ω » 15年前

今プチシューティングを作ってて、自機を操作するとこまでは
上手くいっったんですけど、弾の描画が全く出来ません。
ゲームプログラミングの館の26を参考にしてみましたが、
あのコードを盛り込む方法が分かりません。 環境はBorland BCCdeveloperです
自分なりに盛り込んだ結果↓
//for文をZキーで実行させるとプログラムがフリーズします
#include "DxLib.h"
#define Z_image 1

typedef struct{
   int x,y,Tama_y,Tama_x,Tama_Flag;}Ziki_date;

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

int Ziki_image[Z_image],Tama[10],i;
char Key[256];
Ziki_date Ziki;

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



   Ziki.x=320;
   Ziki.y=240;
   Ziki.Tama_x=Ziki.x;
   Ziki.Tama_y=Ziki.y;
   
   SetDrawScreen(DX_SCREEN_BACK);
   LoadDivGraph("Ziki.png",1,1,1,32,32,Ziki_image);

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

   if(Key[KEY_INPUT_RIGHT]==1)
      Ziki.x+=4;
   
   if(Key[KEY_INPUT_LEFT]==1)
      Ziki.x-=4;
   
   if(Key[KEY_INPUT_UP]==1)
      Ziki.y-=4;
   
   if(Key[KEY_INPUT_DOWN]==1)
      Ziki.y+=4;
      
      DrawGraph(Ziki.x,Ziki.y,Ziki_image[0],TRUE);
      
   if(Key[KEY_INPUT_Z]==1){
      for(i=0;0<10;i++){
         Ziki.Tama_x=Ziki.x,Ziki.Tama_y=Ziki.y;
         Ziki.Tama_Flag=0;
      }
      Ziki.Tama_y-=8;
      DrawCircle(Ziki.Tama_x,Ziki.Tama_y,2,GetColor(255,255,255),TRUE);
      
   }
      ScreenFlip();

}

        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

ひよこ

Re:弾の描画について

#2

投稿記事 by ひよこ » 15年前

if(Key[KEY_INPUT_Z]==1){の中でfor(i=0;0<10;i++){は0は10を超えることはないため無限ループで
止まります。

Ω

Re:弾の描画について

#3

投稿記事 by Ω » 15年前

すいません・・・ 単なるタイプミスでした・・・
それで、for文を (i=0; 0<10; i++) から (i=0; i<10; i++)に直したんですけど、
今度はZが押されてる間だけ弾が表示されるだけ(飛んでいかない)になってしまいました。
どこかに、Ziki.Tama_y のy座標が0より大きい時のみ、Ziki.Tama_y のy座標を減らす式を
入れないとだめっぽいんですけど、試行錯誤してみましたが、全く入れ方が分かりません。
事情で返事は明日になるかと思います。

ひよこ

Re:弾の描画について

#4

投稿記事 by ひよこ » 15年前

Zキーを押したときfor(i=0;0<10;i++){はいらないと思います。Zikiは配列ではないし、
押したときにX、Yを決めて、Yを減らし描くじゃだめです。
Yを減らすのも描くのも外に置きましょう。
y座標が0より大きい時のみ
簡単にif(y>0)y--;でいいでしょう。

Ω

Re:弾の描画について

#5

投稿記事 by Ω » 15年前

返事が遅くなりました。
ひよこさんの言ったとおりにしてみました。
一応Zを押したら弾が飛ぶようになったんですけど、
なんか画面内に描画出来る弾数が1個だけしかないみたいなんです。
しかも、Zを押してないのに最初に1発だけ弾が出たりとバグだらけで・・・
何度もすいません

ひよこ

Re:弾の描画について

#6

投稿記事 by ひよこ » 15年前

描画出来る弾数が1個だけしかないみたいなんです。
配列ではないしひとつの変数だからです。
Zを押してないのに最初に1発だけ弾が出たりと
>>最初初期化して何の条件もないので、弾が出ます。

配列にしてくださいといっても難しいかもしれないので、
簡単なソースを作ってみました、今までのソースとうまく合わせれば思った通りになると思います。
わからなかったら、聞いてください。
#include "DxLib.h"

#define TAMA_MAX 100//弾の数

typedef struct{
	int x,y;//x,y座標
	int flag;//フラグ 使っているとき1 使っていないとき0
}tama_t;
tama_t tama[TAMA_MAX];

char Key[256];
 
int serch_tama(){
	int i;
	for(i=0;i<TAMA_MAX;i++){
		if(tama.flag==0)
			return i;
	}
	return -1;
}
//Zキーを押すと撃っていない弾を探す。見つけたら弾を撃つ
void shot_tama(){
	int i;
	if(Key[KEY_INPUT_Z]==1){	
		if((i=serch_tama())!=-1){
			tama.flag=1;
			tama.x=320;
			tama.y=460;
		}
	}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
        SetDrawScreen( DX_SCREEN_BACK );        //裏画面に設定
 		
		int image = LoadGraph("char.png");

		for(int i=0;i<TAMA_MAX;i++){				
			tama.flag=0;
			tama.x=320;
			tama.y=460;
		}
        while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
              //↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない
 
			shot_tama();
			
			//撃っている弾を探して撃っていてyが0より大きかったらyを減らす、そうでなかったら消す。
			for(int i=0;i<TAMA_MAX;i++){
				if(tama.flag==1){
					if(tama.y>0)
						tama.y-=3;
					else
						tama[i].flag=0;
					DrawGraph(tama[i].x,tama[i].y,image,TRUE);
				}
			}
            
			ScreenFlip();//裏画面を表画面に反映
		}
 
        DxLib_End();
        return 0;
}

Ω

Re:弾の描画について

#7

投稿記事 by Ω » 15年前

返事遅れました 試行錯誤してました
サンプルプログラムまで用意して下さるとは・・・
ひよこさんのコードを自分なりに盛り込んだら良い感じに発射出来ました。ありがとうございます。
ただ、最初に一発出てくるのと、Zを押しっぱなしにしてるとピューピューでてくるのを直したいです。
前者は簡単そうなんですが、後者は、やはり無理矢理に入れてもバグばかり発生して・・・

返事は多分明日以降になるかと

ひよこ

Re:弾の描画について

#8

投稿記事 by ひよこ » 15年前

ソースを見せてくれないと答えようがないんですが・・

最初に一発出てくるのと
>>Ωさんの前のソースも交じっているからかもしれません。

Zを押しっぱなしにしてるとピューピューでてくるのを
>>これはゲームプログラミングの館の
「キーがどれ位押されたか」を判定する関数を見ればできると思います。

Ω

Re:弾の描画について

#9

投稿記事 by Ω » 15年前

ピューピュー出てくるのは解消されました。参考ありです
すいません コードがなけりゃ無理ですよね・・・ 長いです↓
#include "DxLib.h"

#define Z_image  2   //自機画像の数  2
#define Tamax   10   //弾の最大数    10
#define T_Speed 10   //弾の速度      10

typedef struct{
   int x,y;      }Ziki_date;

typedef struct{
   int x,y,Flag; }Tama_date;

char Key[256];
int  KEY[256];
int  count=0;
int  C=0;

Tama_date Tama[Tamax];
Ziki_date Ziki;

//////////////////////////////////////
//ここらへんはfpsの設定 長いので切る//
//////////////////////////////////////

int Seach_Tama(){     //使われてない弾のサーチ
   int i;
   for(i=0; i<Tamax; i++){
      if(Tama.Flag==0)
         return i;
   }
   return -1;
}

//サーチできたら撃つ
void Shot_Tama(){
   int i;
   if(C<5)C++;                   //もしCが5以下だったらCに+1
   else if(Key[KEY_INPUT_Z]==1){ //↑でCが5以上になったら起動
      C=0;
      if((i=Seach_Tama())!=-1){
         Tama.Flag=1;        //フラグを立てる
	 Tama.x   =Ziki.x;   //自機の座標代入
	 Tama.y   =Ziki.y;
	 Tama.x  +=7;        //弾のx軸補正
      }
   }
}

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

Ziki.x=320;                      //自機に座標を代入
Ziki.y=240;
int Ziki_image[Z_image],Count;   //自機画像を入れる箱とCountを宣言

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



SetDrawScreen(DX_SCREEN_BACK);                   //裏画面に設定
LoadDivGraph("Ziki.png",2,2,1,20,26,Ziki_image); //画像を読み込ませる

for(int i=0; i<Tamax; i++){
   Tama.Flag=1;
   Tama.x   =Ziki.x;
   Tama.y   =Ziki.y;
}
   

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

/////////////////////////////////////////
//ここにfpsの表示させるコードがあります//
/////////////////////////////////////////   
   
   if(Key[KEY_INPUT_RIGHT]==1)     
      Ziki.x+=4;
   
   if(Key[KEY_INPUT_LEFT]==1)
      Ziki.x-=4;
   
   if(Key[KEY_INPUT_UP]==1)
      Ziki.y-=4;
   
   if(Key[KEY_INPUT_DOWN]==1)
      Ziki.y+=4;
      
   Shot_Tama();
   
   for(int i=0; i<Tamax; i++){
      if(Tama.Flag==1){
         if(Tama.y>0)Tama[i].y-=T_Speed;
	 else           Tama[i].Flag=0;
     
         DrawGraph(Tama[i].x,Tama[i].y,Ziki_image[1],FALSE);
      }
   }
   
   DrawGraph(Ziki.x,Ziki.y,Ziki_image[0],FALSE);
   ScreenFlip();

}


        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

ひよこ

Re:弾の描画について

#10

投稿記事 by ひよこ » 15年前

Ωさん、すみませんが、どこがどんなふうにだめなのか、もう一度言ってくれるとうれしいです。

Ω

Re:弾の描画について

#11

投稿記事 by Ω » 15年前

上記のコードは、エラーは出ないんですけど、
最初に一発だけ弾が出るので、それを直したいです。

追記
本件から逸脱してしまいますが、弾を撃っている最中(多分Zを押している最中)、
アローキーの「→」と「↓」を同時に押しても&#8600;に移動しないです。
弾を撃ってない時はちゃんと反応します。 色々試しましたが、やはりエラーやらバグやらで・・・

ひよこ

Re:弾の描画について

#12

投稿記事 by ひよこ » 15年前

最初に一発だけ弾が出るので、それを直したいです。
>>最初の初期化中のTama.Flag=1;が原因です。そして一発に見えますが、Tamaxの数だけ出ています。

同時に押しても&#8600;に移動しないです。
>>これは、私じゃよくわかりませんが、キーボードが対応していないくらいしかわかりません。
>>他の人に聞いたほうがいいと思います。

Ω

Re:弾の描画について

#13

投稿記事 by Ω » 15年前

直りました! 弾については以上です。ありがとうございました。 Tamaxの数だけ出てたんですねぇ
それにしても自分のタイプミスの多さといったら・・・
変な話、コピーペーストよりも手打ちしたい派なんです   

右下 キーボードが対応してないのかな・・・ それだと、どうしようもないなw

閉鎖

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