情况:
GameObject.h
struct Coordinates {
float xPos;
float yPos;
};
//GameObject
class GameObject {
public:
GameObject() {};
GameObject(unsigned int a_id, float a_xPos, float a_yPos, float a_speed, States a_state = State::Idle);
~GameObject();
//Methods
void MoveObject(float changeXPos, float changeYPos);
void MoveObject(float changeYPos);
Coordinates GetCoords() { return Coords; }
void SetCoords(Coordinates a_Coords) { Coords = a_Coords; }
private:
Coordinates Coords;
};
Bullet.h
#pragma once
#include "GameObject.h"
class Bullet : public GameObject {
public:
Bullet(unsigned int a_Id, float a_xPos, float a_yPos, float a_speed, States a_state = State::Idle) : GameObject(a_Id, a_xPos, a_yPos, a_speed, a_state) {}
void MoveObject(float changeYPos);
};
Bullet.cpp
#include "Bullet.h"
void Bullet::MoveObject(float changeYPos)
{
Coordinates coords = GameObject::GetCoords();
coords.yPos += changeYPos;
this->SetCoords(coords);
}
我尝试了'this-> SetCoords();'和“GameObject::GetCoords();”无济于事。
我只是试过这个:
void GameObject::MoveObject(float changeYPos)
{
Coordinates coords = GetCoords();
coords.yPos += changeYPos;
SetCoords(coords);
}
主游戏类
MoveObject被调用的点:
for each (auto bullet in bullets)
{
Coordinates coords = bullet.GetCoords();
std::cout << bullet.GetCoords().xPos << ", " << bullet.GetCoords().yPos << std::endl;
bullet.MoveObject(.3f);
if (bullet.GetCoords().yPos > m_iScreenHeight) {
bullets.erase(bullets.begin());
DestroySprite(bullet.GetId());
break;
}
coords = bullet.GetCoords();
std::cout << bullet.GetCoords().xPos << ", " << bullet.GetCoords().yPos << std::endl;
MoveSprite(bullet.GetId(), bullet.GetCoords().xPos, bullet.GetCoords().yPos);
CheckHitEnemy(bullet.GetCoords().xPos, bullet.GetCoords().yPos, bullet.GetId());
}
第二个提示确实具有不同的坐标。
创建项目符号的点,当按下空格键时会调用该项目:
Bullet bullet(CreateSprite("./images/bullet.jpg", 3, 20, true), xPos, yPos, 1);
MoveSprite(bullet.GetId(), bullet.GetCoords().xPos, bullet.GetCoords().yPos);
bullets.push_back(bullet);
最佳答案
在我看来,您在基类中的virtual
声明之前缺少MoveObject
关键字。
现在的方式是,当您拥有GameObject
指针/引用时,它将从MoveObject
而不是GameObject
调用Bullet
所以也许将其更改为
virtual void MoveObject(float changeXPos, float changeYPos);
等等
我不确定它是否可以解决您的问题,但是稍后您可能会遇到其他问题。如果您有可用的c++ 11,还应该查看
override
关键字关于c++ - 通过子方法C++从父级设置值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39388304/