情况:

  • 项目符号继承自GameObject。
  • GameObject具有方法'GetCoords'和'SetCoords'
  • 项目符号具有方法'MoveObject'
  • 'MoveObject'从'GetCoords'获取坐标,将其设置在'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);
    }
    

    我尝试了'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/

    10-13 08:52