2017-05-03 141 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