Board클래스 및 Wall클래스

jh Seo·2023년 7월 21일
0

현재 뱀게임에선 벽과 관련된 부분은
벽하나를 wall클래스로 두고, 벽들을 관리하는 Board클래스 이렇게 나뉘어있다.

Wall.h

#ifndef _Wall_H
#define _Wall_H
#include "ICollidable.h"
#include "IDraw.h"
#include "Snake.h"

class Wall : public ICollidable , public IDraw
{   
public:
    Wall(int tmpPosX,int tmpPosY);
    void Draw();
    void whenCollided(Snake* player);
private:
    int posX;
    int posY;

};

#endif

각 벽은 IDraw, ICollidable을 상속받으며 해당 인터페이스의 가상함수를 구현한다.
멤버변수로는 좌표를 가지고있다.

Wall.cpp

#include"../Include/Wall.h"
#include "ncurses.h"
Wall::Wall(int tmpPosX,int tmpPosY){
    posX=tmpPosX;
    posY=tmpPosY;
}

void Wall::Draw(){
    mvprintw(posX,posY,"X");
}

void Wall::whenCollided(Snake* player){
    player->Die();
}

충돌했을 땐, 플레이어의 Die함수를 호출한다.

Board.h

#ifndef _Board_H
#define _Board_H
#include<ncurses.h>
#include<vector>
#include "IDraw.h"
#include "ICollidable.h"
#include "CollisionManager.h"
#include "Snake.h"
#include "Wall.h"
class Board
{
public:
    Board(vector<IDraw*>& drawableObjects,bool ifMapExist);
    void AddWall(vector<IDraw*>& drawableObjects,int x,int y);
private:
    CollisionManager& colMgr=CollisionManager::GetInstance();
    vector<Wall*> entireBoard;
    int GameBoardSizeXMax;
    int GameBoardSizeYMax;
};

#endif

충돌 처리매니저와
전체 벽을 관리하는 벡터 vector<Wall*>
그리고 게임보드사이즈를 관리하고 있다.

Board.cpp

#include"../Include/Board.h"

Board::Board(vector<IDraw*>& drawableObjects,bool tmpIfMapExist){
    if(tmpIfMapExist) return;
    //text로 된 맵없다면 21로 초기화
    GameBoardSizeXMax=21;
    GameBoardSizeYMax=42;
   for (int i = 0; i < GameBoardSizeXMax; i++)
    {
        for (int j = 0; j < GameBoardSizeYMax; j++)
        {
            if (i == 0 || i == GameBoardSizeXMax - 1)
            {
                AddWall(drawableObjects,i,j);
            }
            else
            {
                if (j == 0 || j == GameBoardSizeYMax - 1)
                {
                    AddWall(drawableObjects,i,j);
                }
            }
        }
    }
}
void Board::AddWall(vector<IDraw*>& drawableObjects,int x,int y){
    entireBoard.push_back(new Wall(x, y));
    drawableObjects.push_back(entireBoard.back());
    colMgr.SetNewCollider({x, y}, entireBoard.back());
}

  • 생성자에선 SnakeGame에서 관리하는
    vector<IDraw*>를 참조해 해당 벡터에 Wall 오브젝트들을 넣어준다.

    tmpIfMapExist는 나중에 텍스트파일이나 다른 스크립트로 맵을 짰을 때,
    해당 맵에서 정보를 읽어와야하므로 인자로 넣었지만 아직 구현하진 않았다.

    기본적으로 맵은 가로 42,세로 21이다.
    이 길이만큼 가장자리에 벽을 하나씩 생성한다.
    생성은 AddWall함수를 통해 이뤄진다.

  • AddWall()함수는

    각 벽을 entireBoard벡터에 하나씩 넣고,
    vector< IDraw* >에 넣어주고, 충돌처리매니저에 넣어준다.

생각

drawableObject를 참조하는데 처음 생각한 부분은
board내부에 drawableObject포인터를 만들고,
생성자를 통해 해당 포인터에 snakeGame의 drawableObject를 연결해주려 했다.

그렇게 구현한다면 Addwall을 어디서 호출하든 drawableObject에 알아서 넣어지니 편할것 같았다.

하지만, 해당 drawableObject포인터를 해제할때 이중해제 되지 않을까 란 생각때문에 일단 위처럼 웃기게 구현을 해놓고 나중에 손볼 예정이다.

profile
코딩 창고!

0개의 댓글