因此,我正在使用 C++ 中的 sfml 创建游戏,但我的代码没有更新我正确单击的图块。
我使用函数 isTileClicked 来检查图块是否被单击,并将变量 clickedTileRow 和 clickedTileCol 更新为当前单击的图块的行和列。我希望它只更新索引与变量 clickedTileRow 和 clickedTileCol 一致的图块。这里的问题是,当我单击新图块时,它也会更新所有以前单击的图块。
game.h 文件是:
#include <iostream>
#include <SFML/Graphics.hpp>
#ifndef GAME_H
#define GAME_H
static int changer = 0;
class Player;
class Game //class to playGame
{
private:
sf :: RenderWindow window;
sf :: Texture Tex, emptyTile;
sf :: Sprite **sprites;
sf :: Event clickSprite;
int clickedTileRow, clickedTileCol;
Player *p;
public:
Game();
~Game();
sf:: Window& getWindow();
void setSpriteMemory();
sf :: Sprite** getSpritesArr();
void setTexture();
sf::Texture getTexture();
void setBoard();
void setPlayerMemory();
void set_player(Player *player);
Player* getPlayer();
bool isTileClicked(int xCoord, int yCoord);
void playGame();
};
#endif// GAME_H
game.cpp 文件是:
#include "game.h"
#include "player.h"
Game :: Game() : window(sf:: VideoMode(600,800), "TicTacToe")
{
//ask for size of board
sprites = nullptr;
p = nullptr;
clickedTileRow = -1;
clickedTileCol = -1;
}
Game :: ~Game()
{
for(int i = 0; i < 3; i++)
{
delete sprites[i];
}
delete [] sprites;
}
sf:: Window& Game :: getWindow()
{
return window;
}
void Game :: setSpriteMemory()
{
sprites = new sf :: Sprite*[3];
for(int i = 0; i <3; i++)
{
sprites[i] = new sf :: Sprite[3];
}
}
sf :: Sprite** Game :: getSpritesArr()
{
return this->sprites;
}
void Game :: setTexture()
{
Tex.loadFromFile("images/board.png");
emptyTile.loadFromFile("images/board.png");
}
sf::Texture Game :: getTexture()
{
return this->Tex;
}
void Game :: setBoard()
{
for (int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
sprites[i][j].setTexture(getTexture()) ;
sprites[i][j].setScale(0.25f,0.25f);
sprites[i][j].setPosition(sf::Vector2f(i * 130, j * 130));
}
}
}
void Game :: setPlayerMemory()
{
p = new Player;
}
bool Game :: isTileClicked(int xCoord, int yCoord)
{ for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
sf :: FloatRect tileBounds = sprites[i][j].getGlobalBounds();
if(tileBounds.contains(xCoord, yCoord))
{
clickedTileRow = i;
clickedTileCol = j;
return true;
}
}
}
clickedTileRow = -1;
clickedTileCol = -1;
return false;
}
void Game :: playGame()
{
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
// Event handling - Check for window close event
if (event.type == sf :: Event :: Closed) //KeyPressed && event.key.code == sf::Keyboard::Enter
window.close();
//Check for box clicked
else if(event.type == sf :: Event :: MouseButtonPressed)
{
int xCoord = event.mouseButton.x;
int yCoord = event.mouseButton.y;
if( isTileClicked( xCoord, yCoord ) )
{
sprites[clickedTileRow][clickedTileCol].setTexture(this->p->get_currentplayer());
clickedTileRow = -1;
clickedTileCol = -1;
p->change_player( changer );
changer++;
}
}
}
// Update game state here (currently no updates in this example)
// Rendering - Clear the window, draw sprites, and display
window.clear(sf::Color::Black);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
window.draw(sprites[i][j]);
}
}
window.display();
}
}