1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-24 03:47:18 +02:00

* Zaczątek GUI - robienie okienek.

Na razie wczesne, ale pracuję nad tym, będzie więcej.
Demo: kliknij PPM na przycisku Quit w menu głównym.

Resztę informacji dostaniesz na GG/mail.

* uaktualniony exek
This commit is contained in:
Michał W. Urbańczyk 2007-06-12 09:33:20 +00:00
parent 8860f1dca2
commit 88eec95380
9 changed files with 211 additions and 29 deletions

11
CMT.cpp
View File

@ -1,8 +1,10 @@
// CMT.cpp : Defines the entry point for the console application.
//
#include "SDL.h"
#include <cmath>
#include "stdafx.h"
#include "SDL.h"
#include "SDL_TTF.h"
#include "CBuildingHandler.h"
#include <cmath>
#include <stdio.h>
#include <string.h>
#include <assert.h>
@ -39,6 +41,7 @@ const char * NAME = "VCMI 0.2";
version of the library linked do not match, or Z_ERRNO if there is
an error reading or writing the files. */
SDL_Surface * ekran;
TTF_Font * TNRB;
int def(FILE *source, FILE *dest, int level, int winBits=15, int memLevel =8)
{
int ret, flush;
@ -207,7 +210,9 @@ int _tmain(int argc, _TCHAR* argv[])
float i;
if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER/*|SDL_INIT_EVENTTHREAD*/)==0)
{
TTF_Init();
atexit(TTF_Quit);
TNRB = TTF_OpenFont("Fonts\\tnrb.ttf",18);
screen = SDL_SetVideoMode(800,600,24,SDL_HWSURFACE|SDL_DOUBLEBUF/*|SDL_FULLSCREEN*/);
ekran = screen;
//FILE * zr = fopen("mal.txt","r");

122
CMessage.cpp Normal file
View File

@ -0,0 +1,122 @@
#include "stdafx.h"
#include "CMessage.h"
#include "SDL_TTF.h"
#include "CSemiDefHandler.h"
extern TTF_Font * TNRB;
extern SDL_Surface * ekran;
SDL_Rect genRect(int hh, int ww, int xx, int yy);
CMessage::CMessage()
{
piecesOfBox = new CSemiDefHandler();
piecesOfBox->openDef("DIALGBOX.DEF","H3sprite.lod");
background = SDL_LoadBMP("H3bitmap.lod\\DIBOXBCK.BMP");
SDL_SetColorKey(background,SDL_SRCCOLORKEY,SDL_MapRGB(background->format,0,255,255));
tytulowy.r=229;tytulowy.g=215;tytulowy.b=123;tytulowy.unused=0;
zwykly.r=255;zwykly.g=255;zwykly.b=255;zwykly.unused=0; //gbr
tlo.r=66;tlo.g=44;tlo.b=24;tlo.unused=0;
}
SDL_Surface * CMessage::drawBox1(int w, int h)
{
//prepare surface
SDL_Surface * ret = SDL_CreateRGBSurface(ekran->flags, w, h, ekran->format->BitsPerPixel, ekran->format->Rmask, ekran->format->Gmask, ekran->format->Bmask, ekran->format->Amask);
for (int i=0; i<h; i+=background->h)//background
{
for (int j=0; j<w; j+=background->w-1)
SDL_BlitSurface(background,&genRect(background->h,background->w-1,1,0),ret,&genRect(h,w,j,i));
}SDL_Flip(ekran);
//obwodka I-szego rzedu pozioma
for (int i=0; i<w; i+=piecesOfBox->ourImages[6].bitmap->w)
{
SDL_BlitSurface
(piecesOfBox->ourImages[6].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[6].bitmap->h,piecesOfBox->ourImages[6].bitmap->w,i,0));
SDL_BlitSurface
(piecesOfBox->ourImages[7].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[7].bitmap->h,piecesOfBox->ourImages[7].bitmap->w,i,h-piecesOfBox->ourImages[7].bitmap->h));
}
//obwodka I-szego rzedu pionowa
for (int i=0; i<h; i+=piecesOfBox->ourImages[4].bitmap->h)
{
SDL_BlitSurface
(piecesOfBox->ourImages[4].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[4].bitmap->h,piecesOfBox->ourImages[4].bitmap->w,0,i));
SDL_BlitSurface
(piecesOfBox->ourImages[5].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[5].bitmap->h,piecesOfBox->ourImages[5].bitmap->w,w-piecesOfBox->ourImages[5].bitmap->w,i));
}
//corners
SDL_BlitSurface
(piecesOfBox->ourImages[0].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[0].bitmap->h,piecesOfBox->ourImages[0].bitmap->w,0,0));
SDL_BlitSurface
(piecesOfBox->ourImages[1].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[1].bitmap->h,piecesOfBox->ourImages[1].bitmap->w,w-piecesOfBox->ourImages[1].bitmap->w,0));
SDL_BlitSurface
(piecesOfBox->ourImages[2].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[2].bitmap->h,piecesOfBox->ourImages[2].bitmap->w,0,h-piecesOfBox->ourImages[2].bitmap->h));
SDL_BlitSurface
(piecesOfBox->ourImages[3].bitmap,NULL,
ret,&genRect(piecesOfBox->ourImages[3].bitmap->h,piecesOfBox->ourImages[3].bitmap->w,w-piecesOfBox->ourImages[3].bitmap->w,h-piecesOfBox->ourImages[3].bitmap->h));
//box gotowy!
return ret;
}
std::vector<std::string> * CMessage::breakText(std::string text)
{
std::vector<std::string> * ret = new std::vector<std::string>();
while (text.length()>30)
{
int whereCut = -1;
for (int i=30; i>0; i--)
{
if (text[i]==' ')
{
whereCut = i;
break;
}
}
ret->push_back(text.substr(0,whereCut));
text.erase(0,whereCut);
}
if (text.length() > 0)
ret->push_back(text);
return ret;
}
SDL_Surface * CMessage::genMessage(std::string title, std::string text, EWindowType type)
{
//max x 320 okolo 30 znakow
std::vector<std::string> * tekst;
if (text.length() < 30) //nie trzeba polamac
{
tekst = new std::vector<std::string>();
tekst->push_back(text);
}
else tekst = breakText(text);
int ww, hh; //wymiary boksa
if (319>60*13*text.length())
ww = 60*13*text.length();
else ww = 319;
if (title.length())
hh=130+(21*tekst->size());
else hh=80+(21*tekst->size());
SDL_Surface * ret = drawBox1(ww,hh);
//prepare title text
SDL_Surface * titleText = TTF_RenderText_Shaded(TNRB,title.c_str(),tytulowy,tlo);
//draw title
SDL_Rect tytul = genRect(titleText->h,titleText->w,((ret->w/2)-(titleText->w/2)),37);
SDL_BlitSurface(titleText,NULL,ret,&tytul);
SDL_FreeSurface(titleText);
//draw text
for (int i=0; i<tekst->size(); i++)
{
SDL_Surface * tresc = TTF_RenderText_Shaded(TNRB,(*tekst)[i].c_str(),zwykly,tlo);
SDL_Rect trescRect = genRect(tresc->h,tresc->w,((ret->w/2)-(tresc->w/2)),77+i*21);
SDL_BlitSurface(tresc,NULL,ret,&trescRect);
SDL_FreeSurface(tresc);
}
delete tekst;
return ret;
}

