2017-05-03 80 views
0

我遇到下面的代码有问题。除了XCoordYCoord变量外,我的一切正常。在ChangePosition方法中,如果XCoord不等于50,那么我想添加25到XCoord,然后将XCoord重置为0,并且如果XCoord = 50YCoord isnt equal to 50将25添加到YCoord局部变量超出范围......我想

什么我已经通过调试发现是,当ChangePosition方法返回XCoordYCoord他们恢复到0当调试继续通过switch声明。我认为它与XCoordYCoord超出范围(不是100%确定这是否是实际问题)有关,也是return XCoord, YCoord语法合法吗?我使用Visual Studio,并没有说它错了,但我不确定。

我认为它必须是以上两个原因之一,为什么变量没有改变。 我试着用LoadLevel方法中的2个变量初始化结构Coords coords;,并将结构传递给ChangePosition方法,但是之后我必须将变量声明为静态整数,然后导致LNK2001错误:我认为这有些事要做试图用Coords::XCoord += 25来调整变量。但我无法使用coords.XCoord,因为该结构没有在ChangePosition方法中声明,所以我得到一个关于类型名称未被识别的错误(沿着这些行的东西)。

void TileMap::LoadLevel(HINSTANCE hInstance) 
{ 

    LPCSTR szFileName1("..\\Assets\\TILE_01.bmp"); 
    LPCSTR szFileName2("..\\Assets\\Tile_02.bmp"); 
    LPCSTR szFileName3("..\\Assets\\Tile_03.bmp"); 

    Sprite* Tile_01 = new Sprite(); /*Tile_01 is the grass sprite*/ 
    Sprite* Tile_02 = new Sprite(); /*Tile_02 is the wall sprite*/ 
    Sprite* Tile_03 = new Sprite(); /*Tile_03 is the end point sprite*/ 

    int XCoord = 0; 
    int YCoord = 0; 

    const int Columns = 3; 
    const int Rows = 3; 

    char MazeMap[Rows][Columns] = { 
     {1,2,3}, 
     {1,2,3}, 
     {1,2,3} 
    }; 

    for (int x = 0; x < Rows; x++) 
    { 
     for (int y = 0; y < Columns; y++) 
     { 
      switch (MazeMap[x][y]) 
      { 
      case GRASS: /*TILE_01*/ 
       Tile_01->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0); 
       Tile_01->LoadSprite(hInstance, szFileName1, XCoord, YCoord, 25, 25); 
       Tile_01->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile 

       ChangePosition(XCoord, YCoord); //Change position 
       break; 

      case WALL: /*TILE_02*/ 
       Tile_02->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0); 
       Tile_02->LoadSprite(hInstance, szFileName2, XCoord, YCoord, 25, 25); 
       Tile_02->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile 

       ChangePosition(XCoord, YCoord); //Change position 
       break; 

      case END: /*TILE_03*/ 
       Tile_03->Create(DirectDraw::GetInstance()->GetDDObject(), 25, 25, 0); 
       Tile_03->LoadSprite(hInstance, szFileName3, XCoord, YCoord, 25, 25); 
       Tile_03->Draw(DirectDraw::GetInstance()->GetBackBuffer(), XCoord, YCoord, 25, 25); //Draw Tile 

       ChangePosition (XCoord, YCoord); //Change position 
       break; 
      } 
     } 
    } 

} 

/* 
This method changes the XCoord and YCoord to pass into the sprite draw method 
so the tile is drawn in the correct position 
*/ 
int TileMap::ChangePosition(int XCoord, int YCoord) 
{ 
    if (XCoord != 50) //if (XCoord != screenWidth) //Change position 
    { 
     XCoord += 25; 
    } 
    else if (XCoord == 50 && YCoord != 50) //else if (XCoord == screenWidth && YCoord != screenHeight) 
    { 
     XCoord = 0; 
     YCoord += 25; 
    } 
    return XCoord, YCoord 
} 
+0

您不能在一个'return'语句中返回两件事情。 '返回XCoord,YCoord'是有效的,但它使用逗号运算符,所以它相当于'return YCoord'。 – Barmar

+0

即使您可以返回多个值,也不会将该函数的结果分配给任何东西。 – Barmar

回答

1

默认情况下,函数参数按值传递。这意味着当您在函数中分配参数变量时,它们对调用者的变量没有影响。

您可以更改函数以通过引用来获取其参数。然后分配将修改调用者的变量。

void TileMap::ChangePosition(int &XCoord, int &YCoord) 
{ 
    if (XCoord != 50) //if (XCoord != screenWidth) //Change position 
    { 
     XCoord += 25; 
    } 
    else if (XCoord == 50 && YCoord != 50) //else if (XCoord == screenWidth && YCoord != screenHeight) 
    { 
     XCoord = 0; 
     YCoord += 25; 
    } 
} 

您不需要从此函数返回任何内容,因为它会修改参数。我已将其更改为void函数。

return XCoord, YCoord;是有效的语法,但它不符合你的想法。请参阅How does the Comma Operator work

+0

致OP。如果你想返回两件事情,可以考虑使用标准库''中的'std :: pair'。当然,这里并不需要。 – cppxor2arr