-
Notifications
You must be signed in to change notification settings - Fork 0
effect 実装
userクラスから弾オブジェクトを射出し、targetクラスと弾オブジェクトの衝突判定をおこない、targetのヘルスが0になったとき爆発エフェクトを描画する処理を実装する。エフェクトを描画するためにはNyaEffect::Draw()を使用してエフェクトを描画する。エフェクトの描画はEffectPropertyXとGraphicPropertyXの組み合わせで実現する。targetクラスにEffectPropertyX1型のEPX変数とGraphicPropertyX4型のエフェクト用GPX変数を追加する。
#pragma once
#include "HNLIB.h"
class TeemoTarget : public HNLIB::NyaTarget
{
public:
void Act(void);
void Draw(void);
TeemoTarget();
private:
HNLIB::GraphicPropertyX4 effect_gpx_;
HNLIB::EffectPropertyX1 epx_;
HNLIB::GraphicPropertyX4 gpx_;
HNLIB::PositionHandle* phandle_;
};まず、エフェクト用の分割画像を読み込む。分割画像の読み込みは4引数バージョンのNyaGraphic::Load()を利用する。
NyaGrahic::Load()のプロトタイプ:
void NyaGrahic::Load(int div_x, int div_y, string file_pass, GraphicFile* file);
- div_x; x方向分割数
- div_y; y方向分割数
- file_pass; ファイルパス
- file; ロードした画像データを格納するポインタ
次に、エフェクトの設定をおこなう。EffectPropertyX1は3つのメンバを持つ。エフェクトを描画するためには3つのメンバ全て設定しておく必要がある。
EffectPropertyX1のメンバ:
- interval_time_frame_; 画像を切り替えるインターバル時間(フレーム数)
- grid_x_; 描画x座標
- grid_y_; 描画y座標
EffectPropertyX1のメンバを設定したらNyaEffect::Draw()を使って描画する。
NyaEffect::Draw()のプロトタイプ:
void NyaEffect::Draw(EffectPropertyX1* epx, GraphicPropertyX4* effect_gpx);
- epx; エフェクトのプロパティ
- effect_gpx; エフェクト用グラフィック・プロパティ
また、衝突したときにPositionHandleのヘルスを減らす処理も実装した。衝突判定が正常なら衝突したときに受けたダメージはPositionHandle::collision_hit_damage_に格納される。なお、collision_hit_damage_の値は1フレーム毎にクリアされるので注意。
#include "HNLIB.h"
#include "TeemoTarget.h"
using namespace std;
using namespace HNLIB;
TeemoTarget::TeemoTarget()
{
// エフェクト用 GraphicPropertyX 設定
NyaGraphic::Load(4, 2, "img/death_effect.png", &effect_gpx_.file_);
// エフェクトの設定
epx_.interval_time_frame_ = 3;
epx_.grid_x_ = 400;
epx_.grid_y_ = 200;
// GraphicPropertyX 設定
gpx_.draw_grid_cx_ = 400;
gpx_.draw_grid_cy_ = 200;
NyaGraphic::Load("img/teemo_target.png", &gpx_.file_);
// PositionHandle 設定
phandle_ = NyaPosition::CreateHandle();
phandle_->collision_range_ = 20;
phandle_->health_ = 5;
phandle_->grid_x_ = 400;
phandle_->grid_y_ = 200;
}
void TeemoTarget::Act(void)
{
// 衝突判定
NyaPosition::Collide(phandle_, eOBJECT::TARGET1);
phandle_->health_ -= phandle_->collision_hit_damage_;
}
void TeemoTarget::Draw(void)
{
// targetの描画
NyaGraphic::Draw(&gpx_, eOBJECT::TARGET1);
if (phandle_->health_ <= 0)
{ // ヘルスが0以下になったらエフェクトを描画してヘルスを3に戻す
NyaEffect::Draw(&epx_, &effect_gpx_, eOBJECT::TARGET_EFFECT1);
phandle_->health_ = 5;
}
}userクラスから30フレーム毎に270度の角度、速度3で弾オブジェクトを射出する処理を実装する。
#pragma once
#include "HNLIB.h"
class TeemoDevice
{
public:
HNLIB::DevicePropertyX1 dpx_;
HNLIB::GraphicPropertyX4 gpx_;
TeemoDevice();
};
class TeemoUser : public HNLIB::NyaUser
{
public:
unsigned int count_frame_;
TeemoDevice device_;
HNLIB::GraphicPropertyX4 gpx_;
HNLIB::PositionHandle* phandle_;
TeemoUser();
void Act(void);
void Draw(void);
};#include <tuple>
#include "TeemoUser.h"
using namespace std;
using namespace HNLIB;
TeemoDevice::TeemoDevice()
{
// DevicePropertyX 設定
dpx_.collision_power_ = 1;
dpx_.collision_range_ = 5;
dpx_.move_angle_deg_ = 270;
dpx_.move_speed_ = 3;
dpx_.create_x_ = 400;
dpx_.create_y_ = 500;
NyaGraphic::Load("img/attack_red1.png", &gpx_.file_);
}
TeemoUser::TeemoUser()
{
// GraphicPropertyX 設定
gpx_.draw_grid_cx_ = 400;
gpx_.draw_grid_cy_ = 500;
NyaGraphic::Load("img/teemo_user.png", &gpx_.file_);
// PositionHandle の設定
phandle_ = NyaPosition::CreateHandle();
phandle_->grid_x_ = 400;
phandle_->grid_y_ = 500;
// 衝突判定するオブジェクトのタイプを宣言
NyaPosition::CollisionPair(eOBJECT::USER_ATTACK1, eOBJECT::TARGET1);
}
void TeemoUser::Act(void)
{
// 30フレーム毎に弾オブジェクトを射出
if (count_frame_ % 30 == 0)
NyaDevice::Attack14(&device_.dpx_, &device_.gpx_, eOBJECT::USER_ATTACK1);
count_frame_++;
}
void TeemoUser::Draw(void)
{
// user の描画
NyaGraphic::Draw(&gpx_, eOBJECT::USER1);
}コンパイルして実行する。
