基于C ++文本的RPG游戏地图旅行问题

时间:2014-01-06 13:35:56

标签: c++

在来到这里之前我尝试过很多东西,但我似乎无法解决我的问题!

我有一个随机生成的地图,这是一个存储切片对象的数组。这是在启动时随机生成的。 我有玩家坐标设置功能,根据地图旅行改变坐标。 然后我有一个函数,它返回基于玩家坐标存储在地图数组中的内容。 在坐标的构造函数中,我必须将x和y pos设置为0,否则代码将不会运行。

因此,当我运行代码时,它会显示第一个瓷砖,当我行进N,E,S或W时,它会显示新的瓷砖,但是x和y坐标只保留0,它们不会随着我的旅行调整,我想也许这与构造函数有关:

Player::Player()
{
    posX = 0;
    posY = 0;
}
Player::~Player()
{
}

int Player::getX()
{
    return Player::posX;
}
int Player::getY()
{
    return Player::posY;
}
int Player::changeX(int xChange)
{
    int x = getX();
    x = x + xChange;
    posX = x;
    return x;
}
int Player::changeY(int yChange)
{
    int y = getY();
    y = y + yChange;
    posY = y;
    return y;
}

以下是显示图块和坐标的代码部分。

Terrain* GameMenu::playerPos()
{

    Player display;
    Map mapArray;

    return mapArray.map[display.getX()][display.getY()];
}

int GameMenu::doMenu()
{
    while(int loop = 1)
    {
        loop = 1;
        Player display;
        cout << display.getY() << display.getY() <<endl << endl;
        cout << "You are currently in an area that looks like a " 
                << playerPos()->getName()<<endl<<endl;

        cout << "What would you like to do next?"<<endl<<endl;
        cout << "1. Rest" << endl;
        cout << "2. Buy food" << endl;
        cout << "3. Travel" << endl;
        cout << "4. Search" << endl;
        cout << "5. Hunt" << endl;

对不起,如果它有点模糊,这是我第一次做这样的事情,并且非常感谢每一点帮助。

2 个答案:

答案 0 :(得分:3)

播放器被重复创建并作为局部变量销毁。它应该是更长寿的,可能是Game或GameMenu的成员,或者你的main()函数中的一个局部变量,你通过引用传递给你的Game对象。

答案 1 :(得分:1)

你的Terrain* GameMenu::PlayerPos()就像Dori鱼。它不存储地图 - 每次调用它时都会重新创建一个地图,然后在函数结束时删除它。您告诉它地图应该移动的位置,它存储新地图,然后功能结束 - displaymapArray超出范围。你的数据永远消失了。

要在多个函数调用之间存储数据,请考虑使地图和播放器成为函数main()或类GameMenu的成员,如下所示:

class GameMenu
{
public:
     GameMenu()
     {
          m_map = new Map();
          m_player = new Player();
     }
     ~GameMenu()
     {
          delete m_map;
          delete m_player;
     }
     inline Terrain *GetPlayerPos() {return mapArray.map[m_player.getX()][m_player.getY()];};
private:
     Map *m_map;
     Player *m_player;
};

此外,您对Player::changeXPlayer::changeY的代码非常复杂。你为什么不这样做?

int Player::changeX(int delta)
{
     posX += delta;
     return posX;
}
int Player::changeY(int delta)
{
     posY += delta;
     return posY;
}