从父级到子方法c ++设置值

时间:2016-09-08 10:16:06

标签: c++

情况:

  • Bullet继承自GameObject。
  • GameObject有方法' GetCoords'和' SetCoords'
  • Bullet有方法' MoveObject'
  • ' MoveObject'从GetCoords'获得coord将它们设置在SetCoords'
  • 坐标不会更改

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

1 个答案:

答案 0 :(得分:1)

在我看来,您在基类中的virtual声明之前缺少MoveObject关键字。

现在这样,当你有一个GameObject指针/引用时,它会从MoveObject而不是GameObject

来调用Bullet

所以也许把它改成

virtual void MoveObject(float changeXPos, float changeYPos);

我不确定它是否能解决您的问题,但稍后您可能会遇到其他问题。如果您有c ++ 11可用,则还应该查看override关键字