プレイヤー消滅エフェクト
Posted: 2017年1月04日(水) 23:10
プレイヤーの消滅エフェクトを作成しているのですが
消滅エフェクトのフラグを立てる所でエラーが出てしまいます
分かる方いましたら
教えていただきたいです。
このサイトを参考にして制作しています
http://bituse.info/game/shot/18
消滅エフェクトのフラグを立てる所でエラーが出てしまいます
分かる方いましたら
教えていただきたいです。
このサイトを参考にして制作しています
http://bituse.info/game/shot/18
[playereffect.h]
#pragma once
struct PEFFECT_EXPAND
{
double x, y;
double rad;
int speed;
};
class EFFECT_PDEAD {
private:
//座標
double x, y;
//画像のサイズ
int width[3];
int height[3];
//グラフィックハンドル
int gh[3];
//拡大率
double rate;
//透明度
int alpha;
//パーティクルエフェクト構造体
PEFFECT_EXPAND expand[EFFECT_PDEADNUM];
//回転させる画像用の角度
double rota;
//カウント
int count;
//実行中かどうかのフラグ
bool flag;
private:
void Move();
void Draw();
public:
EFFECT_PDEAD();
void SetFlag(double x, double y);
bool GetFlag();
void All();
};
[playereffect.cpp]
#include"pch.h"
#include"control.h"
#include<ctime>
#include<cstdlib>
#include<math.h>
EFFECT_PDEAD::EFFECT_PDEAD()
{
gh[0] = LoadGraph("DATA/BG/playereffect1.png");
gh[1] = LoadGraph("DATA/BG/playereffect2.png");
gh[2] = LoadGraph("DATA/BG/playereffect3.png");
for (int i = 0; i < 3; i++)
{
GetGraphSize(gh[i], &width[i], &height[i]);
}
rate = 1;
alpha = 255;
count = 0;
flag = false;
srand((unsigned int)time(NULL));
}
void EFFECT_PDEAD::Move()
{
//初回だけ角度を保存
if (count == 0)
{
for (int i = 0; i < EFFECT_PDEADNUM; i++)
{
expand[i].rad = rand() % 628 / 100;
expand[i].speed = rand() % 10;
expand[i].x = x;
expand[i].y = y;
}
}
rate = 0.5 + (count*0.05);
alpha = 255 - (255 / 40)*count;
rota = 0.05*count;
//座標の移動
for (int i = 0; i < EFFECT_PDEADNUM; i++)
{
expand[i].x += cos(expand[i].rad)*expand[i].speed;
expand[i].y += sin(expand[i].rad)*expand[i].speed;
}
++count;
if (count == 40)
{
flag = false;
count = 0;
}
}
void EFFECT_PDEAD::Draw()
{
SetDrawBlendMode(DX_BLENDMODE_ALPHA, alpha);
//円形のエフェクト描画
DrawRotaGraph(x, y, rate, 0, gh[0], TRUE);
//円盤のエフェクト描画(2つ)
DrawRotaGraph(x, y, 1.0, rota, gh[1], TRUE);
DrawRotaGraph(x, y, 1.0, 6.26 - rota, gh[1], TRUE);
//パーティクルエフェクト描画
for (int i = 0; i < EFFECT_PDEADNUM; i++)
{
DrawGraph(expand[i].x - width[2] / 2, expand[i].y - height[2] / 2, gh[2], TRUE);
}
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
}
void EFFECT_PDEAD::All()
{
//フラグが立っているときだけ実行
if (flag)
{
Move();
Draw();
}
}
void EFFECT_PDEAD::SetFlag(double x, double y)
{
count = 0;
flag = true;
this->x = x;
this->y = y;
}
bool EFFECT_PDEAD::GetFlag()
{
return flag;
}
[player.h]
class PLAYER{
private:
//x座標,y座標
double x,y;
//画像幅
int width,height;
//グラフィックハンドル格納用配列
int gh[12];
//移動係数
float move;
//横方向と縦方向のカウント数。
int xcount,ycount;
//添字用変数
int ix,iy,result;
//プレイヤーのライフ
int life;
bool damageflag;
bool endflag;
//ダメージ中のカウント
int dcount;
//弾
SHOT shot[PSHOT_NUM];
//カウント
int count;
bool s_shot;
bool s_dead;
int effect_pdead;
private:
void Move();
void Draw();
void Shot();
public:
bool All();
PLAYER();
bool GetShotSound();
bool GetDeadSound();
bool GetShotPosition(int index, double *x, double *y);
void SetShotFlag(int index, bool flag);
void GetPosition(double *x, double *y);
void SetDamageFlag();
bool GetDamageFlag();
};
[player.cpp]
#include "pch.h"
#include"control.h"
//***********************************************************************************************
//
// コンストラクタ(初期設定)
//
//***********************************************************************************************
PLAYER::PLAYER()
{
//画像読み込み
if(-1==LoadDivGraph("DATA/CHR/char_org.png",12,3,4,29,40,gh))
{
MSG("エラー発生");
}
width=29;
height=40;
//移動係数
move=1.0f;
//横方向と縦方向のカウント数。
xcount=0,ycount=0;
//添字用変数
ix=0,iy=0,result=0;
//初期位置
x=180;
y=400;
//生死確認
life = 1;
//弾初期化
memset(shot, 0, sizeof(shot));
//弾画像読み込み
int temp = LoadGraph("DATA/BG/shot_org.png");
int w, h;
GetGraphSize(temp, &w, &h);
//フラグ全部falseにしとく
//グラッフィックハンドルと画像のサイズを代入しとく
for (int i = 0; i < PSHOT_NUM; ++i)
{
shot[i].flag = false;
shot[i].gh = temp;
shot[i].width = w;
shot[i].height = h;
}
count = 0;
dcount = 0;
damageflag = false;
s_dead = false;
}
//***********************************************************************************************
//
// 動作
//
//***********************************************************************************************
void PLAYER::Move()
{
if(key[KEY_INPUT_LEFT]==1 || key[KEY_INPUT_RIGHT]==1)
{
if(key[KEY_INPUT_UP]==1 || key[KEY_INPUT_DOWN]==1)
{
//移動係数を0.71に設定
move=0.71f;
}
else
{
//斜めじゃなければ1.0に設定
move=1.0f;
}
}
else if(key[KEY_INPUT_UP]==1 || key[KEY_INPUT_DOWN]==1)
{
move=1.0f;
}
if(key[KEY_INPUT_LEFT]==1)
{
x-=(int)PLAYER_SPEED*move;
}
if(key[KEY_INPUT_RIGHT]==1)
{
x+=(int)PLAYER_SPEED*move;
}
if(key[KEY_INPUT_UP]==1)
{
y-=(int)PLAYER_SPEED*move;
}
if(key[KEY_INPUT_DOWN]==1)
{
y+=(int)PLAYER_SPEED*move;
}
//左キーが押されてて、かつxcountが0以上なら0にしてから1引く。
//それ以外は1引く
if(key[KEY_INPUT_LEFT]==1)
{
if(xcount>0)
xcount=0;
--xcount;
}
//右キーが押されてて、かつxcountが0以下なら0にしてから1足す。
//それ以外は1引く
if(key[KEY_INPUT_RIGHT]==1)
{
if(xcount<0)
xcount=0;
++xcount;
}
//上キーが押されてて、かつycountが0以上なら0にしてから1引く。
//それ以外は1引く
if(key[KEY_INPUT_UP]==1)
{
if(ycount>0)
ycount=0;
--ycount;
}
//下キーが押されてて、かつycountが0以下なら0にしてから1足す。
//それ以外は1足す
if(key[KEY_INPUT_DOWN]==1)
{
if(ycount<0)
ycount=0;
++ycount;
}
//カウント数から添字を求める。
ix=abs(xcount)%30/10;
iy=abs(ycount)%30/10;
//xカウントがプラスなら右向きなので2行目の先頭添字番号を足す。
if(xcount>0)
{
ix+=3;
result=ix;
}
else if(xcount<0)
{
//マイナスなら左向きなので、4行目の先頭添字番号を足す。
ix+=9;
result=ix;
}
//yカウントがプラスなら下向きなので、3行目の先頭添字番号を足す。
if(ycount>0)
{
iy+=6;
result=iy;
}
else if(ycount<0)
{
//1行目の先頭添字番号は0なので何もする必要なし。(分かりやすくするために書いときました)
iy+=0;
result=iy;
}
//斜め移動の場合は横顔を優先
if(move==0.71f)
result=ix;
//押されてなければカウントをゼロにする。
if(key[KEY_INPUT_LEFT]!=1 && key[KEY_INPUT_RIGHT]!=1)
{
xcount=0;
}
if(key[KEY_INPUT_UP]!=1 && key[KEY_INPUT_DOWN]!=1)
{
ycount=0;
}
//< span class="strees">
//キャラの移動制御
if (x > 400 - MARGIN)
{
x = 400 - MARGIN;
}
else if (x < MARGIN)
{
x = MARGIN;
}
if (y > 480 - height / 2 - MARGIN)
{
y = 480 - height / 2 - MARGIN;
}
else if (y < height / 2 + MARGIN)
{
y = height / 2 + MARGIN;
}
//←キーが押されてて、かつxcountが0以上なら0にしてから1引く
//それ以外は1引く
if (key[KEY_INPUT_LEFT] == 1)
{
if (xcount > 0)
xcount = 0;
--xcount;
}
//→キーが押されてて、かつxcountが0以下なら0にしてから1足す
//それ以外は1引く
if (key[KEY_INPUT_RIGHT] == 1)
{
if (xcount < 0)
xcount = 0;
++xcount;
}
//↑キーが押されてて、かつycountが0以下なら0にしてから1足す
//それいがいは1引く
if (key[KEY_INPUT_UP] == 1)
{
if (ycount > 0)
ycount = 0;
--ycount;
}
//↓キーが押されてて、かつycountが0以下なら0にしてから1足す
//それいがいは1足す
if (key[KEY_INPUT_DOWN] == 1)
{
if (ycount < 0)
ycount = 0;
++ycount;
}
//カウント数から添字を求める
ix = abs(xcount) % 30 / 10;
iy = abs(ycount) % 30 / 10;
//xカウントがプラスなら右向きなので2行目の先頭添字番号を足す
if (xcount > 0)
{
ix += 3;
result = ix;
}
else if (xcount < 0)
{
//マイナスなら左向きなので4行目の先頭添字を足す
ix += 9;
result = ix;
}
//yカウントがプラスなら下向きなので,3行目の先頭添字を足す
if (ycount > 0)
{
iy += 6;
result = iy;
}
else if (ycount < 0)
{
//1行目の先頭添字番号は0なので何も刷る必要なし
iy += 0;
result = iy;
}
//斜めの移動の場合は横顔を優先
if (move == 0.71f)
result = ix;
//描画
DrawGraph(x - width / 2, y - height / 2, gh[result], TRUE);
//押されていなければカウントをゼロにする
if (key[KEY_INPUT_LEFT] != 1 && key[KEY_INPUT_RIGHT != 1])
{
xcount = 0;
}
if (key[KEY_INPUT_UP] != 1 && key[KEY_INPUT_DOWN] != 1)
{
ycount = 0;
}
}
//***********************************************************************************************
//
// 描画処理
//
//***********************************************************************************************
void PLAYER::Draw()
{
//弾描画
for (int i = 0; i<PSHOT_NUM; ++i)
{
if (shot[i].flag) {
DrawGraph(shot[i].x - shot[i].width / 2, shot[i].y - shot[i].height / 2, shot[i].gh, TRUE);
}
}
//生きてれば描画
if (damageflag)
{
if (dcount>20)
{
if (dcount % 2 == 0)
{
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 140);
DrawGraph(PLAYER_INITX - width / 2, PLAYER_INITY - height / 2 + 60 - (dcount - 20), gh[1], TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
}
else
{
DrawGraph(PLAYER_INITX - width / 2, PLAYER_INITY - height / 2 + 60 - (dcount - 20), gh[1], TRUE);
}
}
++dcount;
if (dcount == 80)
{
damageflag = false;
dcount = 0;
//座標を初期値に戻す
x = PLAYER_INITX;
y = PLAYER_INITY;
//上向きの画像にする
result = 1;
}
}
else
{
//通常描画
DrawGraph(x - width / 2, y - height / 2, gh[result], TRUE);
}
}
//***********************************************************************************************
//
// 弾処理
//
//***********************************************************************************************
void PLAYER::Shot()
{
s_shot = false;
if (!damageflag)
{
//キーが押されててかつ、6ループに一回発射
if (key[KEY_INPUT_Z] == 1 && count % 6 == 0)
{
for (int i = 0; i < PSHOT_NUM; ++i)
{
if (shot[i].flag == false)
{
shot[i].flag = true;
shot[i].x = x;
shot[i].y = y;
break;
}
}
//ショットサウンドフラグを立てる
s_shot = true;
}
//弾を移動させる処理
for (int i = 0; i < PSHOT_NUM; ++i)
{
//発射してる弾だけ
if (shot[i].flag)
{
shot[i].y -= PSHOT_SPEED;
//画面の外にはみ出したらフラグを戻す
if (shot[i].y < -10)
{
shot[i].flag = false;
}
}
}
}
}
//***********************************************************************************************
//
// 位置処理(プレイヤー、弾)
//
//***********************************************************************************************
void PLAYER::GetPosition(double *x, double *y)
{
*x = this->x;
*y = this->y;
}
bool PLAYER::GetShotPosition(int index, double *x, double *y)
{
if (shot[index].flag)
{
*x = shot[index].x;
*y = shot[index].y;
return true;
}
else
{
return false;
}
}
void PLAYER::SetDamageFlag()
{
damageflag = true;
//消滅エフェクトのフラグを立てる
//ここでエラーが出ます。
effect_pdead.SetFlag(x, y);
}
bool PLAYER::GetDamageFlag()
{
return damageflag;
}
void PLAYER::SetShotFlag(int index, bool flag)
{
shot[index].flag = flag;
}
bool PLAYER::GetShotSound()
{
return s_shot;
}
bool PLAYER::GetDeadSound()
{
return s_dead;
}
//***********************************************************************************************
//
// All関数
//
//***********************************************************************************************
bool PLAYER::All()
{
//消滅していないときだけ実行
if (!damageflag)
{
Move();
}
Shot();
Draw();
count++;
return endflag;
}
[code]
[pch.h]
//警告を消すための記述
#pragma warning(disable:4244)
#define _CRT_SECURE_NO_WARNINGS
//DXライブラリとdefine.hの取り込み
#include "DxLib.h"
#include "define.h"