複数の画像処理

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

複数の画像処理

#1

投稿記事 by 卒業したい » 15年前

すみません。
またお邪魔します。

画像を一つのライン上に流すことはできました。
次に↑を複数のライン上に流そうとして自己流(一部)にプログラムを組んでみました

すると画像は流れたのですが
途中で画像が消えてしまったり
テキストファイルから読み込んでいない部分が
流れ、どんどんスピードが落ちてしまいます

友達とも考え手直しをしたのですがうまくいきません・・・
何が原因なのかまったくわからない状態になってしまいました
もしかするとプログラムの組み方が悪いのかも知れないのですが
アドバイスを頂けませんでしょうか?

どうかよろしくお願いします

コード:

 #include "DxLib.h"
 
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[256]){
    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 CheckStateKey(unsigned char Handle){
    return Key[Handle];
}
 
 
//----------------------------------------------------
int haikei[10];//色のハンドル------------------------------------------------
void gazou1(){//これは背景画像ーーーーーーーーーーーーーーーーーーーーーーーー
haikei[0]=LoadGraph("kop3.png");
haikei[1]=LoadGraph("ue1.png");
haikei[2]=LoadGraph("migi1.png");
haikei[3]=LoadGraph("hidari1.png");
haikei[4]=LoadGraph("sita1.png");
}
int tama[10];//たまの画像----------------------------------------------------
void gazou2(){
tama[0]=LoadGraph("dan.png");
}
//--------------------------------------------------------------
int color[10];//これは色の設定-----------------------------------------------
void load(){
    color[0] = GetColor(255,255,255);//白
    color[1] = GetColor( 0, 0, 0);//黒
    color[2] = GetColor(255, 0, 0);//赤
    color[3] = GetColor( 0,255, 0);//緑
    color[4] = GetColor( 0, 0,255);//青
    color[5] = GetColor(255,255, 0);//黄色
    color[6] = GetColor( 0,255,255);//青緑
    color[7] = GetColor(255, 0,255);//紫
}//------------------------------------
 //--------------------------------------------------------------

//ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#define HIT_UX 90;
#define HIT_UY 73;
 
#define HIT_MX 240;
#define HIT_MY 73;
 
#define HIT_HX 395;
#define HIT_HY 73;
 
#define HIT_SX 550;
#define HIT_SY 73;
 
//ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー//辺り判定
typedef struct{
    int flag;
    int knd;
}humen_t;//譜面の構造体
#define HUMEN_MAX 1000
humen_t humen[HUMEN_MAX];
 
void load_humen(){
    int i=0,cnt=0;
    int c;
    FILE *fp;
    fp=fopen("ue.txt","r");
    if(fp==NULL)
        return;
        while((c=fgetc(fp))!=EOF){
        if(c==' '||c=='\n')continue;
        if(c!='0'){
            humen[i].flag=1;
            humen[i].knd=c-'0';
        }
            i++;
            if(i>=HUMEN_MAX)break;//オーバーフロー防止
    }
fclose(fp);
}
//テキストから譜面(0,1,2,3,4)を読み込む
 
typedef struct{
    int flag1;
	int flag2;
	int flag3;
	int flag4;
    int x,y;
}bullet_t;//たまの構造体
#define BULLET_MAX 1000
bullet_t bullet[BULLET_MAX];
 
 int flame;
void huru_bullet(){
    int i,j;
    //for(i=0;i<30;i++){
    i=flame++;
    if(i>=HUMEN_MAX)return;
    if(humen[i].flag==1){
        if(humen[i].knd==1){					//もしhumenのkndが1に等しい時↓
            for(j=0;j<BULLET_MAX;j++) {
                if(bullet[j].flag1==0) {
                    bullet[j].flag1=1;
                    bullet[j].x=HIT_UX;
                    bullet[j].y=480;
					break;}}}
		 if(humen[i].knd==2){
			for(j=0;j<BULLET_MAX;j++){
				if(bullet[j].flag2==0){
					bullet[j].flag2=1;
					bullet[j].x=HIT_MX;
					bullet[j].y=480;
					break;}}}

		 if(humen[i].knd==3){
			for(j=0;j<BULLET_MAX;j++){
				if(bullet[j].flag3==0){
					bullet[j].flag3=1;
					bullet[j].x=HIT_HX;
					bullet[j].y=480;
					break;}}}		
		 if(humen[i].knd==4){
			for(j=0;j<BULLET_MAX;j++){
				if(bullet[j].flag4==0){
					bullet[j].flag4=1;
					bullet[j].x=HIT_SX;
					bullet[j].y=480;
					break;}}}		}
		}
		
		

//譜面のフラグとkndが1の時・・・
int tama1_bullet(){
    int i;
    for(i=0;i<BULLET_MAX;i++){
    if(bullet[i].flag1==1){
                bullet[i].y-=1;             //座標を8減らす
                DrawGraph( bullet[i].x , bullet[i].y , tama[0] ,TRUE);
                                if(bullet[i].y < -32){      //もし画面外まで来たら
                                        bullet[i].y=480;    //初期値に戻し、
                                        bullet[i].flag1=0;   //発射フラグを戻す
                                }
                        }
               }
return 0;}
 int tama2_bullet(){
    int i;
    for(i=0;i<BULLET_MAX;i++){
    if(bullet[i].flag2==1){
               bullet[i].y-=1;             //座標を8減らす
                DrawGraph( bullet[i].x , bullet[i].y , tama[0] ,TRUE);
                                if(bullet[i].y < -32){      //もし画面外まで来たら
                                        bullet[i].y=480;    //初期値に戻し、
                                        bullet[i].flag2=0;   //発射フラグを戻す
                                }
                        }
             }
return 0;}
  int tama3_bullet(){
    int i;
    for(i=0;i<BULLET_MAX;i++){
    if(bullet[i].flag3==1){
                bullet[i].y-=1;             //座標を8減らす
                DrawGraph( bullet[i].x , bullet[i].y , tama[0] ,TRUE);
                                if(bullet[i].y < -32){      //もし画面外まで来たら
                                        bullet[i].y=480;    //初期値に戻し、
                                        bullet[i].flag3=0;   //発射フラグを戻す
                                }
                        }
               }
return 0;}
  int tama4_bullet(){
    int i;
    for(i=0;i<BULLET_MAX;i++){
    if(bullet[i].flag4==1){
                bullet[i].y-=1;             //座標を8減らす
                DrawGraph( bullet[i].x , bullet[i].y , tama[0] ,TRUE);
                                if(bullet[i].y < -32){      //もし画面外まで来たら
                                        bullet[i].y=480;    //初期値に戻し、
                                        bullet[i].flag4=0;   //発射フラグを戻す
                                }
                        }
               }
return 0;}
void bullet_main(){
   huru_bullet();
    tama1_bullet();
	tama2_bullet();
	tama3_bullet();
	tama4_bullet();
}
 void ini(){
 memset(bullet,0,sizeof(bullet_t)*BULLET_MAX);//弾情報初期化
 memset(humen,0,sizeof(humen_t)*HUMEN_MAX);//結果表示情報初期化
 }
 void matome(){
	     gazou1();
    gazou2();
    DrawGraph(0,0,haikei[0],TRUE);
    load();
    load_humen();
    flame=0;
        DrawBox( 0, 70 , 645 , 75 , color[0] ,TRUE);
        DrawBox( 85 , 0 , 95 , 480 , color[2],TRUE );
        DrawBox( 235 , 0 , 245 , 480 , color[3],TRUE );
        DrawBox( 390 , 0 , 400 , 480 , color[4],TRUE );
        DrawBox( 545 , 0 , 555 , 480 , color[5],TRUE );
 }
 void graph(){
    DrawGraph(0,0,haikei[0],TRUE);
    DrawGraph(90,0,haikei[1],TRUE);
    DrawGraph(240,0,haikei[2],TRUE);
    DrawGraph(395,0,haikei[3],TRUE);
    DrawGraph(550,0,haikei[4],TRUE);
        DrawBox( 0, 70 , 645 , 75 , color[0] ,TRUE);
        DrawBox( 85 , 0 , 95 , 480 , color[2],TRUE );
        DrawBox( 235 , 0 , 245 , 480 , color[3],TRUE );
        DrawBox( 390 , 0 , 400 , 480 , color[4],TRUE );
        DrawBox( 545 , 0 , 555 , 480 , color[5],TRUE );
 }
 
//ループで必ず行う3大処理
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	ini();
	matome();
    while(ProcessMessage()==0){
        //↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない
		graph();
    
        bullet_main();
        ScreenFlip();
    }
    
    DxLib_End();
    return 0;
}

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

