Mercurial > LightClone
view LightClone/Source/World.cpp @ 23:a785b0aaf004
More work on the Gui system
author | koryspansel |
---|---|
date | Thu, 15 Sep 2011 21:45:00 -0700 |
parents | 502ed0a0059a |
children | 4ee162fc3537 |
line wrap: on
line source
/* * World */ #include "World.h" #include "VertexTypes.h" #include "GuiLabel.h" #include "GuiImage.h" #include "GuiButton.h" /* * World */ World::World() : kToolbar(8), kMain(16), kFunction(8)//, kControls(4) { nGameState = GameState_Active; nSimulationState = SimulationState_Idle; pFunction = 0; nCurrentFunction = 0; nCurrentLevel = 0; kArrowBounds[0] = Rectangle2(1206.0f + 0 * 16.0f, 473.0f + 0 * 54.0f, 16.0f, 16.0f); kArrowBounds[1] = Rectangle2(1206.0f + 2 * 16.0f, 473.0f + 0 * 54.0f, 16.0f, 16.0f); kDialog1Bounds[0] = Rectangle2(567.0f, 412.0f, 150.0f, 60.0f); kDialog2Bounds[0] = Rectangle2(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); kDialog2Bounds[1] = Rectangle2(1023.0f + 2.5f * 54.0f, 638.0f + 0 * 00.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 0 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 1 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 2 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 3 * 54.0f, 85.0f + 0 * 54.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 0 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 1 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 2 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); kToolbar.Add(1023.0f + 3 * 54.0f, 85.0f + 1 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 0 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 1 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 2 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 0 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 1 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 2 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); kMain.Add(1023.0f + 3 * 54.0f, 238.0f + 3 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 0 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 1 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 2 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 3 * 54.0f, 501.0f + 0 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 0 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 1 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 2 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); kFunction.Add(1023.0f + 3 * 54.0f, 501.0f + 1 * 54.0f, 48.0f, 48.0f); } /* * Initialize */ ErrorCode World::Initialize(EventSystem* pSystem, ResourceManager* pResourceManager, InputManager* pInput) { ErrorCode eCode = Error_Fail; if(pResourceManager && pInput) { pEventSystem = pSystem; pInputManager = pInput; eCode = kEnvironment.Initialize(pResourceManager); if(eCode == Error_Success) { eCode = kBot.Initialize(pResourceManager); if(eCode == Error_Success) { //eCode = kProgram.Initialize(pResourceManager); if(eCode == Error_Success) { eCode = InitializeInterface(pResourceManager); if(eCode == Error_Success) { nCurrentLevel = 0; nGameState = GameState_LoadMap; } } } } } return eCode; } /* * Terminate */ void World::Terminate() { kInterface.Terminate(); //kProgram.Terminate(); kBot.Terminate(); kEnvironment.Terminate(); } /* * Activate */ void World::Activate() { nGameState = GameState_LoadMap; } /* * Deactivate */ void World::Deactivate() { nGameState = GameState_Exit; } /* * IsActive */ bool World::IsActive() { return nGameState != GameState_Exit; } /* * Load */ bool World::Load(const char* pName) { ErrorCode eCode = kLoader.Load(pName); if(eCode == Error_Success) { if(pFunction) { delete[] pFunction; pFunction = NULL; } const Size& kSize = kLoader.GetSize(); eCode = kEnvironment.Setup(kSize.X, kSize.Y); if(eCode == Error_Success) { for(uint32 nY = 0; nY < kSize.Y; ++nY) { for(uint32 nX = 0; nX < kSize.X; ++nX) { kEnvironment.SetType(nX, nY, kLoader.GetTowerType(nX, nY)); kEnvironment.SetAltitude(nX, nY, kLoader.GetTowerHeight(nX, nY)); } } kBot.Setup(&kEnvironment); kBot.kPosition = kLoader.GetInitialPosition(); kBot.kDirection = kLoader.GetInitialDirection(); const uint32 nCount = kLoader.GetFunctionCount(); pFunction = new Code[nCount + 1]; pFunction[0].Initialize(MainFunctionLength); pFunction[0].Clear(); for(uint32 i = 0; i < nCount; ++i) { const uint32 nLength = kLoader.GetFunctionLength(i); pFunction[i + 1].Initialize(nLength); pFunction[i + 1].Clear(); } } } return eCode == Error_Success; } /* * ResetEnvironment */ void World::ResetEnvironment() { kEnvironment.Reset(); } /* * ResetBot */ void World::ResetBot() { kBot.Reset(); kBot.kPosition = kLoader.GetInitialPosition(); kBot.kDirection = kLoader.GetInitialDirection(); } /* * ResetCode */ void World::ClearCode() { for(uint32 i = 0; i < kLoader.GetFunctionCount(); ++i) { pFunction[i].Clear(); } } /* * Update */ void World::Update(float fElapsed) { ProcessInput(fElapsed); if(nGameState == GameState_LoadMap) { char kBuffer[256]; sprintf_s(kBuffer, "Data\\Maps\\Map%02d.map", nCurrentLevel++); nGameState = Load(kBuffer) ? GameState_Active : GameState_Over; } else if(nGameState == GameState_Active) { if(nSimulationState == SimulationState_Active) { if(kBot.Update(fElapsed)) { if(kEnvironment.RequirementsMet()) { kDialog.Reset("Some message"); kDialog.AddButton(DialogButton_Ok, "Ok", 0.0f, 0.0f, 0.0f, 0.0f); nGameState = GameState_Complete; } } } kInterface.Update(fElapsed); } } /* * Render */ void World::Render(RenderContext& kContext) { const uint32 nColor = D3DCOLOR_XRGB(32, 32, 32); kContext.Begin(nColor); //TODO: Remove if(nGameState >= GameState_Active) { kCameraController.SetMode(CameraMode_3D); Render3D(kContext); kCameraController.SetMode(CameraMode_2D); Render2D(kContext); } kContext.End(); } /* * InitializeInterface */ ErrorCode World::InitializeInterface(ResourceManager* pResourceManager) { ErrorCode eCode = kInterface.Initialize(pResourceManager, pInputManager); if(eCode == Error_Success) { GuiImage* pBackground = new GuiImage(); pBackground->Initialize(pResourceManager); pBackground->SetTexture("Data\\Textures\\Background01.tga", true); pBackground->SetPosition(ScreenSizeX - pBackground->GetWidth(), 0.0f); GuiButton* pButtonPlay = new GuiButton(); pButtonPlay->Initialize(pResourceManager); pButtonPlay->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Play.tga", true); pButtonPlay->SetPosition(1023.0f + 0.0f * 54.0f, 640.0f); pButtonPlay->Subscribe(GuiButton::EventClick, &World::OnPlay, this); GuiButton* pButtonStop = new GuiButton(); pButtonStop->Initialize(pResourceManager); pButtonStop->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Stop.tga", true); pButtonStop->SetPosition(1023.0f + 1.0f * 54.0f, 640.0f); pButtonStop->Subscribe(GuiButton::EventClick, &World::OnStop, this); /* GuiButton* pButtonReset = new GuiButton(); pButtonReset->Initialize(pResourceManager); pButtonReset->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Reset.tga", true); pButtonReset->SetPosition(1023.0f + 2.0f * 54.0f, 640.0f.0f); pButtonReset->Subscribe(GuiButton::EventClick, &World::OnReset, this); */ GuiButton* pButtonExit = new GuiButton(); pButtonExit->Initialize(pResourceManager); pButtonExit->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Exit.tga", true); pButtonExit->SetPosition(1023.0f + 3.0f * 54.0f, 640.0f); pButtonExit->Subscribe(GuiButton::EventClick, &World::OnExit, this); /* GuiLabel* pLabel = new GuiLabel(); pLabel->Initialize(pResourceManager); pLabel->SetFont("Courier New", 16); pLabel->SetText("This is a test!"); pLabel->SetFlags(GuiLabelFlag_CenterX | GuiLabelFlag_CenterY); pLabel->SetPosition(0.5f * ScreenSizeX, 0.5f * ScreenSizeY); */ pLevelDialog = new GuiImage(); pLevelDialog->Initialize(pResourceManager); //pLevelDialog->SetVisible(false); pLevelDialog->SetTexture("Data\\Textures\\Dialog2.tga", true); pLevelDialog->SetPosition(0.5f * (ScreenSizeX - pLevelDialog->GetWidth()), 0.5f * (ScreenSizeY - pLevelDialog->GetHeight())); pLevelDialogOk = new GuiButton(); pLevelDialogOk->Initialize(pResourceManager); pLevelDialogOk->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Slot.tga"); pLevelDialogOk->SetFont("Courier New", 24); pLevelDialogOk->SetText("Ok"); pLevelDialogOk->SetDimensions(150.0f, 52.0f); //pLevelDialogOk->SetPosition(23.0f, 171.0f); pLevelDialogOk->SetPosition(0.5f * (pLevelDialog->GetWidth() - pLevelDialogOk->GetWidth()), 171.0f); pLevelDialogOk->Subscribe(GuiButton::EventClick, &World::OnExit, this); pLevelDialog->Add(pLevelDialogOk); /* pGameDialogOk = new GuiButton(); pGameDialogOk->Initialize(pResourceManager); pGameDialogOk->SetTexture(GuiButtonState_Normal, "Data\\Textures\\Button.tga", true); //pGameDialogOk->SetText("Ok"); pGameDialogOk->SetPosition(1023.0f + 3.0f * 54.0f, 640.0f); pGameDialogOk->Subscribe(GuiButton::EventClick, &World::OnExit, this); */ pGameDialog = new GuiImage(); pGameDialog->Initialize(pResourceManager); pGameDialog->SetVisible(false); pGameDialog->SetTexture("Data\\Textures\\Dialog2.tga", true); pGameDialog->SetPosition(0.5f * (ScreenSizeX - pGameDialog->GetWidth()), 0.5f * (ScreenSizeY - pGameDialog->GetHeight())); //pGameDialog->Add(pGameDialogOk); kInterface.Add(pBackground); kInterface.Add(pButtonPlay); kInterface.Add(pButtonStop); //kInterface.Add(pButtonReset); kInterface.Add(pButtonExit); kInterface.Add(pLevelDialog); kInterface.Add(pGameDialog); /* //CodePanel* pToolbar = new CodePanel(8); pToolbar->Initialize(pResourceManager); pToolbar->SetBackgroundTexture("Data\\Textures\\CodePanel.tga"); pToolbar->SetSlotTexture("Data\\Textures\\Slot.tga"); //CodePanel* pMain = new CodePanel(16); pMain->SetBackgroundTexture("Data\\Textures\\CodePanel.tga"); pMain->SetSlotTexture("Data\\Textures\\Slot.tga"); pMain->Subscribe(CodePanel::Drop, &World::OnDrop, this); //CodePanel* pFunctionA = new CodePanel(16); pFunctionA->SetBackgroundTexture("Data\\Textures\\CodePanel.tga"); pFunctionA->SetSlotTexture("Data\\Textures\\Slot.tga"); pFunctionA->Subscribe(CodePanel::Drop, &World::OnDrop, this); //CodePanel* pFunctionB = new CodePanel(16); pFunctionB->SetBackgroundTexture("Data\\Textures\\CodePanel.tga"); pFunctionB->SetSlotTexture("Data\\Textures\\Slot.tga"); pFunctionB->Subscribe(CodePanel::Drop, &World::OnDrop, this); //GuiPanel* pControlPanel = new GuiPanel(); pControlPanel->SetTexture("Data\\Textures\\ControlPanel.tga") pControlPanel->SetDimensions(...); pControlPanel->Add(pButtonStart); pControlPanel->Add(pButtonStop); pControlPanel->Add(pButtonReset); pControlPanel->Add(pButtonExit); //GuiDialog* pLevelDialog = new GuiDialog(); pLevelDialog->AddButton(DialogButton_Ok, "Ok"); pLevelDialog->SetVisible(false); //GuiDialog* pGameDialog = new GuiDialog(); pGameDialog->AddButton(DialogButton_Ok, "Ok"); pGameDialog->SetVisible(false); //GuiDialog* pConfirmDialog = new GuiDialog(); pConfirmDialog->AddButton(DialogButton_Yes, "Yes"); pConfirmDialog->AddButton(DialogButton_No, "No"); pConfirmDialog->SetVisible(false); //GuiPanel* pContainerPanel = new GuiPanel(); pContainerPanel->SetBackgroundTexture("Data\\Texturse\\ContainerPanel.tga"); pContainerPanel->Add(pToolbar); pContainerPanel->Add(pMain); pContainerPanel->Add(pSelectorPanel); pContainerPanel->Add(pControlPanel); pRoot->Add(pControlPanel); pRoot->Add(pLevelDialog); pRoot->Add(pGameDialog); pRoot->Add(pConfirmDialog); */ } return eCode; } /* * Render3D */ void World::Render3D(RenderContext& kContext) { kEnvironment.Render(kContext, kCameraController); kBot.Render(kContext, kCameraController); } /* * Render2D */ void World::Render2D(RenderContext& kContext) { kInterface.Render(kContext, kCameraController); } /* * ProcessInput */ void World::ProcessInput(float fElapsed) { //pInputManager->Update(fElapsed); #if defined(_DEBUG) if(pInputManager->IsKeyDown(DIK_LEFT)) { kCameraController.Yaw(0.01f); } else if(pInputManager->IsKeyDown(DIK_RIGHT)) { kCameraController.Yaw(-0.01f); } if(pInputManager->IsKeyDown(DIK_UP)) { kCameraController.Pitch(0.01f); } else if(pInputManager->IsKeyDown(DIK_DOWN)) { kCameraController.Pitch(-0.01f); } if(pInputManager->IsKeyDown(DIK_NEXT)) { kCameraController.Move(0.1f); } else if(pInputManager->IsKeyDown(DIK_PRIOR)) { kCameraController.Move(-0.1f); } #endif const float fMouseX = pInputManager->GetMouseX(); const float fMouseY = pInputManager->GetMouseY(); if(nGameState == GameState_Active) { if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) { // pick against the toolbar int32 nSelection = kToolbar.Pick(fMouseX, fMouseY); if(nSelection >= 0) { kDragController.Begin(Action_Forward + nSelection); } else { // pick against the main pane nSelection = kMain.Pick(fMouseX, fMouseY); if(nSelection >= 0) { Code* pCode = pFunction; if(!pCode->IsEmptySlot(nSelection)) { kDragController.Begin(pCode->GetSlot(nSelection)); pCode->ClearSlot(nSelection); } } else { // pick against the function pane nSelection = kFunction.Pick(fMouseX, fMouseY); if(nSelection >= 0) { Code* pCode = pFunction + nCurrentFunction + 1; if(!pCode->IsEmptySlot(nSelection)) { kDragController.Begin(pCode->GetSlot(nSelection)); pCode->ClearSlot(nSelection); } } else { // pick against the function pane arrows for(uint32 i = 0; i < sizeof(kArrowBounds) / sizeof(kArrowBounds[0]); ++i) { if(kArrowBounds[i].Contains(fMouseX, fMouseY)) { const uint32 nCount = kLoader.GetFunctionCount(); nCurrentFunction = (nCurrentFunction + 2 * (int32)i - 1 + nCount) % nCount; } } } } } } else if(!pInputManager->IsButtonDown(0) && pInputManager->WasButtonDown(0)) { if(kDragController.IsActive()) { const uint32 nAction = kDragController.End(); int32 nSelection = kMain.Pick(fMouseX, fMouseY); if(nSelection >= 0) { pFunction[0].SetSlot(nSelection, nAction); } else { nSelection = kFunction.Pick(fMouseX, fMouseY); if(nSelection >= 0) { pFunction[nCurrentFunction + 1].SetSlot(nSelection, nAction); } } } } } else if(nGameState == GameState_Complete) { if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) { for(uint32 i = 0; i < sizeof(kDialog1Bounds) / sizeof(kDialog1Bounds[0]); ++i) { if(kDialog1Bounds[i].Contains(fMouseX, fMouseY)) { if(i == 0) { if(nSimulationState == SimulationState_Active) { ResetEnvironment(); ResetBot(); nSimulationState = SimulationState_Idle; } nGameState = GameState_LoadMap; } } } /* int32 nSelection = kDialog.Pick(fMouseX, fMouseY); if(nSelection == DialogButton_A) { if(nSimulationState == SimulationState_Active) { ResetEnvironment(); ResetBot(); nSimulationState = SimulationState_Idle; } nGameState = GameState_LoadMap; } */ } } else if(nGameState == GameState_Over) { // check to see if button was clicked if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) { for(uint32 i = 0; i < sizeof(kDialog1Bounds) / sizeof(kDialog1Bounds[0]); ++i) { if(kDialog1Bounds[i].Contains(fMouseX, fMouseY)) { if(i == 0) { nCurrentLevel = 0; nGameState = GameState_LoadMap; } } } /* int32 nSelection = kDialog.Pick(fMouseX, fMouseY); if(nSelection == DialogButton_A) { nCurrentLevel = 0; nGameState = GameState_LoadMap; } */ } } else if(nGameState == GameState_Confirm) { // check to see if button was clicked if(pInputManager->IsButtonDown(0) && !pInputManager->WasButtonDown(0)) { for(uint32 i = 0; i < sizeof(kDialog2Bounds) / sizeof(kDialog2Bounds[0]); ++i) { if(kDialog2Bounds[i].Contains(fMouseX, fMouseY)) { if(i == 0) { nGameState = GameState_Exit; } else if(i == 1) { nGameState = GameState_Active; } } } /* int32 nSelection = kDialog.Pick(fMouseX, fMouseY); if(nSelection == DialogButton_A) { nGameState = GameState_Exit; } else if(nSelection == DialogButton_B) { nGameState = GameState_Active; } */ } } } /* * OnPlay */ void World::OnPlay(GuiEventArguments& kArguments) { if(nSimulationState == SimulationState_Idle) { ResetBot(); kBot.Upload(pFunction, kLoader.GetFunctionCount() + 1); nSimulationState = SimulationState_Active; } } /* * OnStop */ void World::OnStop(GuiEventArguments& kArguments) { if(nSimulationState == SimulationState_Active) { ResetEnvironment(); ResetBot(); nSimulationState = SimulationState_Idle; } } /* * OnReset */ void World::OnReset(GuiEventArguments& kArguments) { } /* * OnExit */ void World::OnExit(GuiEventArguments& kArguments) { nGameState = GameState_Exit; }