Skip to content

effect 実装

tkr987 edited this page Aug 8, 2018 · 1 revision

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);
}

コンパイルして実行する。
effect

Clone this wiki locally