똥피하기 게임(실습)

* 간단한 게임 프레임 워크(+템플릿 다이나믹 싱글톤 이용)에 만든 똥피하기 게임
- 합의 공식으로 스코어가 산술 급수에 도달하면 레벨업을 하도록 처리
- 레벨업 시, 박스 드랍 최대 속도를 레벨의 두배에 비례해 증가하도록 처리(최저 속도 동일)
- 일시 정지는 모든 객체를 메모리에서 해제하고 윈도우 메시지 창을 띄우도록 처리
#include "stdafx.h"
#include "mainGame.h"
//초기화
HRESULT mainGame::init()
{
gameNode::init();
//이곳에서 초기화 한다
num = 20; //박스 갯수
//박스 생성 초기화
for (int i = 0; i < num; i++)
{
_rc[i] = RectMakeCenter(RND->range(0, WINSIZEX + 20), RND->range(-800, 100), 40, 40);
speed[i] = RND->range(2, 5);
}
//유저 스코어 초기화
user1.level = 1;
user1.score = 0;
r = RND->range(0, 100);
g = RND->range(0, 100);
b = RND->range(0, 100);
//유저 몸뚬이 초기화
user1.width = 40;
user1.hight = 40;
user1.rc = RectMakeCenter(WINSIZEX / 2, WINSIZEY - user1.hight / 2, user1.width, user1.hight);
return S_OK;
}
//해제
void mainGame::release()
{
gameNode::release();
//이미지 클래스를 나갈때까진 사용할 일 없다
//동적할당 new를 사용했다면 이곳에서 SAFE_DELETE() 사용한다
}
//업데이트
void mainGame::update()
{
gameNode::update();
//이곳에서 계산식, 키보드, 마우스 등 업데이트
//(이곳에 코딩한다고 생각 할 것)
//(게임 종료)유저와 박스 충돌 체크
for (int i = 0; i < num; i++)
{
if (IntersectRect(&boom, &user1.rc, &_rc[i]) == true)
{
_rc[i].top += 0;
_rc[i].bottom += 0;
if (IntersectRect(&boom, &user1.rc, &_rc[i]) == true)
{
//윈도우 일시 정지(타임 클락을 해제 하면 되나?)
this->release();
if (MessageBox(_hWnd, "새 게임을 하시겠습니까?", "GAME OVER", MB_YESNO) == IDYES)
{
// 게임 계속 처리
this->init();
game_over = false;
}
else
{
// 게임 중지
game_over = true;
}
}
}
else
{
//박스 이동
_rc[i].top += speed[i];
_rc[i].bottom += speed[i];
}
}
//박스 만들기
for (int i = 0; i < num; i++)
{
if (_rc[i].top > WINSIZEY) //박스 초기화
{
user1.score += 10;
_rc[i] = RectMakeCenter(RND->range(0, WINSIZEX + 20), RND->range(0, 100), 40, 40);
speed[i] = RND->range(2, 5 + user1.level * 2);
}
}
//유저 이동
if (KEYMANAGER->isStayKeyDown(VK_LEFT))
{
user1.rc.left -= 5;
user1.rc.right -= 5;
}
if (KEYMANAGER->isStayKeyDown(VK_RIGHT))
{
user1.rc.left += 5;
user1.rc.right += 5;
}
//유저 경계제한
if (PtInRect(&user1.rc, { 0, WINSIZEY - 1 }) == true)
{
user1.rc.left = 0;
user1.rc.right = user1.width;
}
if (PtInRect(&user1.rc, { WINSIZEX, WINSIZEY - 1 }) == true)
{
user1.rc.right = WINSIZEX;
user1.rc.left = WINSIZEX - user1.width;
}
//레벨업
for (int i = 1; i < 10; i++)
{
if (user1.score > 100 * (i * (i + 1) / 2))
{
user1.level = i;
}
}
}
//렌더
void mainGame::render(HDC hdc)
{
//이곳에서 WM_PAINT에서 했던것을 처리한다
for (int i = 0; i < num; i++)
{
Rectangle(hdc, _rc[i]);
}
Rectangle(hdc, user1.rc); //유저 몸뗑이
//도형에 색칠하기
HBRUSH brush = CreateSolidBrush(RGB(r, g, b));
FillRect(hdc, &user1.rc, brush);
DeleteObject(brush);
//레벨이랑 스코어 표시 하기
wsprintf(user1.str_level, "Level : %d", user1.level);
TextOut(hdc, 20, 20, user1.str_level, strlen(user1.str_level));
wsprintf(user1.str_score, "Score : %d", user1.score);
TextOut(hdc, 20, 40, user1.str_score, strlen(user1.str_score));
}
스코어 저장을 (파일 입출력)
답글삭제https://paynter1127.blogspot.com/2019/08/file.html
서버 저장 연습(채팅 서버 구현)
답글삭제https://paynter1127.blogspot.com/2019/08/html-nodejs-js.html