19 const int cchWideChar = ::MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
20 std::vector<WCHAR> lpw(cchWideChar);
22 const int nUnicodeCount = ::MultiByteToWideChar(CP_ACP, 0, str, -1, &lpw[0], cchWideChar);
23 if(nUnicodeCount <= 0)
28 const int cchMultiByte = ::WideCharToMultiByte(CP_UTF8, 0, &lpw[0], -1, NULL, 0, NULL, NULL);
29 std::vector<CHAR> lpa(cchMultiByte);
31 const int nMultiCount = ::WideCharToMultiByte(CP_UTF8, 0, &lpw[0], -1, &lpa[0], cchMultiByte, NULL, NULL);
36 return std::string(&lpa[0]);
39 GameSurfaceSDL::GameSurfaceSDL(GameWorld *gameWorld) : GameSurface(gameWorld)
41 if(SDL_Init(SDL_INIT_VIDEO) < 0)
return;
43 SDL_GetWindowSurface(window);
46 if(TTF_Init() == -1)
return;
47 if(IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG)
return;
51 viewCreaturePtr = NULL;
54 windowSurface = SDL_GetWindowSurface(window);
59 GameSurfaceSDL::‾GameSurfaceSDL(
void)
67 void GameSurfaceSDL::pushAnyKey(
void)
73 SDL_PollEvent(&event);
74 }
while(event.type != SDL_KEYDOWN);
77 void GameSurfaceSDL::initInterfaces(
void)
79 font = TTF_OpenFont(
"ttf¥¥ipam.ttf", 18);
95 OutputDebugString(L
"Failed: loading .ttf files.¥n");
99 rwop = SDL_RWFromFile(
"img¥¥Title.png",
"rb");
100 error = IMG_GetError();
101 titleSurface = IMG_LoadPNG_RW(rwop);
103 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
106 void GameSurfaceSDL::Redraw()
108 SDL_Rect rect = {0, 0, 0, 0};
110 SDL_GetWindowSize(window, &rect.w, &rect.h);
111 SDL_SetRenderDrawColor(renderer, 100, 100, 0, 255);
112 SDL_FillRect(windowSurface, &rect, SDL_MapRGBA(windowSurface->format, 50, 20, 10, 255));
113 SDL_BlitSurface(titleSurface, &title, windowSurface, &title);
115 if(this->viewFieldPtr) this->drawField(gameWorld, viewFieldPtr, 0, 0, 20, 20);
116 if(this->sideStatusCreatutePtr) this->drawSideCreatureStatus();
117 if(this->viewCreaturePtr) this->drawCreatureStatus(viewCreaturePtr);
118 if(this->currentMessage.size() > 0) this->drawMessage();
120 SDL_UpdateWindowSurface(window);
125 void GameSurfaceSDL::ViewCreatureStatus(Creature *creaturePtr)
127 this->viewCreaturePtr = creaturePtr;
129 this->viewCreaturePtr = NULL;
132 void GameSurfaceSDL::SetSideStatusCreature(Creature *creaturePtr)
134 this->sideStatusCreatutePtr = creaturePtr;
135 if(creaturePtr) this->updateSideCreatureStatus(creaturePtr);
138 void GameSurfaceSDL::SetField(Field *fieldPtr)
140 this->viewFieldPtr = fieldPtr;
143 void GameSurfaceSDL::drawCreatureStatus(Creature *creaturePtr)
147 enum CREATURE_STATUS_VIEW_POSITION
174 SDL_Rect CreatureStatusViewPosition[POS_MAX] =
200 SDL_Rect CreatureStatusViewRect[POS_MAX];
202 const int STATUS_BUFSIZE = 100;
203 char statusBuf[POS_MAX][STATUS_BUFSIZE];
204 SDL_Surface *statusSurface[POS_MAX];
206 SDL_Rect masterRect = {10, 10, 490, 450};
208 sprintf_s(statusBuf[POS_NAME], STATUS_BUFSIZE,
"名前:%s", creaturePtr->GetName().c_str());
209 sprintf_s(statusBuf[POS_LEVEL], STATUS_BUFSIZE,
"LV:%3d", creaturePtr->GetLevel());
210 sprintf_s(statusBuf[POS_HP], STATUS_BUFSIZE,
"HP:%5d/%5d", creaturePtr->GetCurHP(), creaturePtr->GetMaxHP());
211 sprintf_s(statusBuf[POS_MP], STATUS_BUFSIZE,
"MP:%5d/%5d", creaturePtr->GetCurMP(), creaturePtr->GetMaxMP());
212 sprintf_s(statusBuf[POS_AC], STATUS_BUFSIZE,
"AC:%4d", creaturePtr->GetArmorSaving());
213 sprintf_s(statusBuf[POS_EV], STATUS_BUFSIZE,
"EV:%4d", creaturePtr->GetEvasionSaving());
214 sprintf_s(statusBuf[POS_VO], STATUS_BUFSIZE,
"VO:%4d", creaturePtr->GetVolitionSaving());
215 sprintf_s(statusBuf[POS_GOOD], STATUS_BUFSIZE,
" 善 :%4d", creaturePtr->GetDiscipilneRank(
DISCIPLINE_TYPE_GOOD));
216 sprintf_s(statusBuf[POS_EVIL], STATUS_BUFSIZE,
" 悪 :%4d", creaturePtr->GetDiscipilneRank(
DISCIPLINE_TYPE_EVIL));
217 sprintf_s(statusBuf[POS_ORDER], STATUS_BUFSIZE,
"秩序:%4d", creaturePtr->GetDiscipilneRank(
DISCIPLINE_TYPE_ORDER));
218 sprintf_s(statusBuf[POS_CHAOS], STATUS_BUFSIZE,
"混沌:%4d", creaturePtr->GetDiscipilneRank(
DISCIPLINE_TYPE_CHAOS));
219 sprintf_s(statusBuf[POS_BALANCE], STATUS_BUFSIZE,
"天秤:%4d", creaturePtr->GetDiscipilneRank(
DISCIPLINE_TYPE_BALANCE));
220 sprintf_s(statusBuf[POS_STR], STATUS_BUFSIZE,
"腕力:%4d", creaturePtr->GetCurrentStatus(
CS_STR));
221 sprintf_s(statusBuf[POS_INT], STATUS_BUFSIZE,
"知力:%4d", creaturePtr->GetCurrentStatus(
CS_INT));
222 sprintf_s(statusBuf[POS_WIS], STATUS_BUFSIZE,
"賢さ:%4d", creaturePtr->GetCurrentStatus(
CS_WIS));
223 sprintf_s(statusBuf[POS_DEX], STATUS_BUFSIZE,
"器用:%4d", creaturePtr->GetCurrentStatus(
CS_DEX));
224 sprintf_s(statusBuf[POS_CON], STATUS_BUFSIZE,
"耐久:%4d", creaturePtr->GetCurrentStatus(
CS_CON));
225 sprintf_s(statusBuf[POS_CHA], STATUS_BUFSIZE,
"魅力:%4d", creaturePtr->GetCurrentStatus(
CS_CHA));
226 sprintf_s(statusBuf[POS_SOUL], STATUS_BUFSIZE,
"ソウル:%4d", creaturePtr->GetCurrentSoul());
227 sprintf_s(statusBuf[POS_HEIGHT], STATUS_BUFSIZE,
"身長:%13s", GameElement::HeightFormat(creaturePtr->GetHeight()).c_str());
228 sprintf_s(statusBuf[POS_WEIGHT], STATUS_BUFSIZE,
"体重:%13s", GameElement::WeightFormat(creaturePtr->GetWeight()).c_str());
229 sprintf_s(statusBuf[POS_BODY_SIZE], STATUS_BUFSIZE,
"体格:%3d", creaturePtr->GetSize());
231 for(
id = 0;
id < POS_MAX;
id++)
233 statusSurface[id] = TTF_RenderUTF8_Blended(font,
toUTF8(statusBuf[
id]).c_str(), color);
234 CreatureStatusViewRect[id].x = 0;
235 CreatureStatusViewRect[id].y = 0;
236 CreatureStatusViewRect[id].w = statusSurface[id]->w;
237 CreatureStatusViewRect[id].h = statusSurface[id]->h;
238 CreatureStatusViewPosition[id].x += masterRect.x;
239 CreatureStatusViewPosition[id].y += masterRect.y;
242 SDL_FillRect(windowSurface, &masterRect, SDL_MapRGBA(windowSurface->format, 0, 0, 0, 120));
244 for(
id = 0;
id < POS_MAX;
id++)
246 SDL_BlitSurface(statusSurface[
id], &CreatureStatusViewRect[
id], windowSurface, &CreatureStatusViewPosition[
id]);
249 for(
id = 0;
id < POS_MAX;
id++)
251 SDL_FreeSurface(statusSurface[
id]);
256 void GameSurfaceSDL::updateSideCreatureStatus(Creature *creaturePtr)
260 enum CREATURE_SIDE_STATUS_VIEW_POSITION
279 SDL_Rect CreatureStatusViewPosition[POS_MAX] =
297 SDL_Rect CreatureStatusViewRect[POS_MAX];
299 const int STATUS_BUFSIZE = 100;
300 char statusBuf[POS_MAX][STATUS_BUFSIZE];
301 SDL_Surface *statusSurface[POS_MAX];
303 SDL_Rect masterRect = {0, 0, 180, 350};
305 creatureStatusSurface = SDL_CreateRGBSurface(0, 490, 450, 32, 0, 0, 0, 0);
307 sprintf_s(statusBuf[POS_NAME], STATUS_BUFSIZE,
"名前:%s", creaturePtr->GetName().c_str());
308 sprintf_s(statusBuf[POS_LEVEL], STATUS_BUFSIZE,
"LV:%3d", creaturePtr->GetLevel());
309 sprintf_s(statusBuf[POS_HP], STATUS_BUFSIZE,
"HP:%5d/%5d", creaturePtr->GetCurHP(), creaturePtr->GetMaxHP());
310 sprintf_s(statusBuf[POS_MP], STATUS_BUFSIZE,
"MP:%5d/%5d", creaturePtr->GetCurMP(), creaturePtr->GetMaxMP());
311 sprintf_s(statusBuf[POS_AC], STATUS_BUFSIZE,
"AC:%4d", creaturePtr->GetArmorSaving());
312 sprintf_s(statusBuf[POS_EV], STATUS_BUFSIZE,
"EV:%4d", creaturePtr->GetEvasionSaving());
313 sprintf_s(statusBuf[POS_VO], STATUS_BUFSIZE,
"VO:%4d", creaturePtr->GetVolitionSaving());
314 sprintf_s(statusBuf[POS_STR], STATUS_BUFSIZE,
"腕力:%4d", creaturePtr->GetCurrentStatus(
CS_STR));
315 sprintf_s(statusBuf[POS_INT], STATUS_BUFSIZE,
"知力:%4d", creaturePtr->GetCurrentStatus(
CS_INT));
316 sprintf_s(statusBuf[POS_WIS], STATUS_BUFSIZE,
"賢さ:%4d", creaturePtr->GetCurrentStatus(
CS_WIS));
317 sprintf_s(statusBuf[POS_DEX], STATUS_BUFSIZE,
"器用:%4d", creaturePtr->GetCurrentStatus(
CS_DEX));
318 sprintf_s(statusBuf[POS_CON], STATUS_BUFSIZE,
"耐久:%4d", creaturePtr->GetCurrentStatus(
CS_CON));
319 sprintf_s(statusBuf[POS_CHA], STATUS_BUFSIZE,
"魅力:%4d", creaturePtr->GetCurrentStatus(
CS_CHA));
320 sprintf_s(statusBuf[POS_SOUL], STATUS_BUFSIZE,
"ソウル:%4d", creaturePtr->GetCurrentSoul());
322 for(
id = 0;
id < POS_MAX;
id++)
324 statusSurface[id] = TTF_RenderUTF8_Blended(font,
toUTF8(statusBuf[
id]).c_str(), color);
325 CreatureStatusViewRect[id].x = 0;
326 CreatureStatusViewRect[id].y = 0;
327 CreatureStatusViewRect[id].w = statusSurface[id]->w;
328 CreatureStatusViewRect[id].h = statusSurface[id]->h;
329 CreatureStatusViewPosition[id].x += masterRect.x;
330 CreatureStatusViewPosition[id].y += masterRect.y;
333 SDL_FillRect(creatureStatusSurface, &masterRect, SDL_MapRGBA(creatureStatusSurface->format, 0, 0, 0, 120));
335 for(
id = 0;
id < POS_MAX;
id++)
337 SDL_BlitSurface(statusSurface[
id], &CreatureStatusViewRect[
id], creatureStatusSurface, &CreatureStatusViewPosition[
id]);
340 for(
id = 0;
id < POS_MAX;
id++)
342 SDL_FreeSurface(statusSurface[
id]);
348 void GameSurfaceSDL::drawSideCreatureStatus(
void)
350 SDL_Rect masterRect = {0, 0, 180, 350};
351 SDL_Rect posRect = {10, 120, 0, 0};
352 SDL_BlitSurface(creatureStatusSurface, &masterRect, windowSurface, &posRect);
360 while (SDL_PollEvent(&event))
368 key=
event.key.keysym.sym;
413 void GameSurfaceSDL::drawField(GameWorld *gameWorld, Field *fieldPtr,
int x,
int y,
int w,
int h)
415 SDL_Rect symbolRect = {0, 0, 30, 30};
416 SDL_Surface *symbolSurface;
418 std::map<ID, boost::shared_ptr<Creature>>::iterator creatureIt;
421 for(py = y; py < y + h; py++)
423 for(px = x; px < x + w; px++)
425 if(px < fieldPtr->GetWidth() && py < fieldPtr->GetHeight())
427 TAG tag = fieldPtr->GetSquare(px, py)->GetFloorTag();
428 Color symColor = gameWorld->GetFloor(tag)->GetSymbolColor();
429 Color backColor = gameWorld->GetFloor(tag)->GetBackColor();
430 SDL_Color sdlSymCol = {(Uint8)symColor.GetRed(), (Uint8)symColor.GetGreen(), (Uint8)symColor.GetBlue(), (Uint8)symColor.GetAlpha()};
431 SDL_Rect blitRect = {240 + px * 24, py * 24 , 24, 24};
432 SDL_FillRect(windowSurface, &blitRect, SDL_MapRGBA(windowSurface->format, (Uint8)backColor.GetRed(), (Uint8)backColor.GetGreen(), (Uint8)backColor.GetBlue(), (Uint8)backColor.GetAlpha()));
433 sprintf_s(symBuf, 5,
"%s", gameWorld->GetFloor(tag)->GetSymbol().c_str());
434 symbolSurface = TTF_RenderUTF8_Blended(font,
toUTF8(symBuf).c_str(), sdlSymCol);
435 blitRect.x += (24 - symbolSurface->w) / 2;
436 blitRect.y += (24 - symbolSurface->h) / 2;
437 SDL_BlitSurface(symbolSurface, &symbolRect, windowSurface, &blitRect);
438 SDL_FreeSurface(symbolSurface);
443 for(creatureIt = gameWorld->GetCreatureList()->begin(); creatureIt != gameWorld->GetCreatureList()->end(); creatureIt++)
445 Color symColor = creatureIt->second->GetSymbolColor();
446 SDL_Color sdlSymCol = {(Uint8)symColor.GetRed(), (Uint8)symColor.GetGreen(), (Uint8)symColor.GetBlue(), (Uint8)symColor.GetAlpha()};
447 sprintf_s(symBuf, 5,
"%s", creatureIt->second->GetSymbol().c_str());
448 SDL_Rect blitRect = {240 + creatureIt->second->GetPosition().GetX() * 24, creatureIt->second->GetPosition().GetY() * 24 , 24, 24};
449 symbolSurface = TTF_RenderUTF8_Blended(font,
toUTF8(symBuf).c_str(), sdlSymCol);
450 blitRect.x += (24 - symbolSurface->w) / 2;
451 blitRect.y += (24 - symbolSurface->h) / 2;
452 SDL_BlitSurface(symbolSurface, &symbolRect, windowSurface, &blitRect);
453 SDL_FreeSurface(symbolSurface);
457 void GameSurfaceSDL::FocusField(
int x,
int y)
459 this->focusPoint.Set(x, y);
462 void GameSurfaceSDL::FocusField(Coordinates coord)
464 this->focusPoint.Set(coord.GetX(), coord.GetY());
467 void GameSurfaceSDL::drawMessage(
void)
469 SDL_Rect messageRect = {0, 0, 800, 100};
470 SDL_Rect messagePositon = {220, 8, 0, 0};
471 SDL_Rect windowRect = {212, 4, 800, 26};
472 SDL_FillRect(windowSurface, &windowRect, SDL_MapRGBA(messageSurface->format, 0, 0, 0, 120));
473 SDL_BlitSurface(messageSurface, &messageRect, windowSurface, &messagePositon);
477 void GameSurfaceSDL::Message(std::string message)
479 this->currentMessage = message;
480 messageSurface = TTF_RenderUTF8_Blended(font,
toUTF8(this->currentMessage.c_str()).c_str(), color);
482 this->currentMessage.erase();
483 SDL_FreeSurface(messageSurface);
std::string TAG
ゲーム要素文字列ID
標準のシステム インクルード ファイルのインクルード ファイル、または 参照回数が多く、かつあまり変更さ...
std::string toUTF8(LPCSTR str)
GameSurfaceSDLクラスとその他付随要素のプロトタイプ