게임에 들어가는 오브젝트를 담는 파일
GameObject.cpp
#include "GameObject.h" GameObject::GameObject() : mPos() , mCh('\0') //숫자에서는 0, 문자에서는 null을 사용 { } GameObject::~GameObject() { }
GameObject.h
#pragma once
#include "Common.h"
class Map;
class GameObject
{
public:
GameObject();
virtual ~GameObject();
virtual void Update(Map* map) {}
virtual void Render() {}
void SetPos(Vector2 pos) { mPos = pos; }
void SetPos(int x, int y) { mPos.x = x; mPos.y = y; }
Vector2 GetPos() { return mPos; }
void SetWChar_t(wchar_t ch) { mCh = ch; }
wchar_t GetWChar_t() { return mCh; }
protected:
Vector2 mPos;
wchar_t mCh;
};
Map.cpp
#include "Map.h"
Map::Map()
: mDatas(nullptr) //초기화
, mSize({ 0, 0 })
{
for (size_t i = 0; i < 128; i++)
{
mGameObjects[i] = nullptr;
}
// 같은 의미 == memset(mGameObjects, 0, sizeof(GameObject*)*128);
// memset : 메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅 (memory + setting)
}
Map::Map(int x, int y)
: mDatas(nullptr)
, mSize({ x, y })
{
memset(mGameObjects, 0, sizeof(GameObject*) * 128);
mDatas = new wchar_t* [mSize.y]; // 맵 배열의 y를 포인터로 받아서 mDatas (맵의 데이터)에 동적할당
for (size_t i = 0; i < mSize.y; i++)
{
mDatas[i] = new wchar_t[mSize.x]; //맵의 x에도 동적할당
}
for (size_t iy = 0; iy < y; iy++)
{
for (size_t ix = 0; ix < x; ix++)
{
mDatas[iy][ix] = 0;
}
}
}
Map::~Map()
{
for (size_t i = 0; i < mSize.y; i++)
{
delete[] mDatas[i]; // 맵의 y값들을 해제해준다
}
delete[] mDatas; // 배열
}
void Map::Initiailize(std::wstring& stageString)
{
int idx = 0; //
for (size_t iY = 0; iY < mSize.y; iY++)
{
for (size_t iX = 0; iX < mSize.x; iX++)
{
mDatas[iY][iX] = stageString[idx++]; //데이터
}
}
}
void Map::Update()
{
for (size_t i = 0; i < 128; i++)
{
if (mGameObjects[i] != nullptr) // 공백이 아닐때만 맵 업데이트 해줌
mGameObjects[i]->Update(this);
}
}
void Map::Render(int x, int y)
{
for (int iY = 0; iY < mSize.y; iY++)
{
for (int iX = 0; iX < mSize.x; iX++)
{
SET_COLOR(COLOR::DARK_SKY_BLUE); // 색을 바꿔줌
GOTO_XY((short)(x + iX * 2), (short)(y + iY)); // 맵의 위치를 이렇게 설정해줘야 잘 나옴
if (mDatas[iY][iX] == L'★')
{
SET_COLOR(COLOR::GREEN);
}
std::wcout << mDatas[iY][iX]; //wcout은 wchar_t를 쓰면서 자동으로 써야하는 것 같다
}
}
}
void Map::SetGameObjectInMap(int x, int y, wchar_t ch)
{
mDatas[y][x] = ch;
}
//추가
void Map::SetGameObjectInMap(wchar_t ch, Vector2 pos, Vector2 prevPos)
{
if (prevPos.y == -1 || prevPos.x == -1)
{
//그냥 냅둔다
}
else
{
mDatas[prevPos.y][prevPos.x] = L'ㅤ'; // 플레이어와 볼의 잔상을 없애준다
}
mDatas[pos.y][pos.x] = ch;
}
void Map::AddGameObject(GameObject* gameObject)
{
for (size_t i = 0; i < 128; i++)
{
if (mGameObjects[i] == nullptr)
{
mGameObjects[i] = gameObject;
break;
}
}
}
//추가
bool Map::IsBarrier(Pos pos)
{
wchar_t ch = mDatas[pos.y][pos.x];
if (ch == L'▩')
return true;
return false;
}
Map.h
#pragma once
#include "Common.h"
#include "GameObject.h"
#define SIZE_MAP_X 30 //define을 이용해서 정의 (맵이 바뀔 때 하나하나 안 바꿔줘도 됨)
#define SIZE_MAP_Y 24
class Map
{
public:
Map();
Map(int x, int y);
~Map();
void Initiailize(std::wstring& stageString); // wstring을 써줘야한다
void Update();
void Render(int x, int y);
void SetGameObjectInMap(int x, int y, wchar_t ch); // 맵에 게임오브젝트를 넣는 함수
//추가
void SetGameObjectInMap(wchar_t ch, Vector2 pos, Vector2 prevPos = Vector2(-1, -1)); // 문법상 오른쪽 먼저 넣어줘야함
void AddGameObject(GameObject* gameobject);
//추가
bool IsBarrier(Pos pos); // 플레이어 별이 벽을 넘어가지 못하게 하는 함수
private:
wchar_t** mDatas; //이중포인터를 사용해야 하는 이유는 한줄만 포인터로
//받는게 아니라 2줄모두 받아야 맵이 소환되니까
Size mSize;
GameObject* mGameObjects[128]; // 맵의 크기를 설정해주었다
};
Player.cpp
#include "Player.h"
#include "Map.h"
Player::Player()
{
mCh = L'★';
mPos.y = 4;
mPos.x = 4;
}
Player::~Player()
{
}
//추가
void Player::Update(Map* map)
{
Pos prevPos = mPos;
InputProcess();
if (map->IsBarrier(mPos)) //참이면 벽이다 ==> 플레이어가 벽을 못넘게 만듬
{
mPos = prevPos; //mpos를 이전 포지션으로 돌리기 때문에 벽을 넘어도 벽 넘기 전의 위치로 간다
}
map->SetGameObjectInMap(mCh, mPos, prevPos); // prevPos를 넣어야함
}
void Player::Render()
{
}
void Player::InputProcess()
{
if (_kbhit())
{ //키보드 입력 확인 (true / false)
char input = _getch();
switch (input)
{
case 'w':
{
mPos.y -= 1;
}
break;
case 'a':
{
mPos.x -= 1;
}
break;
case 's':
{
mPos.y += 1;
}
break;
case 'd':
{
mPos.x += 1;
}
break;
default:
break;
}
}
}
Player.h
#pragma once
#include "GameObject.h"
//class House
//{
//
//};
//
//
//class Stone
//{
//
//};
class Player : public GameObject
{
public:
Player();
~Player();
virtual void Update(Map* map) override;
virtual void Render() override;
private:
void InputProcess();
private:
};
Ball.cpp
#include "Ball.h"
#include "Map.h"
Ball::Ball()
{
mPos = Pos(-1, -1); // 0,0으로 초기화하면 안됨 (0,0도 맵에 포함되기 때문이다)
mCh = L'●';
}
Ball::Ball(Pos pos)
{
mPos = pos;
mCh = L'●';
}
Ball::~Ball()
{
}
void Ball::Update(Map* map)
{
Pos prevPos = mPos;
map->SetGameObjectInMap(mCh, mPos, prevPos);
}
void Ball::Render()
{
}
Ball.h
#pragma once
#include "Common.h"
#include "GameObject.h"
class Ball : public GameObject
{
public:
Ball(); //1번째 생성자
Ball(Pos pos); //2번째 생성자
~Ball();
virtual void Update(Map* map) override; // 가상함수
// 포인터맵을 전방선언을 해줘야 한다고 한다
virtual void Render() override;
};
'PushPush 게임 만들기 > 11일차 ~ 13일차' 카테고리의 다른 글
6. Data (0) | 2022.09.27 |
---|---|
5. Scene (1) | 2022.09.23 |
4. Common (0) | 2022.09.23 |
2. Highlevel_Interface (1) | 2022.09.23 |
1. main.cpp (0) | 2022.09.23 |