void onUpdate() { if (worldnametb.pressed && !worldnametbChanged) { worldnametb.text = ""; worldnametbChanged = true; } if (worldnametb.text == "" || !worldnametbChanged) okbtn.enabled = false; else okbtn.enabled = true; if (okbtn.clicked) { if (worldnametb.text != "") { World::worldname = worldnametb.text; GUI::ClearStack(); GameView(); } else { GUI::PopPage(); } } AudioSystem::SpeedOfSound = AudioSystem::Air_SpeedOfSound; EFX::EAXprop = Generic; EFX::UpdateEAXprop(); float Pos[] = { 0.0f,0.0f,0.0f }; AudioSystem::Update(Pos, false, false, Pos, false, false); if (backbtn.clicked) GUI::PopPage(); inputstr = ""; }
bool LoadGameView::Run() { LastSelected=0; CurrentlySelected=0; Exit=false; Draw(true); while(true) { Draw(false); if(!Update()) { // Escape has been pressed if(Exit) { return true; } // If there are available saves if(FileNames.size()>0) { // Create a new game GameView Game=GameView(); // Load the data if(!LoadGameData(&Game, FileNames[CurrentlySelected])) { // Loading failed SetColour(GREY, BLACK); Clear(); // Display error message std::cout<<"The game failed to load."<<std::endl; std::cout<<"Press any key to continue..."; _getch(); Draw(true); // Redraw loading window } else { // Run the loaded game return Game.Run(); } } } } }
void onUpdate() { AudioSystem::SpeedOfSound = AudioSystem::Air_SpeedOfSound; EFX::EAXprop = Generic; EFX::UpdateEAXprop(); float Pos[] = { 0.0f,0.0f,0.0f }; AudioSystem::Update(Pos, false, false, Pos, false, false); worldcount = (int)worldnames.size(); leftp = static_cast<int>(windowwidth / 2.0 / stretch - 250); midp = static_cast<int>(windowwidth / 2.0 / stretch); rightp = static_cast<int>(windowwidth / 2.0 / stretch + 250); downp = static_cast<int>(windowheight / stretch - 20); vscroll.barheight = (downp - 72 - 48)*(downp - 36 - 40) / (64 * worldcount + 64); if (vscroll.barheight > downp - 36 - 40) { vscroll.enabled = false; vscroll.barheight = downp - 36 - 40; } else vscroll.enabled = true; trs = vscroll.barpos*(64 * worldcount + 64) / (downp - 36 - 40); mouseon = -1; if (mx >= midp - 250 && mx <= midp + 250 && my >= 48 && my <= downp - 72) { for (int i = 0; i < worldcount; i++) { if (my >= 48 + i * 64 - trs&&my <= 48 + i * 64 + 60 - trs) { if (mb == 1 && mbl == 0) { chosenWorldName = worldnames[i]; selected = i; } mouseon = i; } } if (my >= 48 + worldcount * 64 - trs&&my <= 48 + worldcount * 64 + 60 - trs) { if (mb == 0 && mbl == 1) { createworldmenu(); refresh = true; } mouseon = worldcount; } } if (enterbtn.clicked) { World::worldname = chosenWorldName; GUI::ClearStack(); GameView(); } if (deletebtn.clicked) { //删除世界文件 system((string("rd /s/q \"Worlds\\") + chosenWorldName + "\"").c_str()); deletebtn.clicked = false; World::worldname = ""; enterbtn.enabled = false; deletebtn.enabled = false; refresh = true; } if (refresh) { worldnames.clear(); thumbnails.clear(); texSizeX.clear(); texSizeY.clear(); worldcount = 0; selected = -1; mouseon = -1; vscroll.barpos = 0; chosenWorldName = ""; //查找所有世界存档 Textures::TEXTURE_RGB tmb; long hFile = 0; _finddata_t fileinfo; if ((hFile = _findfirst("Worlds\\*", &fileinfo)) != -1) { do { if ((fileinfo.attrib & _A_SUBDIR)) { if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) { worldnames.push_back(fileinfo.name); std::fstream file; file.open(("Worlds\\" + string(fileinfo.name) + "\\Thumbnail.bmp").c_str(), std::ios::in); thumbnails.push_back(0); texSizeX.push_back(0); texSizeY.push_back(0); if (file.is_open()) { Textures::LoadRGBImage(tmb, "Worlds\\" + string(fileinfo.name) + "\\Thumbnail.bmp"); glGenTextures(1, &thumbnails[thumbnails.size() - 1]); glBindTexture(GL_TEXTURE_2D, thumbnails[thumbnails.size() - 1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tmb.sizeX, tmb.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, tmb.buffer.get()); texSizeX[texSizeX.size() - 1] = tmb.sizeX; texSizeY[texSizeY.size() - 1] = tmb.sizeY; } file.close(); } } } while (_findnext(hFile, &fileinfo) == 0); _findclose(hFile); } refresh = false; } enterbtn.enabled = chosenWorldName != ""; deletebtn.enabled = chosenWorldName != ""; if (backbtn.clicked) GUI::PopPage(); }
static GameView new_gameview(int width, int height) { return GameView(width, height); }
int main(int argc, char** argv) { sf::RenderWindow App(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32), "Breakout Clone"); GAME_STATE state = START; sf::View GameView(sf::FloatRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); // Set the view App.setView(GameView); // Create level game::Level level; sf::Clock clock; clock.restart(); sf::Clock gameOverClock; while(App.isOpen()) { sf::Time time = clock.getElapsedTime(); clock.restart(); sf::Event evt; while(App.pollEvent(evt)) { if(evt.type == sf::Event::Closed) App.close(); if(evt.type == sf::Event::KeyPressed) { if(evt.key.code == sf::Keyboard::Escape) App.close(); if(evt.key.code == sf::Keyboard::Return) { if(state == START) { state = RUNNING; level.SetupScene(&App); } } } if(evt.type == sf::Event::Resized) { std::cout << "width:" << evt.size.width << " height:" << evt.size.height << std::endl; resizeWindow(&App); sf::FloatRect viewRect = App.getView().getViewport(); std::cout << "vp.left:" << viewRect.left << " vp.top:" << viewRect.top << " vp.width:" << viewRect.width << " vp.height:" << viewRect.height << std::endl; } level.HandleEvents(&evt); } if(state == START) { writeScreen(&App, "Press \"return\" to start"); continue; } if(state == LOSE || state == WIN) { if(state == LOSE) writeScreen(&App, "Game Over"); else writeScreen(&App, "You Won"); if(gameOverClock.getElapsedTime().asSeconds() > 10) { state = START; } continue; } if(level.HasPlayerLost()) { state = LOSE; gameOverClock.restart(); } if(level.HasPlayerWon()) { state = WIN; gameOverClock.restart(); } level.UpdatePosition(&App, &time); App.clear(); level.Draw(&App); App.display(); } return 0; }