エフェクトの画像を表示すると画面がチラつく?

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

エフェクトの画像を表示すると画面がチラつく?

#1

投稿記事 by LisetteLander » 14年前

着弾エフェクト(4枚)とまったく同じ文法でミサイルの爆発エフェクト(8枚)を描いたのですが(というかコピペです)
本来表示されるエフェクトとは別に画面全体によくわからないものが一瞬表示されます。

画像自体の透明化、文法での透過判断もしていますし枚数を記述したリテラルも#defineで宣言。
もちろん、エフェクト自体も分岐こそありますが内容を爆発用にしただけのコピペです。

先日この掲示板で教わったprintfデバック法も試したりブレークポイントも試みましたが、描画時に発生するようで・・・

また、Resourcesはゲーム本体です。

コード:

typedef struct{//全エフェクトに使う基本的な量産型構造体
	int count;//例えば被弾エフェクト01の0~3枚目の表示
	double angle;//画像の向き
	double x;//座標
	double y;
	int status;//グループ。(被弾、爆発など)
	int knd;//種類。(大きい爆発、小さい爆発、徹甲榴弾など(の予定。現在は00機体の爆発。01ミサイルの爆発。))
	int flag;//エフェクトが存在していいかどうか
}effect_t;

コード:

#define PI 3.1415926

#define MENU_ELEMENT 3			//メニューの項目数

#define UNIT_STATUS_MAX	2		//勢力の最大数
#define UNIT_MEMBER_MAX 4		//1勢力が一度に持てるUnitの数。

#define X_WINDOW_MAX 960
#define X_WINDOW_MIN 0
#define Y_WINDOW_MAX 720
#define Y_WINDOW_MIN 0

#define X_FIELD_MAX 1920
#define X_FIELD_MIN 0
#define Y_FIELD_MAX 1440
#define Y_FIELD_MIN 0

#define UNIT_BULLET_MAX 250	//player一人が持つことができるbullet
#define UNIT_MISSILE_MAX 250	//player一人が持つことができるMISSILE

#define BULLET_KND_MAX 3
#define MISSILE_KND_MAX 3

#define EFFECT_MAX 250//同時に出現できるEFFECTの数

#define HIT_EFFECT_NUMBER_0 4		//EFFECT1の枚数。種類ごとに違う。
#define EXPLOSION_EFFECT_NUMBER_0 4
#define EXPLOSION_EFFECT_NUMBER_1 8

コード:

#include "head.h"
//一時的な画像表示を管理する
void effect_raise(double x,double y,int status,int knd,double angle){//座標、グループ、種類、角度
	switch(status){
		case 0://グループでわける。//被弾
			for(int k=0;k<EFFECT_MAX;k++){
				if(effect[k].flag==0){
					effect[k].flag=1;
					effect[k].x=x;
					effect[k].y=y;
					effect[k].status=status;
					effect[k].knd=knd;
					effect[k].count=0;
					effect[k].angle=angle-PI/2;
					break;
				}
			}
			break;
		case 1://爆発
			for(int k=0;k<EFFECT_MAX;k++){
				if(effect[k].flag==0){
					effect[k].flag=1;
					effect[k].x=x;
					effect[k].y=y;
					effect[k].status=status;
					effect[k].knd=knd;
					effect[k].count=0;
					effect[k].angle=angle-PI/2;
					break;
				}
			}
			break;
		default:
			break;
	}
}

void effect_refresh(void){
	for(int i=0;i<EFFECT_MAX;i++){					//
		if(effect[i].flag==1){						//フラグが立っているeffect構造体を探して、
			switch(effect[i].status){//グループ分岐
				case 0://被弾
						switch(effect[i].knd){					//EFFECTの種類で分岐する
							case 0:			
								if(effect[i].count==HIT_EFFECT_NUMBER_0){
									effect[i].flag=0;
								}else{
									effect[i].count++;						//カウントする。
								}
								break;
							default:
								break;
						}
					break;
				case 1://爆発

						switch(effect[i].knd){					//EFFECTの種類で分岐する
							case 0:			
								if(effect[i].count==EXPLOSION_EFFECT_NUMBER_0){
									effect[i].flag=0;
								}else{
									effect[i].count++;						//カウントする。
								}
								break;
							case 1:
								if(effect[i].count==EXPLOSION_EFFECT_NUMBER_1){
									effect[i].flag=0;
								}else{
									effect[i].count++;						//カウントする。
								}
								break;

							default:
								break;
						}
					break;
				default:
					break;
			}
		}
	}
}

void hit_effect_draw(void){//draw.cpp→
	for(int i=0;i<EFFECT_MAX;i++){
		if(effect[i].flag==1){									//フラグが立っているEFFECTを探す。
			switch(effect[i].status){
				case 0://被弾
					switch(effect[i].knd){								//そのEFFECTの種類で分岐する
						case 0:												//エフェクト1だったら
							DrawRotaGraph( (int)(effect[i].x - window_coordinate.x), (int)(effect[i].y - window_coordinate.y), 1.0, effect[i].angle, hit_effect_knd0[effect[i].count], TRUE );//エフェクト1の、フラグが立っていたエフェクトカウント目の分割された画像を表示する。
							break;
						default:
							break;
					}
					break;

				case 1://爆発
					switch(effect[i].knd){								//そのEFFECTの種類で分岐する
						case 0:												//エフェクト1だったら
							DrawRotaGraph( (int)(effect[i].x - window_coordinate.x), (int)(effect[i].y - window_coordinate.y), 1.0, effect[i].angle, explosion_effect_knd0[effect[i].count], TRUE );//エフェクト1の、フラグが立っていたエフェクトカウント目の分割された画像を表示する。
							break;
						case 1:
							DrawRotaGraph( (int)(effect[i].x - window_coordinate.x), (int)(effect[i].y - window_coordinate.y), 1.0, effect[i].angle, explosion_effect_knd1[effect[i].count], TRUE );//エフェクト1の、フラグが立っていたエフェクトカウント目の分割された画像を表示する。
							break;
						default:
							break;
					}
					break;
				default:
					break;
			}
		}
	}
}
添付ファイル
Release.zip
(4.17 MiB) ダウンロード数: 118 回

アバター
LisetteLander
記事: 147
登録日時: 14年前
住所: 東京

Re: エフェクトの画像を表示すると画面がチラつく?

#2

投稿記事 by LisetteLander » 14年前

失礼しました、添付してあるファイルで、プレイヤーはミサイルを発射できません。
付近にいる味方か、敵はミサイルしか撃ってこれない設定なので・・・(ひょっとしたらエフェクトが発生するところがみれないかも?

ARCS

Re: エフェクトの画像を表示すると画面がチラつく?

#3

投稿記事 by ARCS » 14年前

もしeffect_refresh→hit_effect_drawの順にコールされるのであれば、
countは8枚エフェクトなら、8までカウントされますが大丈夫でしょうか?
0~7のつもりが配列外アクセスをしてしまって、別の画像を表示してしまっている等。

閉鎖

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