Re: 複数の画像処理

#2

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

こんな感じでいかがでしょうか。

コード:

 #include "DxLib.h"
 
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[256]){
	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 CheckStateKey(unsigned char Handle){
	return Key[Handle];
}
 
 
//----------------------------------------------------
int haikei[10];//色のハンドル------------------------------------------------
void gazou1(){//これは背景画像ーーーーーーーーーーーーーーーーーーーーーーーー
haikei[0]=LoadGraph("kop3.png");
haikei[1]=LoadGraph("ue1.png");
haikei[2]=LoadGraph("migi1.png");
haikei[3]=LoadGraph("hidari1.png");
haikei[4]=LoadGraph("sita1.png");
}
int tama[10];//たまの画像----------------------------------------------------
void gazou2(){
tama[0]=LoadGraph("dan.png");
}
//--------------------------------------------------------------
int color[10];//これは色の設定-----------------------------------------------
void load(){
	color[0] = GetColor(255,255,255);//白
	color[1] = GetColor( 0, 0, 0);//黒
	color[2] = GetColor(255, 0, 0);//赤
	color[3] = GetColor( 0,255, 0);//緑
	color[4] = GetColor( 0, 0,255);//青
	color[5] = GetColor(255,255, 0);//黄色
	color[6] = GetColor( 0,255,255);//青緑
	color[7] = GetColor(255, 0,255);//紫
}//------------------------------------
 //--------------------------------------------------------------
 
//ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#define HIT_UX 90
#define HIT_UY 73
 
#define HIT_MX 240
#define HIT_MY 73
 
#define HIT_HX 395
#define HIT_HY 73
 
#define HIT_SX 550
#define HIT_SY 73
 
//ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー//辺り判定
typedef struct{
	int flag;
	int knd;
}humen_t;//譜面の構造体
#define HUMEN_MAX 1000
humen_t humen[HUMEN_MAX];
 
void load_humen(){
	int i=0,cnt=0;
	int c;
	FILE *fp;
	fp=fopen("ue.txt","r");
	if(fp==NULL)
		return;
		while((c=fgetc(fp))!=EOF){
		if(c==' '||c=='\n')continue;
		if(c!='0'){
			humen[i].flag=1;
			humen[i].knd=c-'0';
		}
			i++;
			if(i>=HUMEN_MAX)break;//オーバーフロー防止
	}
fclose(fp);
}
//テキストから譜面(0,1,2,3,4)を読み込む
 
typedef struct{
	int flag;
	int x,y;
}bullet_t;//たまの構造体
#define BULLET_MAX 1000
bullet_t bullet[BULLET_MAX];
 
int flame;
void huru_bullet(){
	int i,j;
	const int list[]={0,HIT_UX,HIT_MX,HIT_HX,HIT_SX};
	i=flame++;
	if(i>=HUMEN_MAX)return;
	if(humen[i].flag==1){
		if(humen[i].knd>=1 && humen[i].knd<=4){
			for(j=0;j<BULLET_MAX;j++) {
				if(bullet[j].flag==0) {
					bullet[j].flag=humen[i].knd;
					bullet[j].x=list[humen[i].knd];
					bullet[j].y=480;
					break;
				}
			}
		}
	}
}
		
		
 
//譜面のフラグとkndが1の時・・・
int tama_bullet(){
	int i;
	for(i=0;i<BULLET_MAX;i++){
	if(bullet[i].flag!=0){
				bullet[i].y-=1;			 //座標を8減らす
				DrawGraph( bullet[i].x , bullet[i].y , tama[0] ,TRUE);
								if(bullet[i].y < -32){	  //もし画面外まで来たら
									bullet[i].y=480;	//初期値に戻し、
									bullet[i].flag=0;   //発射フラグを戻す
								}
						}
			   }
return 0;
}

void bullet_main(){
	huru_bullet();
	tama_bullet();
}

void ini(){
	memset(bullet,0,sizeof(bullet_t)*BULLET_MAX);//弾情報初期化
	memset(humen,0,sizeof(humen_t)*HUMEN_MAX);//結果表示情報初期化
}
void matome(){
	gazou1();
	gazou2();
	DrawGraph(0,0,haikei[0],TRUE);
	load();
	load_humen();
	flame=0;
		DrawBox( 0, 70 , 645 , 75 , color[0] ,TRUE);
		DrawBox( 85 , 0 , 95 , 480 , color[2],TRUE );
		DrawBox( 235 , 0 , 245 , 480 , color[3],TRUE );
		DrawBox( 390 , 0 , 400 , 480 , color[4],TRUE );
		DrawBox( 545 , 0 , 555 , 480 , color[5],TRUE );
 }
void graph(){
	ClearDrawScreen();
	DrawGraph(0,0,haikei[0],TRUE);
	DrawGraph(90,0,haikei[1],TRUE);
	DrawGraph(240,0,haikei[2],TRUE);
	DrawGraph(395,0,haikei[3],TRUE);
	DrawGraph(550,0,haikei[4],TRUE);
		DrawBox( 0, 70 , 645 , 75 , color[0] ,TRUE);
		DrawBox( 85 , 0 , 95 , 480 , color[2],TRUE );
		DrawBox( 235 , 0 , 245 , 480 , color[3],TRUE );
		DrawBox( 390 , 0 , 400 , 480 , color[4],TRUE );
		DrawBox( 545 , 0 , 555 , 480 , color[5],TRUE );
}
 
//ループで必ず行う3大処理
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);//ウィンドウモード
	
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	ini();
	matome();
	while(ProcessMessage()==0){
		//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない
		graph();
	
		bullet_main();
		ScreenFlip();
	}
	
	DxLib_End();
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

