エフェクトの画像を表示すると画面がチラつく?
Posted: 2011年9月08日(木) 02:02
着弾エフェクト(4枚)とまったく同じ文法でミサイルの爆発エフェクト(8枚)を描いたのですが(というかコピペです)
本来表示されるエフェクトとは別に画面全体によくわからないものが一瞬表示されます。
画像自体の透明化、文法での透過判断もしていますし枚数を記述したリテラルも#defineで宣言。
もちろん、エフェクト自体も分岐こそありますが内容を爆発用にしただけのコピペです。
先日この掲示板で教わったprintfデバック法も試したりブレークポイントも試みましたが、描画時に発生するようで・・・
また、Resourcesはゲーム本体です。
本来表示されるエフェクトとは別に画面全体によくわからないものが一瞬表示されます。
画像自体の透明化、文法での透過判断もしていますし枚数を記述したリテラルも#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;
}
}
}
}