情况:
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);
}
我尝试了这个> 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());
}
第二个cout 确实有不同的坐标。
创建项目符号的点,当按下空格键时会调用它:
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);
答案 0 :(得分:1)
在我看来,您在基类中的virtual
声明之前缺少MoveObject
关键字。
现在这样,当你有一个GameObject
指针/引用时,它会从MoveObject
而不是GameObject
Bullet
所以也许把它改成
virtual void MoveObject(float changeXPos, float changeYPos);
等
我不确定它是否能解决您的问题,但稍后您可能会遇到其他问题。如果您有c ++ 11可用,则还应该查看override
关键字