卒業したい

Re: 複数の画像処理

#3

投稿記事 by 卒業したい » 15年前

みけCATさん
いつもほんとにありがとうございます。
画像が最後まで行きました^^

これって何が原因だったのかわかりますか?
直して頂いたプログラムに配列を使用していますよね
やっぱり配列を使用しなければいけないのでしょうか?

申し訳ありません
教えていただけませんでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 複数の画像処理

#4

投稿記事 by h2so5 » 15年前

例えば、この部分で

コード:

        if(humen[i].knd==1){                    //もしhumenのkndが1に等しい時↓
            for(j=0;j<BULLET_MAX;j++) {
                if(bullet[j].flag1==0) {
                    bullet[j].flag1=1;
                    bullet[j].x=HIT_UX;
                    bullet[j].y=480;
                    break;}}}
bullet[j].flag1 = 0
bullet[j].flag2 = 1

だった場合、まだ使用されているbullet[j]の位置がリセットされてしまいます。
卒業したい さんが書きました: やっぱり配列を使用しなければいけないのでしょうか?
配列を使うか使わないかの問題よりも、プログラムの組み方に無理があります。
無駄なループが多いし、flag1~flag4が完全に独立して処理されているのも問題です。

もっとプログラムを整理しないと、どこが違うのか探すのが大変になってしまいます。

卒業したい

Re: 複数の画像処理

#5

投稿記事 by 卒業したい » 15年前

そうだったんですか!?
てっきり処理はそれぞれで独立させてやるのだと
思って打っていました・・・

勉強になりました^^
h2so5さん
ありがとうございました!

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 複数の画像処理

#6

投稿記事 by h2so5 » 15年前

卒業したい さんが書きました:てっきり処理はそれぞれで独立させてやるのだと
思って打っていました・・・
差し支えなければ、
なぜflag1~flag4が独立している必要があると思ったのか教えていただけますか?

閉鎖

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