#include "Screen.h" #include "components/Button.h" #include "components/TextBox.h" #include "../Minecraft.h" #include "../renderer/Tesselator.h" #include "../sound/SoundEngine.h" #include "../../platform/input/Keyboard.h" #include "../../platform/input/Mouse.h" #include "../renderer/Textures.h" Screen::Screen() : passEvents(false), clickedButton(NULL), tabButtonIndex(0), width(1), height(1), minecraft(NULL), font(NULL) { } void Screen::render( int xm, int ym, float a ) { for (unsigned int i = 0; i < buttons.size(); i++) { Button* button = buttons[i]; button->render(minecraft, xm, ym); } // render any text boxes after buttons for (unsigned int i = 0; i < textBoxes.size(); i++) { TextBox* textbox = textBoxes[i]; textbox->render(minecraft, xm, ym); } } void Screen::init( Minecraft* minecraft, int width, int height ) { //particles = /*new*/ GuiParticles(minecraft); this->minecraft = minecraft; this->font = minecraft->font; this->width = width; this->height = height; init(); setupPositions(); updateTabButtonSelection(); } void Screen::init() { } void Screen::setSize( int width, int height ) { this->width = width; this->height = height; setupPositions(); } bool Screen::handleBackEvent( bool isDown ) { return false; } void Screen::updateEvents() { if (passEvents) return; while (Mouse::next()) mouseEvent(); while (Keyboard::next()) keyboardEvent(); while (Keyboard::nextTextChar()) keyboardTextEvent(); } void Screen::mouseEvent() { const MouseAction& e = Mouse::getEvent(); if (!e.isButton()) return; if (Mouse::getEventButtonState()) { int xm = e.x * width / minecraft->width; int ym = e.y * height / minecraft->height - 1; mouseClicked(xm, ym, Mouse::getEventButton()); } else { int xm = e.x * width / minecraft->width; int ym = e.y * height / minecraft->height - 1; mouseReleased(xm, ym, Mouse::getEventButton()); } } void Screen::keyboardEvent() { if (Keyboard::getEventKeyState()) { //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { // minecraft->toggleFullScreen(); // return; //} keyPressed(Keyboard::getEventKey()); } } void Screen::keyboardTextEvent() { keyboardNewChar(Keyboard::getChar()); } void Screen::renderBackground() { renderBackground(0); } void Screen::renderBackground( int vo ) { if (minecraft->isLevelGenerated()) { fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); } else { renderDirtBackground(vo); } } void Screen::renderDirtBackground( int vo ) { //glDisable2(GL_LIGHTING); glDisable2(GL_FOG); Tesselator& t = Tesselator::instance; minecraft->textures->loadAndBindTexture("gui/background.png"); glColor4f2(1, 1, 1, 1); float s = 32; float fvo = (float) vo; t.begin(); t.color(0x404040); t.vertexUV(0, (float)height, 0, 0, height / s + fvo); t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); t.vertexUV(0, 0, 0, 0, 0 + fvo); t.draw(); } bool Screen::isPauseScreen() { return true; } bool Screen::isErrorScreen() { return false; } bool Screen::isInGameScreen() { return true; } bool Screen::closeOnPlayerHurt() { return false; } void Screen::keyPressed( int eventKey ) { if (eventKey == Keyboard::KEY_ESCAPE) { minecraft->setScreen(NULL); //minecraft->grabMouse(); } // pass key events to any text boxes first for (auto& textbox : textBoxes) { textbox->handleKey(eventKey); } if (minecraft->useTouchscreen()) return; // "Tabbing" the buttons (walking with keys) const int tabButtonCount = tabButtons.size(); if (!tabButtonCount) return; Options& o = minecraft->options; if (eventKey == o.keyMenuNext.key) if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; if (eventKey == o.keyMenuPrevious.key) if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount-1; if (eventKey == o.keyMenuOk.key) { Button* button = tabButtons[tabButtonIndex]; if (button->active) { minecraft->soundEngine->playUI("random.click", 1, 1); buttonClicked(button); } } updateTabButtonSelection(); } void Screen::updateTabButtonSelection() { if (minecraft->useTouchscreen()) return; for (unsigned int i = 0; i < tabButtons.size(); ++i) tabButtons[i]->selected = (i == tabButtonIndex); } void Screen::mouseClicked( int x, int y, int buttonNum ) { if (buttonNum == MouseAction::ACTION_LEFT) { for (unsigned int i = 0; i < buttons.size(); ++i) { Button* button = buttons[i]; //LOGI("Hit-testing button: %p\n", button); if (button->clicked(minecraft, x, y)) { button->setPressed(); //LOGI("Hit-test successful: %p\n", button); clickedButton = button; /* #if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { minecraft->soundEngine->playUI("random.click", 1, 1); buttonClicked(button); #endif } */ } } } // let textboxes see the click regardless for (auto& textbox : textBoxes) { textbox->mouseClicked(minecraft, x, y, buttonNum); } } void Screen::mouseReleased( int x, int y, int buttonNum ) { //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; #if 1 //#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { for (unsigned int i = 0; i < buttons.size(); ++i) { Button* button = buttons[i]; if (clickedButton == button && button->clicked(minecraft, x, y)) { buttonClicked(button); minecraft->soundEngine->playUI("random.click", 1, 1); clickedButton->released(x, y); } } # else // } else { clickedButton->released(x, y); #endif // } clickedButton = NULL; } bool Screen::renderGameBehind() { return true; } bool Screen::hasClippingArea( IntRectangle& out ) { return false; } void Screen::lostFocus() { for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { TextBox* tb = *it; tb->loseFocus(minecraft); } } void Screen::toGUICoordinate( int& x, int& y ) { x = x * width / minecraft->width; y = y * height / minecraft->height - 1; }