Nice graphics for Showing windows

This commit is contained in:
Simon Robertshaw 2012-01-21 23:29:40 +00:00
parent dea70befcf
commit 3a283d4f3c
4 changed files with 34 additions and 3 deletions

View File

@ -67,7 +67,7 @@ int main(int argc, char * argv[])
ui::Engine::Ref().g->AttachSDLSurface(SDLOpen());
ui::Engine * engine = &ui::Engine::Ref();
engine->Begin(XRES, YRES);
engine->Begin(XRES+BARSIZE, YRES+MENUSIZE);
GameController * gameController = new GameController();
engine->ShowWindow(gameController->GetView());

View File

@ -19,7 +19,9 @@ Engine::Engine():
mousexp_(0),
mouseyp_(0),
FpsLimit(60.0f),
windows(stack<Window*>())
windows(stack<Window*>()),
lastBuffer(NULL),
prevBuffers(stack<pixel*>())
{
}
@ -61,15 +63,34 @@ void Engine::ShowWindow(Window * window)
}
if(state_)
{
if(lastBuffer)
{
prevBuffers.push(lastBuffer);
}
lastBuffer = (pixel*)malloc((width_ * height_) * PIXELSIZE);
g->fillrect(0, 0, width_, height_, 0, 0, 0, 100);
memcpy(lastBuffer, g->vid, (width_ * height_) * PIXELSIZE);
windows.push(state_);
}
state_ = window;
}
void Engine::CloseWindow()
{
if(!windows.empty())
{
if(!prevBuffers.empty())
{
lastBuffer = prevBuffers.top();
prevBuffers.pop();
}
else
{
free(lastBuffer);
lastBuffer = NULL;
}
state_ = windows.top();
windows.pop();
}
@ -120,10 +141,17 @@ void Engine::Tick(float dt)
void Engine::Draw()
{
if(lastBuffer && !(state_->Position.X == 0 && state_->Position.Y == 0 && state_->Size.X == width_ && state_->Size.Y == height_))
{
memcpy(g->vid, lastBuffer, (width_ * height_) * PIXELSIZE);
}
else
{
g->Clear();
}
if(state_)
state_->DoDraw();
g->Blit();
g->Clear();
}
void Engine::onKeyPress(int key, bool shift, bool ctrl, bool alt)

View File

@ -54,6 +54,8 @@ namespace ui
float FpsLimit;
Graphics * g;
private:
pixel * lastBuffer;
std::stack<pixel*> prevBuffers;
std::stack<Window*> windows;
//Window* statequeued_;
Window* state_;

View File

@ -19,6 +19,7 @@ PreviewView::PreviewView():
void PreviewView::OnDraw()
{
Graphics * g = ui::Engine::Ref().g;
g->clearrect(Position.X-2, Position.Y-2, Size.X+4, Size.Y+4);
g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
}