2 * @file GameSurfaceSDL.cpp
3 * @brief
\83Q
\81[
\83\80\82Ì
\83\81\83C
\83\93\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X(SDL2.0
\8eÀ
\91\95)
12 #include "GameSurfaceSDL.h"
14 std::string toUTF8(LPCSTR str)
16 const int cchWideChar = ::MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
17 std::vector<WCHAR> lpw(cchWideChar);
19 const int nUnicodeCount = ::MultiByteToWideChar(CP_ACP, 0, str, -1, &lpw[0], cchWideChar);
20 if(nUnicodeCount <= 0)
25 const int cchMultiByte = ::WideCharToMultiByte(CP_UTF8, 0, &lpw[0], -1, NULL, 0, NULL, NULL);
26 std::vector<CHAR> lpa(cchMultiByte);
28 const int nMultiCount = ::WideCharToMultiByte(CP_UTF8, 0, &lpw[0], -1, &lpa[0], cchMultiByte, NULL, NULL);
33 return std::string(&lpa[0]);
36 GameSurfaceSDL::GameSurfaceSDL(void)
38 if(SDL_Init(SDL_INIT_VIDEO) < 0) return;
39 window = SDL_CreateWindow(GAME_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_RESIZABLE);
40 SDL_GetWindowSurface(window);
43 if(TTF_Init() == -1) return;
44 if(IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) return;
48 viewCreaturePtr = NULL;
54 GameSurfaceSDL::~GameSurfaceSDL(void)
62 void GameSurfaceSDL::pushAnyKey(void)
69 while (SDL_PollEvent(&event))
71 key=event.key.keysym.sym;
72 if(event.type == SDL_KEYDOWN) return;
77 void GameSurfaceSDL::initInterfaces(void)
79 font = TTF_OpenFont("ttf\\ipam.ttf", 18);
95 rwop = SDL_RWFromFile("img\\Title.png", "rb");
96 error = IMG_GetError();
97 titleSurface = IMG_LoadPNG_RW(rwop);
99 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
102 void GameSurfaceSDL::Redraw()
105 SDL_Surface *windowSurface = SDL_GetWindowSurface(window);
106 SDL_Rect rect = {0, 0, 0, 0};
108 SDL_GetWindowSize(window, &rect.w, &rect.h);
110 SDL_SetRenderDrawColor(renderer, 100, 100, 0, 255);
112 SDL_FillRect(windowSurface, &rect, SDL_MapRGBA(windowSurface->format, 50, 20, 10, 255));
114 SDL_BlitSurface(titleSurface, &title, windowSurface, &title);
116 if(viewFloorPtr) drawFloor(viewFloorPtr, 0, 0, 20, 20);
118 if(viewCreaturePtr) drawCreatureStatus(viewCreaturePtr);
120 SDL_UpdateWindowSurface(window);
125 void GameSurfaceSDL::ViewCreatureStatus(Creature *creaturePtr)
127 viewCreaturePtr = creaturePtr;
130 viewCreaturePtr = NULL;
133 void GameSurfaceSDL::SetFloor(Floor *floorPtr)
135 viewFloorPtr = floorPtr;
138 void GameSurfaceSDL::drawCreatureStatus(Creature *creaturePtr)
141 SDL_Surface *windowSurface = SDL_GetWindowSurface(window);
143 enum CREATURE_STATUS_VIEW_POSITION
170 SDL_Rect CreatureStatusViewPosition[POS_MAX] =
196 SDL_Rect CreatureStatusViewRect[POS_MAX];
198 const int STATUS_BUFSIZE = 100;
199 char statusBuf[POS_MAX][STATUS_BUFSIZE];
200 SDL_Surface *statusSurface[POS_MAX];
202 SDL_Rect masterRect = {10, 10, 490, 450};
204 sprintf_s(statusBuf[POS_NAME], STATUS_BUFSIZE, "
\96¼
\91O:%s", creaturePtr->GetName().c_str());
205 sprintf_s(statusBuf[POS_LEVEL], STATUS_BUFSIZE, "LV:%3d", creaturePtr->GetLevel());
206 sprintf_s(statusBuf[POS_HP], STATUS_BUFSIZE, "HP:%5d/%5d", creaturePtr->GetCurHP(), creaturePtr->GetMaxHP());
207 sprintf_s(statusBuf[POS_MP], STATUS_BUFSIZE, "MP:%5d/%5d", creaturePtr->GetCurMP(), creaturePtr->GetMaxMP());
208 sprintf_s(statusBuf[POS_AC], STATUS_BUFSIZE, "AC:%4d", creaturePtr->GetArmorSaving());
209 sprintf_s(statusBuf[POS_EV], STATUS_BUFSIZE, "EV:%4d", creaturePtr->GetEvasionSaving());
210 sprintf_s(statusBuf[POS_VO], STATUS_BUFSIZE, "VO:%4d", creaturePtr->GetVolitionSaving());
211 sprintf_s(statusBuf[POS_GOOD], STATUS_BUFSIZE, "
\91P :%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_GOOD));
212 sprintf_s(statusBuf[POS_EVIL], STATUS_BUFSIZE, "
\88« :%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_EVIL));
213 sprintf_s(statusBuf[POS_ORDER], STATUS_BUFSIZE, "
\92\81\8f\98:%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_ORDER));
214 sprintf_s(statusBuf[POS_CHAOS], STATUS_BUFSIZE, "
\8d¬
\93×:%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_CHAOS));
215 sprintf_s(statusBuf[POS_BALANCE], STATUS_BUFSIZE, "
\93V
\94\89:%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_BALANCE));
216 sprintf_s(statusBuf[POS_STR], STATUS_BUFSIZE, "
\98r
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_STR));
217 sprintf_s(statusBuf[POS_INT], STATUS_BUFSIZE, "
\92m
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_INT));
218 sprintf_s(statusBuf[POS_WIS], STATUS_BUFSIZE, "
\8c«
\82³:%4d", creaturePtr->GetCurrentStatus(CS_WIS));
219 sprintf_s(statusBuf[POS_DEX], STATUS_BUFSIZE, "
\8aí
\97p:%4d", creaturePtr->GetCurrentStatus(CS_DEX));
220 sprintf_s(statusBuf[POS_CON], STATUS_BUFSIZE, "
\91Ï
\8bv:%4d", creaturePtr->GetCurrentStatus(CS_CON));
221 sprintf_s(statusBuf[POS_CHA], STATUS_BUFSIZE, "
\96£
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_CHA));
222 sprintf_s(statusBuf[POS_SOUL], STATUS_BUFSIZE, "
\83\
\83E
\83\8b:%4d", creaturePtr->GetCurrentSoul());
223 sprintf_s(statusBuf[POS_HEIGHT], STATUS_BUFSIZE, "
\90g
\92·:%6dcm", creaturePtr->GetHeight());
224 sprintf_s(statusBuf[POS_WEIGHT], STATUS_BUFSIZE, "
\91Ì
\8fd:%6dkg", creaturePtr->GetWeight());
225 sprintf_s(statusBuf[POS_BODY_SIZE], STATUS_BUFSIZE, "
\91Ì
\8ai:%3d", creaturePtr->GetSize());
227 for(id = 0; id < POS_MAX; id++)
229 statusSurface[id] = TTF_RenderUTF8_Blended(font, toUTF8(statusBuf[id]).c_str(), color);
230 CreatureStatusViewRect[id].x = 0;
231 CreatureStatusViewRect[id].y = 0;
232 CreatureStatusViewRect[id].w = statusSurface[id]->w;
233 CreatureStatusViewRect[id].h = statusSurface[id]->h;
234 CreatureStatusViewPosition[id].x += masterRect.x;
235 CreatureStatusViewPosition[id].y += masterRect.y;
238 SDL_FillRect(windowSurface, &masterRect, SDL_MapRGBA(windowSurface->format, 0, 0, 0, 120));
240 for(id = 0; id < POS_MAX; id++)
242 SDL_BlitSurface(statusSurface[id], &CreatureStatusViewRect[id], windowSurface, &CreatureStatusViewPosition[id]);
245 for(id = 0; id < POS_MAX; id++)
247 SDL_FreeSurface(statusSurface[id]);
252 GAME_COMMAND GameSurfaceSDL::GetCommand(void)
257 while (SDL_PollEvent(&event))
264 key=event.key.keysym.sym;
269 return GAME_COMMAND_EXIT;
271 return GAME_COMMAND_VIEW_PLAYER_STATUS;
278 return GAME_COMMAND_EXIT;
284 return GAME_COMMAND_REDRAW;
287 void GameSurfaceSDL::drawFloor(Floor *floorPtr, int x, int y, int w, int h)
289 SDL_Surface *windowSurface = SDL_GetWindowSurface(window);
290 SDL_Rect symbolRect = {0, 0, 30, 30};
291 SDL_Surface *symbolSurface;
295 for(py = y; py < y + h; py++)
297 for(px = x; px < x + w; px++)
299 if(px < floorPtr->GetWidth() && py < floorPtr->GetHeight())
301 TAG tag = floorPtr->GetSquare(px, py)->getFeatureTag();
302 Color symColor = floorPtr->GetGameWorld()->GetFeature(tag)->GetSymColor();
303 Color backColor = floorPtr->GetGameWorld()->GetFeature(tag)->GetBackColor();
304 SDL_Color sdlSymCol = {symColor.r, symColor.g, symColor.b, symColor.a};
305 SDL_Rect blitRect = {240 + px * 24, py * 24 , 24, 24};
306 SDL_FillRect(windowSurface, &blitRect, SDL_MapRGBA(windowSurface->format, backColor.r, backColor.g, backColor.b, backColor.a));
307 sprintf_s(symBuf, 5, "%c", floorPtr->GetGameWorld()->GetFeature(tag)->GetSymbol());
309 symbolSurface = TTF_RenderUTF8_Blended(font, toUTF8(symBuf).c_str(), sdlSymCol);
310 blitRect.x += (24 - symbolSurface->w) / 2;
311 blitRect.y += (24 - symbolSurface->h) / 2;
312 SDL_BlitSurface(symbolSurface, &symbolRect, windowSurface, &blitRect);
313 SDL_FreeSurface(symbolSurface);
320 void GameSurfaceSDL::ViewFloor(int x, int y)