#5
by ヨッシー » 2年前
Define::PBULLET_NUMについてのエラー内容は「式には定数値が必要です。メンバー"Define::PBULLET_NUM"を定数の値として使うことはできません。」というものです。
あと、調べなおしてみると静的メンバというのはstaticがついているもののことを言うようですね。。失礼しました。
今日の進捗としては、PlayerBulletにてPlayerOptionの座標を参照しようと思った時、PlayerOptionのインスタンスを作る必要があると思って自分なりにやってみました。
コード:
PlayerOption.h
#pragma once
#include "Task.h"
#include "Player.h"
class PlayerOption : public Task
{
friend class PlayerOptionCollection;
friend class PlayerBulletCollection;
public:
PlayerOption();
virtual ~PlayerOption() = default;
void draw() const override;
bool update() override;
protected:
float _x, _y; //座標
int cnt; //カウンタ用変数
};
class PlayerOptionCollection : public Task
{
friend class PlayerOption;
public:
PlayerOptionCollection();
virtual ~PlayerOptionCollection() = default;
bool update() override;
void draw() const override;
private:
PlayerOption Option[4];
void move();
float _x, _y; //Playerクラスの_x,_yと同じ動きをさせる。
};
PlayerOption.cpp
#include "PlayerOption.h"
#include "Pad.h"
#include <DxLib.h>
#include "Image.h"
#include "Define.h"
#include "Looper.h"
const static float SPEED = 9;
PlayerOption::PlayerOption() :
_x((float)Define::CENTER_X),
_y((float)Define::OUT_H * 0.8f)
{
cnt = 0;
}
void PlayerOption::draw() const
{
DrawRotaGraphF(_x, _y, 1.5, Define::PI / 180 * cnt, Image::getIns()->getPlayerOption(), TRUE);
}
bool PlayerOption::update()
{
return true;
}
PlayerOptionCollection::PlayerOptionCollection() :
_x((float)Define::CENTER_X),
_y((float)Define::OUT_H * 0.8f)
{
}
bool PlayerOptionCollection::update()
{
for (int i = 0; i < 4; i++) {
Option[i].cnt++;
}
void move();
return true;
}
void PlayerOptionCollection::draw() const
{
for (int i = 0; i < 4; i++) {
Option[i].draw();
}
}
void PlayerOptionCollection::move() //Playerクラスと同じ処理を行い、その値をPlayerOption Option[]の座標の更新の際に用いる。
{
float moveX = 0, moveY = 0;
if (Pad::getIns()->get(ePad::left) > 0) { //左移動
moveX -= SPEED;
}
if (Pad::getIns()->get(ePad::right) > 0) { //右移動
moveX += SPEED;
}
if (Pad::getIns()->get(ePad::down) > 0) { //下移動
moveY += SPEED;
}
if (Pad::getIns()->get(ePad::up) > 0) { //上移動
moveY -= SPEED;
}
if (moveX && moveY) { //斜め移動
moveX /= (float)sqrt(2.0);
moveY /= (float)sqrt(2.0);
}
if (Pad::getIns()->get(ePad::slow) > 0) { //低速移動
moveX /= 3;
moveY /= 3;
}
if (moveX + _x < Define::IN_X) { //左枠より左なら
_x = (float)Define::IN_X; //左枠で止める
}
else if (moveX + _x > Define::IN_X + Define::IN_W) { //右枠より右なら
_x = (float)(Define::IN_X + Define::IN_W); //右枠で止める
}
else { //枠内なら
_x += moveX; //普通に移動
}
if (moveY + _y < Define::IN_Y) { //上枠より上なら
_y = (float)Define::IN_Y; //上枠で止める
}
else if (moveY + _y > Define::IN_Y + Define::IN_H) { //下枠より下なら
_y = (float)(Define::IN_Y + Define::IN_H); //下枠で止める
}
else { //枠内なら
_y += moveY; //普通に移動
}
for (int i = 0; i < 4; i++) { //上で計算した_x, _yに自機から見たオプションの座標coption0posを足したものを代入する。
Option[i]._x = _x + Define::coption0pos_x[i];
Option[i]._y = _y + Define::coption0pos_y[i];
}
}
このコードでコンパイルも無事通り、いざデバッグしてみると、今度はオプションの画像が最初の場所で動かずに重なって表示されてしまいました。自分なりにPlayerOption::draw()で変数(_x, _y, cnt)を参照するときにPlayerOptionのコンストラクタの値が用いられているのではと考えましたが、画像を回転させながら描画させるDefine::PI / 180 * cntが問題なく処理できていたので見当違いだと思われます。この事と最初の場所から動かない事からソースコードの一番最後のfor文によるOption[]の座標の更新がうまくいっていないと思うのですが、どう変更したらいいのかがイマイチうかばず、、アドバイスをいただきたいです。
Define::PBULLET_NUMについてのエラー内容は「式には定数値が必要です。メンバー"Define::PBULLET_NUM"を定数の値として使うことはできません。」というものです。
あと、調べなおしてみると静的メンバというのはstaticがついているもののことを言うようですね。。失礼しました。
今日の進捗としては、PlayerBulletにてPlayerOptionの座標を参照しようと思った時、PlayerOptionのインスタンスを作る必要があると思って自分なりにやってみました。
[code]
PlayerOption.h
#pragma once
#include "Task.h"
#include "Player.h"
class PlayerOption : public Task
{
friend class PlayerOptionCollection;
friend class PlayerBulletCollection;
public:
PlayerOption();
virtual ~PlayerOption() = default;
void draw() const override;
bool update() override;
protected:
float _x, _y; //座標
int cnt; //カウンタ用変数
};
class PlayerOptionCollection : public Task
{
friend class PlayerOption;
public:
PlayerOptionCollection();
virtual ~PlayerOptionCollection() = default;
bool update() override;
void draw() const override;
private:
PlayerOption Option[4];
void move();
float _x, _y; //Playerクラスの_x,_yと同じ動きをさせる。
};
PlayerOption.cpp
#include "PlayerOption.h"
#include "Pad.h"
#include <DxLib.h>
#include "Image.h"
#include "Define.h"
#include "Looper.h"
const static float SPEED = 9;
PlayerOption::PlayerOption() :
_x((float)Define::CENTER_X),
_y((float)Define::OUT_H * 0.8f)
{
cnt = 0;
}
void PlayerOption::draw() const
{
DrawRotaGraphF(_x, _y, 1.5, Define::PI / 180 * cnt, Image::getIns()->getPlayerOption(), TRUE);
}
bool PlayerOption::update()
{
return true;
}
PlayerOptionCollection::PlayerOptionCollection() :
_x((float)Define::CENTER_X),
_y((float)Define::OUT_H * 0.8f)
{
}
bool PlayerOptionCollection::update()
{
for (int i = 0; i < 4; i++) {
Option[i].cnt++;
}
void move();
return true;
}
void PlayerOptionCollection::draw() const
{
for (int i = 0; i < 4; i++) {
Option[i].draw();
}
}
void PlayerOptionCollection::move() //Playerクラスと同じ処理を行い、その値をPlayerOption Option[]の座標の更新の際に用いる。
{
float moveX = 0, moveY = 0;
if (Pad::getIns()->get(ePad::left) > 0) { //左移動
moveX -= SPEED;
}
if (Pad::getIns()->get(ePad::right) > 0) { //右移動
moveX += SPEED;
}
if (Pad::getIns()->get(ePad::down) > 0) { //下移動
moveY += SPEED;
}
if (Pad::getIns()->get(ePad::up) > 0) { //上移動
moveY -= SPEED;
}
if (moveX && moveY) { //斜め移動
moveX /= (float)sqrt(2.0);
moveY /= (float)sqrt(2.0);
}
if (Pad::getIns()->get(ePad::slow) > 0) { //低速移動
moveX /= 3;
moveY /= 3;
}
if (moveX + _x < Define::IN_X) { //左枠より左なら
_x = (float)Define::IN_X; //左枠で止める
}
else if (moveX + _x > Define::IN_X + Define::IN_W) { //右枠より右なら
_x = (float)(Define::IN_X + Define::IN_W); //右枠で止める
}
else { //枠内なら
_x += moveX; //普通に移動
}
if (moveY + _y < Define::IN_Y) { //上枠より上なら
_y = (float)Define::IN_Y; //上枠で止める
}
else if (moveY + _y > Define::IN_Y + Define::IN_H) { //下枠より下なら
_y = (float)(Define::IN_Y + Define::IN_H); //下枠で止める
}
else { //枠内なら
_y += moveY; //普通に移動
}
for (int i = 0; i < 4; i++) { //上で計算した_x, _yに自機から見たオプションの座標coption0posを足したものを代入する。
Option[i]._x = _x + Define::coption0pos_x[i];
Option[i]._y = _y + Define::coption0pos_y[i];
}
}
[/code]
このコードでコンパイルも無事通り、いざデバッグしてみると、今度はオプションの画像が最初の場所で動かずに重なって表示されてしまいました。自分なりにPlayerOption::draw()で変数(_x, _y, cnt)を参照するときにPlayerOptionのコンストラクタの値が用いられているのではと考えましたが、画像を回転させながら描画させるDefine::PI / 180 * cntが問題なく処理できていたので見当違いだと思われます。この事と最初の場所から動かない事からソースコードの一番最後のfor文によるOption[]の座標の更新がうまくいっていないと思うのですが、どう変更したらいいのかがイマイチうかばず、、アドバイスをいただきたいです。