16
CMessage.h Normal file
View File

@ -0,0 +1,16 @@
#include "SDL_TTF.h"
#include "CSemiDefHandler.h"
enum EWindowType {infoOnly, infoOK, yesOrNO};
class CMessage
{
SDL_Color tytulowy ;
SDL_Color tlo;
SDL_Color zwykly ;
public:
std::vector<std::string> * breakText(std::string text);
CSemiDefHandler * piecesOfBox;
SDL_Surface * background;
SDL_Surface * genMessage(std::string title, std::string text, EWindowType type=infoOnly);
SDL_Surface * drawBox1(int w, int h);
CMessage();
};

View File

@ -1,5 +1,5 @@
#include "CObjectHandler.h"
#include "stdafx.h"
#include "CObjectHandler.h"
void CObjectHandler::loadObjects()
{

View File

@ -1,7 +1,9 @@
#include "stdafx.h"
#include "CPreGame.h"
#include "SDL.h"
#include "CMessage.h"
extern SDL_Surface * ekran;
SDL_Rect genRect(int hh, int ww, int xx, int yy);
bool isItIn(const SDL_Rect * rect, int x, int y)
{
if ((x>rect->x && x<rect->x+rect->w) && (y>rect->y && y<rect->y+rect->h))
@ -10,6 +12,7 @@ bool isItIn(const SDL_Rect * rect, int x, int y)
}
CPreGame::CPreGame()
{
currentMessage=NULL;
initMainMenu();
showMainMenu();
}
@ -100,6 +103,7 @@ void CPreGame::highlightButton(int which, int on)
}
void CPreGame::runLoop()
{
CMessage * cmh = new CMessage();
SDL_Event sEvent;
while(true)
{
@ -198,7 +202,7 @@ void CPreGame::runLoop()
ourMainMenu->highlighted=5;
}
}
else if ((sEvent.type==SDL_MOUSEBUTTONDOWN) && SDL_BUTTON(1))
else if ((sEvent.type==SDL_MOUSEBUTTONDOWN) && (sEvent.button.button == SDL_BUTTON_LEFT))
{
if (isItIn(&ourMainMenu->lNewGame,sEvent.motion.x,sEvent.motion.y))
{
@ -226,7 +230,7 @@ void CPreGame::runLoop()
ourMainMenu->highlighted=5;
}
}
else if ((sEvent.type==SDL_MOUSEBUTTONUP) && SDL_BUTTON(1))
else if ((sEvent.type==SDL_MOUSEBUTTONUP) && (sEvent.button.button == SDL_BUTTON_LEFT))
{
if (isItIn(&ourMainMenu->lNewGame,sEvent.motion.x,sEvent.motion.y))
{
@ -254,32 +258,57 @@ void CPreGame::runLoop()
ourMainMenu->highlighted=5;
}
}
else if ((sEvent.type==SDL_MOUSEBUTTONDOWN) && (sEvent.button.button == SDL_BUTTON_RIGHT))
{
if (isItIn(&ourMainMenu->lNewGame,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lLoadGame,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lHighScores,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lCredits,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lQuit,sEvent.motion.x,sEvent.motion.y))
{
SDL_Surface * infoBox = cmh->genMessage("Quit", "Return to Windows");
//SDL_Surface * infoBox = cmh->genMessage("Quit", "View the legendary Heores of Might and Magic abbbba");
SDL_Rect pos = genRect(infoBox->h,infoBox->w,
(ekran->w/2)-(infoBox->w/2),(ekran->h/2)-(infoBox->h/2));
SDL_BlitSurface(infoBox,NULL,ekran,&pos);
SDL_UpdateRect(ekran,pos.x,pos.y,pos.w,pos.h);
SDL_FreeSurface(infoBox);
currentMessage = new SDL_Rect(pos);
}
}
else if ((sEvent.type==SDL_MOUSEBUTTONUP) && (sEvent.button.button == SDL_BUTTON_RIGHT))
{
if (isItIn(&ourMainMenu->lNewGame,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lLoadGame,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lHighScores,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lCredits,sEvent.motion.x,sEvent.motion.y))
{
}
else if (isItIn(&ourMainMenu->lQuit,sEvent.motion.x,sEvent.motion.y))
{
SDL_BlitSurface(ourMainMenu->background,currentMessage,ekran,currentMessage);
SDL_UpdateRect
(ekran,currentMessage->x,currentMessage->y,currentMessage->w,currentMessage->h);
}
}
else if (sEvent.type==SDL_KEYDOWN)
{
switch (sEvent.key.keysym.sym)
{
//case SDLK_LEFT:
// {
// if(ourMainMenu->lQuit.x>0)
// ourMainMenu->lQuit.x--;
// break;
// }
//case (SDLK_RIGHT):
// {
// ourMainMenu->lQuit.x++;
// break;
// }
//case (SDLK_UP):
// {
// if(ourMainMenu->lQuit.y>0)
// ourMainMenu->lQuit.y--;
// break;
// }
//case (SDLK_DOWN):
// {
// ourMainMenu->lQuit.y++;
// break;
// }
case (SDLK_q):
{
return ;

View File

@ -16,6 +16,7 @@
class CPreGame
{
public:
SDL_Rect * currentMessage;
enum EState { //where are we?
mainMenu, ScenarioList
} state;

View File

@ -129,6 +129,7 @@ void CSemiDefHandler::openImg(const char *name)
if(!image)
{
printf("IMG_Load: %s\n", IMG_GetError());
return;
// handle error
}
Cimage vinya;

View File

@ -1,6 +1,14 @@
#include "stdafx.h"
#include "SDL_Extensions.h"
SDL_Rect genRect(int hh, int ww, int xx, int yy)
{
SDL_Rect ret;
ret.h=hh;
ret.w=ww;
ret.x=xx;
ret.y=yy;
return ret;
}
void CSDL_Ext::SDL_PutPixel(SDL_Surface *ekran, int x, int y, Uint8 R, Uint8 G, Uint8 B, int myC)
{
Uint8 *p = (Uint8 *)ekran->pixels + y * ekran->pitch + x * ekran->format->BytesPerPixel-myC;

BIN
VCMI.exe

Binary file not shown.