int main() { RenderWindow window(VideoMode(1200, 800), "sds"); Level lv; lv.LoadFromFile("Test map.tmx"); std::vector<Object> mapObj; mapObj = lv.GetObjects("solid"); //Event event; Texture hero; ///Текстура нашего игрока hero.loadFromFile("ScarletRun2Right.png"); Texture heroLeft; heroLeft.loadFromFile("ScarletRun2Left.png"); Animation PlayerAnim[4]; PlayerAnim[0].setSpriteSheet(hero); PlayerAnim[0].loadFromXml("SkarletMoveRight.xml"); PlayerAnim[1].setSpriteSheet(hero); PlayerAnim[1].loadFromXml("SkarletMoveRight.xml"); PlayerAnim[2].setSpriteSheet(hero); PlayerAnim[2].loadFromXml("SkarletMoveRight.xml"); PlayerAnim[3].setSpriteSheet(heroLeft); PlayerAnim[3].loadFromXml("SkarletMoveLeft.xml"); Hero her; her.setHeroAnimation(PlayerAnim); her.setHeroPossition(0, 20); her.setHeroAnimationSpeed(1.0f); her.setHeroSpeed(20); sf::Clock frameClock;// Наши часики float speed = 80.f; while (window.isOpen()) { sf::Time frameTime = frameClock.restart(); window.clear(); lv.Draw(window); her.updateAndDrawHero(frameTime, mapObj, window); window.display(); } return 0; }
Bulet::Bullet(Image &image, String Name, Level &lvl,float X, float Y, int W, int H, int dir):Entity(image, Name, X, Y, W, H)//всё так же, только взяли в конце состояние игрока (int dir) { obj = lvl.GetObjects("solid");//инициализируем .получаем нужные объекты для взаимодействия пули с картой x = X; y = Y; direction = dir; speed = 0.8; w = h = 16; life = true; }//bullet
bool StartGame(RenderWindow & window, Game & game) { Level lvl; lvl.LoadFromFile(GetLevelNumb(game)); Image image; Texture texture; if (!image.loadFromFile("images/lvl1.png")) cout << "Error loading image from file " << endl; image.createMaskFromColor(Color(0, 128, 0)); if (!texture.loadFromImage(image)) cout << "Error loading texture from image " << endl; Sprite heartSprite; heartSprite.setTexture(texture); heartSprite.setTextureRect(IntRect(395, 151, 54, 46)); heartSprite.setScale(0.3f, 0.3f); Sprite lifeSprite; lifeSprite.setTexture(texture); lifeSprite.setTextureRect(IntRect(457, 149, 29, 29)); lifeSprite.setScale(0.8f, 0.8f); Font font; font.loadFromFile("fonts/pixel.ttf"); Text text("", font, 25); game.graphic.statistic.heart = heartSprite; game.graphic.statistic.life = lifeSprite; game.graphic.text = text; game.isPause = true; game.restart = false; vector <Enemy*> enemies; std::vector<Object> e = lvl.GetObjects("easyEnemy"); for (Object i : e) enemies.push_back(new Enemy(texture, "easyEnemy", i.rect.left, i.rect.top, 53, 28)); e = lvl.GetObjects("flyEnemy"); for (Object i : e) enemies.push_back(new Enemy(texture, "flyEnemy", i.rect.left, i.rect.top, 38, 36)); if (lvl.IsExist("trap")) { e = lvl.GetObjects("trap"); for (Object i : e) enemies.push_back(new Enemy(texture, "trap", i.rect.left, i.rect.top, 32, 18)); } vector <Portal*> portals; vector <Bullet*> bullets; vector <Object> objects = lvl.GetAllObjects(); Clock clock; SoundBuffer shootBuffer; shootBuffer.loadFromFile("sound/shoot.wav"); Sound shoot(shootBuffer); SoundBuffer portalBuffer; portalBuffer.loadFromFile("sound/portal.wav"); Sound portal(portalBuffer); SoundBuffer teleportBuffer; teleportBuffer.loadFromFile("sound/teleport.wav"); Sound teleport(teleportBuffer); SoundBuffer damageBuffer; damageBuffer.loadFromFile("sound/damage.wav"); Sound damage(damageBuffer); SoundBuffer deathBuffer; deathBuffer.loadFromFile("sound/damage.wav"); Sound gameOver(deathBuffer); Music music; music.openFromFile("sound/musicGame.ogg"); music.play(); Object playerObject = lvl.GetObject("player"); Player player(texture, "Player1", playerObject.rect.left, playerObject.rect.top, 32, 32); player.health = game.health; player.heart = game.hearts; while (window.isOpen() && (!game.restart)) { float time = float(clock.getElapsedTime().asMicroseconds()); clock.restart(); time = time / 800; Event event; Vector2i pixelPos = Mouse::getPosition(window); Vector2f pos = window.mapPixelToCoords(pixelPos); while (window.pollEvent(event)) { if (event.type == sf::Event::Closed || (Keyboard::isKeyPressed(Keyboard::Escape) && game.isPause)) { window.close(); game.restart = false; } if (event.type == Event::MouseButtonPressed) { pos.y = float(player.teleportY); if ((event.key.code == Mouse::Left) && (player.doesOpenPortal)) { CreatePortal(portals, game, "blue", pos, texture); portal.play(); } else if (event.key.code == Mouse::Right && (player.doesOpenPortal)) { CreatePortal(portals, game, "yellow", pos, texture); portal.play(); } } if (player.isTeleporting) { TeleportPlayer(player, portals); teleport.play(); } if (Keyboard::isKeyPressed(Keyboard::Return)) { game.isPause = false; } if (Keyboard::isKeyPressed(Keyboard::P)) { game.isPause = true; } if (Keyboard::isKeyPressed(Keyboard::Tab) && game.isPause) { game.restart = true; } } if (player.isExit) { if (game.isEndLevel) { game.isPause = true; } else { game.level++; game.restart = true; game.health = player.health; game.hearts = player.heart; } } for (auto *e : enemies) { if ((*e).name == "flyEnemy" && (*e).isShoot) { CreateBullet(bullets, (*e).GetRect(), player, texture); shoot.play(); } } EntitiesIntersection(player, enemies, portals, bullets, damage); if (player.alive) { setPlayerCoordinateForView(game.camera, player.GetPos().x, player.GetPos().y); } if (!game.isPause) { UpdateEnemies(objects, enemies, time, player); UpdatePortals(portals, time); UpdateBullets(objects, bullets, time); player.Update(objects, time, pos, game.portalH); } window.setView(game.camera); window.clear(); lvl.Draw(window); DrawEnemies(window, enemies); DrawPortals(window, portals); DrawBullets(window, bullets); DrawStatistic(window, &game, player, game.camera); window.draw(player.sprite); DrawAllMessages(player, game, window); music.setLoop(true); window.display(); } return game.restart; }
bool startGame (int & startLevel, RenderWindow & window, int & lives) { view.reset(FloatRect(0, 0, 700, 600)); Level lvl; switch (startLevel) { case 1: lvl.LoadFromFile("level1.tmx"); break; case 2: lvl.LoadFromFile("level2.tmx"); break; case 3: lvl.LoadFromFile("level3.tmx"); break; } //lvl.LoadFromFile("level1.tmx"); SoundBuffer coinBuffer; coinBuffer.loadFromFile("sounds/coin.wav"); Sound coinSound; coinSound.setBuffer(coinBuffer); SoundBuffer deathBuffer; deathBuffer.loadFromFile("sounds/mariodie.wav"); Sound deathSound; deathSound.setBuffer(deathBuffer); SoundBuffer stageBuffer; stageBuffer.loadFromFile("sounds/stage.wav"); Sound stageSound; stageSound.setBuffer(stageBuffer); Image heroImage; heroImage.loadFromFile("images/mario.png"); heroImage.createMaskFromColor(Color(255, 255, 255)); Image easyEnemyImage; easyEnemyImage.loadFromFile("images/EasyEnemy.png"); easyEnemyImage.createMaskFromColor(Color(255, 255, 255)); Image coinImage; coinImage.loadFromFile("images/coin.png"); coinImage.createMaskFromColor(Color(255, 255, 255)); Image mediumEnemyImage; mediumEnemyImage.loadFromFile("images/MediumEnemy.png"); mediumEnemyImage.createMaskFromColor(Color(255, 255, 255)); Image movePlatformImage; movePlatformImage.loadFromFile("images/MovingPlatform.png"); std::list<Entity*> entities; std::list<Entity*>::iterator it; std::list<Entity*>::iterator it2; std::vector<Object> e = lvl.GetObjects("EasyEnemy"); for (int i = 0; i < e.size(); i++) { entities.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, e[i].rect.left, e[i].rect.top, 15, 25)); } e = lvl.GetObjects("coin"); for (int i = 0; i < e.size(); i++) { entities.push_back(new Coin(coinImage, "coin", lvl, e[i].rect.left, e[i].rect.top, 15, 15)); } e = lvl.GetObjects("MediumEnemy"); for (int i = 0; i < e.size(); i++) { entities.push_back(new Enemy(mediumEnemyImage, "MediumEnemy", lvl, e[i].rect.left, e[i].rect.top, 16, 24)); } e = lvl.GetObjects("exit"); for (int i = 0; i < e.size(); i++) { entities.push_back(new Exit(mediumEnemyImage, "exit", lvl, e[i].rect.left, e[i].rect.top, 16, 24)); } e = lvl.GetObjects("fire"); for (int i = 0; i < e.size(); i++) { entities.push_back(new Fire(mediumEnemyImage, "fire", lvl, e[i].rect.left, e[i].rect.top, 16, 24)); } e = lvl.GetObjects("MovingPlatform"); for (int i = 0; i < e.size(); i++) entities.push_back(new MovingPlatform(movePlatformImage, "MovingPlatform", lvl, e[i].rect.left, e[i].rect.top, 95, 22)); Object player = lvl.GetObject("player"); Player p(heroImage, "Player", lvl, player.rect.left, player.rect.top, 22, 38); Clock clock; while (window.isOpen()) { float time = clock.getElapsedTime().asMicroseconds(); clock.restart(); time = time / 800; Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } for (it = entities.begin(); it != entities.end();) { Entity *b = *it; b->update(time); if (b->life == false) { it = entities.erase(it); delete b; } else it++; } for (it = entities.begin(); it != entities.end(); it++) { if (((*it)->name == "MovingPlatform") && ((*it)->getRect().intersects(p.getRect()))) { Entity *movPlat = *it; if (p.dy>0) if (p.y + p.height < movPlat->y + movPlat->height) { p.y = movPlat->y - p.height + 3; p.x += movPlat->dx*time; p.dy = 0; p.onGround = true; } } if ((*it)->getRect().intersects(p.getRect())) { if ((*it)->name == "EasyEnemy" || (*it)->name == "MediumEnemy") { if ((p.dy>0) && (p.onGround == false) && (p.y + p.height < (*it)->y + (*it)->height)) { p.dy = -0.3; (*it)->lives--; if ((*it)->name == "EasyEnemy") (*it)->sprite.setTextureRect(IntRect(60, 8, 16, 8)); p.Score++; } else { if (((*it)->lives != 0)) { deathSound.play(); p.lives--; lives--; return false; } } } if ((*it)->name == "fire") { deathSound.play(); p.lives--; lives--; return false; } if ((*it)->name == "coin") { p.Score++; coinSound.play(); (*it)->life = false; } if ((*it)->name == "exit") { stageSound.play(); startLevel++; return false; } } for (it2 = entities.begin(); it2 != entities.end(); it2++) { if ((*it)->getRect() != (*it2)->getRect()) if (((*it)->getRect().intersects((*it2)->getRect())) && ((*it)->name == "EasyEnemy")) { (*it)->dx *= -1; (*it)->sprite.scale(-1.5, 1.5); } } } p.update(time); if (Keyboard::isKeyPressed(Keyboard::Escape)) { lives = 0; return false; } window.setView(view); window.clear(Color(167, 207, 218)); lvl.Draw(window); for (it = entities.begin(); it != entities.end(); it++) { window.draw((*it)->sprite); } window.draw(p.sprite); window.display(); } return 0; }
void RunGame() { RenderWindow window(VideoMode(640, 480), "The Game!"); menu(window); View view( FloatRect(0, 0, 450, 280) ); Level lvl; int loadlevel = menu(window); //std::cout << "Which lvl would u prefer to load 1 or 2?\n"; //std::cin >> loadlevel; switch(loadlevel){ case 1: lvl.LoadFromFile("files/Level1.tmx"); std::cout <<"\nLoaded lvl1"; break; case 2: lvl.LoadFromFile("files/Level2.tmx"); std::cout << "\nLoaded lvl2"; default: system("exit"); break; } Texture enemy_t, moveplatform_t, megaman_t, bullet_t, bg; bg.loadFromFile("files/images/bg.png"); enemy_t.loadFromFile("files/images/enemy.png"); moveplatform_t.loadFromFile("files/images/movingPlatform.png"); megaman_t.loadFromFile("files/images/megaman.png"); bullet_t.loadFromFile("files/images/bullet.png"); AnimationManager anim; anim.loadFromXML("files/anim_megaman.xml",megaman_t); anim.animList["jump"].loop = 0; AnimationManager anim2; anim2.create("move",bullet_t,7,10,8,8,1,0); anim2.create("explode",bullet_t,27,7,18,18,4,0.01,29,false); AnimationManager anim3; anim3.create("move",enemy_t,0,0,16,16,2,0.002,18); anim3.create("dead",enemy_t,58,0,16,16,1,0); AnimationManager anim4; anim4.create("move",moveplatform_t,0,0,95,22,1,0); Sprite background(bg); background.setOrigin(bg.getSize().x/2,bg.getSize().y/2); std::list<Entity*> entities; std::list<Entity*>::iterator it; std::vector<Object> e = lvl.GetObjects("enemy"); for (int i=0;i < e.size();i++) entities.push_back(new ENEMY(anim3, lvl, e[i].rect.left, e[i].rect.top) ); e = lvl.GetObjects("MovingPlatform"); for (int i=0;i < e.size();i++) entities.push_back(new MovingPlatform(anim4, lvl, e[i].rect.left, e[i].rect.top) ); Object pl = lvl.GetObject("player"); PLAYER MegaMan(anim, lvl, pl.rect.left, pl.rect.top); HealthBar healthBar; Clock clock; int enemyCount = 0; /////////////////// основной цикл ///////////////////// while (window.isOpen()) { float time = clock.getElapsedTime().asMicroseconds(); clock.restart(); time = time/500; // здесь регулируем скорость игры if (time > 40) time = 40; Event event; while (window.pollEvent(event)) { if (event.type == Event::Closed || Keyboard::isKeyPressed(Keyboard::Escape)) window.close(); if (event.type == Event::KeyPressed) if (event.key.code==Keyboard::Space) entities.push_back(new Bullet(anim2,lvl,MegaMan.x+18,MegaMan.y+18,MegaMan.dir) ); } if (Keyboard::isKeyPressed(Keyboard::Left)) MegaMan.key["L"]=true; if (Keyboard::isKeyPressed(Keyboard::Right)) MegaMan.key["R"]=true; if (Keyboard::isKeyPressed(Keyboard::Up)) MegaMan.key["Up"]=true; if (Keyboard::isKeyPressed(Keyboard::Down)) MegaMan.key["Down"]=true; if (Keyboard::isKeyPressed(Keyboard::Space)) MegaMan.key["Space"]=true; for(it=entities.begin();it!=entities.end();) { Entity *b = *it; b->update(time); if (b->life==false) { it = entities.erase(it); delete b; enemyCount++; printf("\n%i", enemyCount);} else it++; } MegaMan.update(time); healthBar.update(MegaMan.Health); if(loadlevel == 2){ if(MegaMan.x > 355.0 && MegaMan.x < 450){ if(MegaMan.y < 345.0 && MegaMan.y > 320){ MegaMan.Health = 0; MegaMan.hit=true; } } if(MegaMan.x > 127 && MegaMan.x <548){ if(MegaMan.y <907 && MegaMan.y>875){ MegaMan.Health = 0; MegaMan.hit=true; } } if(MegaMan.x > 670 && MegaMan.x <1440){ if(MegaMan.y <907 && MegaMan.y>875){ MegaMan.Health = 0; MegaMan.hit=true; } } if(MegaMan.Health == 0){ MegaMan.isDead(); death(); window.close(); } } for(it=entities.begin();it!=entities.end();it++) { //1. враги if ((*it)->Name=="Enemy") { Entity *enemy = *it; if (MegaMan.getRect().intersects( enemy->getRect() )) if (MegaMan.dy>0) { enemy->dx=0; MegaMan.dy=-0.2; enemy->Health=0;} else if (!MegaMan.hit) { MegaMan.Health-=10; MegaMan.hit=true; if(MegaMan.Health == 0){ MegaMan.isDead(); death(); window.close(); } if (MegaMan.dir){ MegaMan.x+=10; } else{ MegaMan.x-=10;} } for (std::list<Entity*>::iterator it2=entities.begin(); it2!=entities.end(); it2++) { Entity *bullet = *it2; if (bullet->Name=="Bullet") if ( bullet->Health>0) if (bullet->getRect().intersects( enemy->getRect() ) ) { bullet->Health=0; enemy->Health-=5;} } } //2. движущиеся платформы if ((*it)->Name=="MovingPlatform") { Entity *movPlat = *it; if (MegaMan.getRect().intersects( movPlat->getRect() ) ) if (MegaMan.dy>0) if (MegaMan.y+MegaMan.h<movPlat->y+movPlat->h) {MegaMan.y=movPlat->y - MegaMan.h + 3; MegaMan.x+=movPlat->dx*time; MegaMan.dy=0; MegaMan.STATE=PLAYER::stay;} } //3.. и т.д. } /////////////////////отображаем на экран///////////////////// view.setCenter( MegaMan.x,MegaMan.y); window.setView(view); background.setPosition(view.getCenter()); window.draw(background); lvl.Draw(window); for(it=entities.begin();it!=entities.end();it++) (*it)->draw(window); if(loadlevel == 1){ if(enemyCount >= 7 && MegaMan.x == 28 && MegaMan.y ==534){ window.close(); victory(); } } if(loadlevel == 2){ if(enemyCount == 5){ window.close(); victory(); } } MegaMan.draw(window); healthBar.draw(window); window.display(); //printf("%f %f\n",MegaMan.x, MegaMan.y); } }
void RunGame() { ///////////// инициализация /////////////////////////// RenderWindow window(VideoMode(1366, 768), "The Game!", Style::Fullscreen); View view( FloatRect(0, 0, 450, 280) ); Level lvl; lvl.LoadFromFile("files/Level2.tmx"); Texture enemy_t, moveplatform_t, megaman_t, bullet_t, bg; bg.loadFromFile("files/images/bg.png"); enemy_t.loadFromFile("files/images/enemy.png"); moveplatform_t.loadFromFile("files/images/movingPlatform.png"); megaman_t.loadFromFile("files/images/megaman.png"); bullet_t.loadFromFile("files/images/bullet.png"); AnimationManager anim; anim.loadFromXML("files/anim_megaman.xml",megaman_t); anim.animList["jump"].loop = 0; AnimationManager anim2; anim2.create("move",bullet_t,7,10,8,8,1,0); anim2.create("explode",bullet_t,27,7,18,18,4,0.01,29,false); AnimationManager anim3; anim3.create("move",enemy_t,0,0,16,16,2,0.002,18); anim3.create("dead",enemy_t,58,0,16,16,1,0); AnimationManager anim4; anim4.create("move",moveplatform_t,0,0,95,22,1,0); Sprite background(bg); background.setOrigin(bg.getSize().x/2,bg.getSize().y/2); std::list<Entity*> entities; std::list<Entity*>::iterator it; std::vector<Object> e = lvl.GetObjects("enemy"); for (int i=0;i < e.size();i++) entities.push_back(new ENEMY(anim3, lvl, e[i].rect.left, e[i].rect.top) ); e = lvl.GetObjects("MovingPlatform"); for (int i=0;i < e.size();i++) entities.push_back(new MovingPlatform(anim4, lvl, e[i].rect.left, e[i].rect.top) ); Object pl = lvl.GetObject("player"); PLAYER Mario(anim, lvl, pl.rect.left, pl.rect.top); HealthBar healthBar; Clock clock; /////////////////// основной цикл ///////////////////// while (window.isOpen()) { float time = clock.getElapsedTime().asMicroseconds(); clock.restart(); time = time/500; // здесь регулируем скорость игры if (time > 40) time = 40; Event event; while (window.pollEvent(event)) { if (event.type == Event::Closed || Keyboard::isKeyPressed(Keyboard::Escape)) window.close(); if (event.type == Event::KeyPressed) if (event.key.code==Keyboard::Space) entities.push_back(new Bullet(anim2,lvl,Mario.x+18,Mario.y+18,Mario.dir) ); } if (Keyboard::isKeyPressed(Keyboard::Left)) Mario.key["L"]=true; if (Keyboard::isKeyPressed(Keyboard::Right)) Mario.key["R"]=true; if (Keyboard::isKeyPressed(Keyboard::Up)) Mario.key["Up"]=true; if (Keyboard::isKeyPressed(Keyboard::Down)) Mario.key["Down"]=true; if (Keyboard::isKeyPressed(Keyboard::Space)) Mario.key["Space"]=true; for(it=entities.begin();it!=entities.end();) { Entity *b = *it; b->update(time); if (b->life==false) { it = entities.erase(it); delete b;} else it++; } Mario.update(time); healthBar.update(Mario.Health); for(it=entities.begin();it!=entities.end();it++) { //1. враги if ((*it)->Name=="Enemy") { Entity *enemy = *it; if (enemy->Health<=0) continue; if (Mario.getRect().intersects( enemy->getRect() )) if (Mario.dy>0) { enemy->dx=0; Mario.dy=-0.2; enemy->Health=0;} else if (!Mario.hit) { Mario.Health-=5; Mario.hit=true; if (Mario.dir) Mario.x+=10; else Mario.x-=10;} for (std::list<Entity*>::iterator it2=entities.begin(); it2!=entities.end(); it2++) { Entity *bullet = *it2; if (bullet->Name=="Bullet") if ( bullet->Health>0) if (bullet->getRect().intersects( enemy->getRect() ) ) { bullet->Health=0; enemy->Health-=5;} } } //2. движущиеся платформы if ((*it)->Name=="MovingPlatform") { Entity *movPlat = *it; if (Mario.getRect().intersects( movPlat->getRect() ) ) if (Mario.dy>0) if (Mario.y+Mario.h<movPlat->y+movPlat->h) {Mario.y=movPlat->y - Mario.h + 3; Mario.x+=movPlat->dx*time; Mario.dy=0; Mario.STATE=PLAYER::stay;} } //3.. и т.д. } /////////////////////отображаем на экран///////////////////// view.setCenter( Mario.x,Mario.y); window.setView(view); background.setPosition(view.getCenter()); window.draw(background); lvl.Draw(window); for(it=entities.begin();it!=entities.end();it++) (*it)->draw(window); Mario.draw(window); healthBar.draw(window); window.display(); } }
int main() { srand(time(NULL)); Level lvl; lvl.LoadFromFile("/home/oawad/Downloads/sfml/platformer/platformer.tmx"); b2Vec2 gravity(0.0f, 1.0f); b2World world(gravity); sf::Vector2i tileSize = lvl.GetTileSize(); std::vector<Object> block = lvl.GetObjects("block"); for(int i = 0; i < block.size(); i++) { b2BodyDef bodyDef; bodyDef.type = b2_staticBody; bodyDef.position.Set(block[i].rect.left + tileSize.x / 2 * (block[i].rect.width / tileSize.x - 1), block[i].rect.top + tileSize.y / 2 * (block[i].rect.height / tileSize.y - 1)); b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(block[i].rect.width / 2, block[i].rect.height / 2); body->CreateFixture(&shape,1.0f); } coin = lvl.GetObjects("coin"); for(int i = 0; i < coin.size(); i++) { b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(coin[i].rect.left + tileSize.x / 2 * (coin[i].rect.width / tileSize.x - 1), coin[i].rect.top + tileSize.y / 2 * (coin[i].rect.height / tileSize.y - 1)); bodyDef.fixedRotation = true; b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(coin[i].rect.width / 2, coin[i].rect.height / 2); body->CreateFixture(&shape,1.0f); coinBody.push_back(body); } enemy = lvl.GetObjects("enemy"); for(int i = 0; i < enemy.size(); i++) { b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(enemy[i].rect.left + tileSize.x / 2 * (enemy[i].rect.width / tileSize.x - 1), enemy[i].rect.top + tileSize.y / 2 * (enemy[i].rect.height / tileSize.y - 1)); bodyDef.fixedRotation = true; b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(enemy[i].rect.width / 2, enemy[i].rect.height / 2); body->CreateFixture(&shape,1.0f); enemyBody.push_back(body); } player = lvl.GetObject("player"); b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(player.rect.left, player.rect.top); bodyDef.fixedRotation = true; playerBody = world.CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(player.rect.width / 2, player.rect.height / 2); b2FixtureDef fixtureDef; fixtureDef.shape = &shape; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; playerBody->CreateFixture(&fixtureDef); sf::Vector2i screenSize(800, 600); sf::RenderWindow window; window.create(sf::VideoMode(screenSize.x, screenSize.y), "Game"); sf::View view; view.reset(sf::FloatRect(0.0f, 0.0f, screenSize.x, screenSize.y)); view.setViewport(sf::FloatRect(0.0f, 0.0f, 2.0f, 2.0f)); while(window.isOpen()) { sf::Event evt; while(window.pollEvent(evt)) { switch(evt.type) { case sf::Event::Closed: window.close(); break; case sf::Event::KeyPressed: if(evt.key.code == sf::Keyboard::W && playerBody->GetLinearVelocity().y == 0) playerBody->SetLinearVelocity(b2Vec2(0.0f, -15.0f)); if(evt.key.code == sf::Keyboard::D) playerBody->SetLinearVelocity(b2Vec2(5.0f, 0.0f)); if(evt.key.code == sf::Keyboard::A) playerBody->SetLinearVelocity(b2Vec2(-5.0f, 0.0f)); break; } } world.Step(1.0f / 60.0f, 1, 1); for(b2ContactEdge* ce = playerBody->GetContactList(); ce; ce = ce->next) { b2Contact* c = ce->contact; for(int i = 0; i < coinBody.size(); i++) if(c->GetFixtureA() == coinBody[i]->GetFixtureList()) { coinBody[i]->DestroyFixture(coinBody[i]->GetFixtureList()); coin.erase(coin.begin() + i); coinBody.erase(coinBody.begin() + i); } for(int i = 0; i < enemyBody.size(); i++) if(c->GetFixtureA() == enemyBody[i]->GetFixtureList()) { if(playerBody->GetPosition().y < enemyBody[i]->GetPosition().y) { playerBody->SetLinearVelocity(b2Vec2(0.0f, -10.0f)); enemyBody[i]->DestroyFixture(enemyBody[i]->GetFixtureList()); enemy.erase(enemy.begin() + i); enemyBody.erase(enemyBody.begin() + i); } else { int tmp = (playerBody->GetPosition().x < enemyBody[i]->GetPosition().x) ? -1 : 1; playerBody->SetLinearVelocity(b2Vec2(10.0f * tmp, 0.0f)); } } } for(int i = 0; i < enemyBody.size(); i++) { if(enemyBody[i]->GetLinearVelocity() == b2Vec2_zero) { int tmp = (rand() % 2 == 1) ? 1 : -1; enemyBody[i]->SetLinearVelocity(b2Vec2(5.0f * tmp, 0.0f)); } } b2Vec2 pos = playerBody->GetPosition(); view.setCenter(pos.x + screenSize.x / 4, pos.y + screenSize.y / 4); window.setView(view); player.sprite.setPosition(pos.x, pos.y); for(int i = 0; i < coin.size(); i++) coin[i].sprite.setPosition(coinBody[i]->GetPosition().x, coinBody[i]->GetPosition().y); for(int i = 0; i < enemy.size(); i++) enemy[i].sprite.setPosition(enemyBody[i]->GetPosition().x, enemyBody[i]->GetPosition().y); window.clear(); lvl.Draw(window); window.draw(player.sprite); for(int i = 0; i < coin.size(); i++) window.draw(coin[i].sprite); for(int i = 0; i < enemy.size(); i++) window.draw(enemy[i].sprite); window.display(); } return 0; }