int main(){ //game map is 224 x 288 //28 x 36 tiles, 8 pixels square int gameWidth = 224; int gameHeight = 288; sf::RenderWindow window(sf::VideoMode(gameWidth, gameHeight), "SFML Application"); int rows = 36; int cols = 28; Tile tileArray[36][28]; //background stuff //main sprite sheet, textures from this sf::Texture spriteSheet; spriteSheet.loadFromFile("ARC_Pacman_everything.png"); //dot sprite sf::Sprite dot; dot.setTexture(spriteSheet); dot.setTextureRect(sf::IntRect(8, 8, 8, 8)); dot.setOrigin(4, 4); //powerup sprite sf::Sprite powerup; powerup.setTexture(spriteSheet); powerup.setTextureRect(sf::IntRect(8, 8 * 3, 8, 8)); powerup.setOrigin(4, 4); //wall sprite for testing sf::Sprite wall; wall.setTexture(spriteSheet); wall.setTextureRect(sf::IntRect(8, 8, 8, 8)); wall.setColor(sf::Color(0, 255, 0)); // green wall.setOrigin(4, 4); //set up the map, tiles wall by default for (int i = 0; i < rows; i++){ for (int j = 0; j < cols; j++){ tileArray[i][j].resetMap(i, j); if (tileArray[i][j].getType() == 'd'){ tileArray[i][j].setSprite(dot); } if (tileArray[i][j].getType() == 'u'){ tileArray[i][j].setSprite(powerup); } if (tileArray[i][j].getType() == 'e'){ tileArray[i][j].setSprite(wall); } } } //cosmetic background sf::Sprite background; sf::Texture mazeBackground; if (!mazeBackground.loadFromFile("Pac Man Map.png", sf::IntRect(0, 0, 224, 288))) //map section of spritesheet { printf("unable to load background texture"); } background.setTexture(mazeBackground); //background.setPosition(0, (8 * 3)); //leave space for score and lives background.setPosition(-4, 8 * 2.5); //player sf::Sprite playerSprite; playerSprite.setTexture(spriteSheet); playerSprite.setTextureRect(sf::IntRect(470, 0, 16, 16)); playerSprite.setOrigin(sf::Vector2f(8, 8)); playerSprite.setPosition(14 * 8, 20 * 8); //(gameWidth/2,gameHeight/2+20); //just under ghost house Player player(20, 14, playerSprite); //score display and other text //score display sf::Font font; if (!font.loadFromFile("arial.ttf")) printf("unable to load font"); sf::Text scoreDisplay; scoreDisplay.setFont(font); scoreDisplay.setCharacterSize(11); scoreDisplay.setPosition(8, gameHeight - 16); scoreDisplay.setColor(sf::Color::White); int score = 0; scoreDisplay.setString("Score: "+ (std::to_string(score)) ); //ghosts //ghost sprites sf::Texture ghostTex; ghostTex.loadFromFile("Pac Man Map.png"); //blinky sf::Sprite blinkySpr; blinkySpr.setTexture(ghostTex); sf::IntRect blink (228, 64, 16, 16); blinkySpr.setTextureRect(blink); blinkySpr.setOrigin(8, 8); Ghosts blinky('c', 'b', blinkySpr, 14, 14); blinkySpr.setPosition(14 * 8, 14 * 8); //inky sf::Sprite inkySpr; inkySpr.setTexture(ghostTex); inkySpr.setTextureRect(sf::IntRect(228, 96, 16, 16)); inkySpr.setOrigin(8, 8); Ghosts inky('h', 'i', inkySpr, 14, 14); //movement will start outside house inkySpr.setPosition(11.5 * 8, 16.5* 8); //pinky sf::Sprite pinkySpr; pinkySpr.setTexture(ghostTex); pinkySpr.setTextureRect(sf::IntRect(228, 80, 16, 16)); pinkySpr.setOrigin(8, 8); Ghosts pinky('h', 'p', pinkySpr, 14, 14); pinkySpr.setPosition(13.5 * 8, 17 * 8); //clyde sf::Sprite clydeSpr; clydeSpr.setTexture(ghostTex); clydeSpr.setTextureRect(sf::IntRect(228, 112, 16, 16)); clydeSpr.setOrigin(8, 8); Ghosts clyde('h', 'c', clydeSpr, 14, 14); clydeSpr.setPosition(15.5 * 8, 16.5 * 8); //fright sprite //sf::Sprite frightSpr; //frightSpr.setTexture(ghostTex); sf::IntRect fright (356, 64, 16, 16); //frightSpr.setTextureRect(fright); //frightSpr.setOrigin(8, 8); //timer sf::Clock clock; sf::Time elapsed1; int waveCount = 1; int dotCounter = 0; ////////--------window loop--------------///////////// while (window.isOpen()){ elapsed1 = clock.getElapsedTime(); if (clock.getElapsedTime() >= sf::seconds(4)){ /* blinky.frightenGhost(fright); blinkySpr.setTextureRect(fright); //fright blinky inky.frightenGhost(fright); inkySpr.setTextureRect(fright); //fright inky pinky.frightenGhost(fright); pinkySpr.setTextureRect(fright); //fright pinky clyde.frightenGhost(fright); clydeSpr.setTextureRect(fright); //fright clyde */ } int pRow = player.xpos; int pCol = player.ypos; char toTileType; sf::Event event; while (window.pollEvent(event)){ if (event.type == sf::Event::Closed){ window.close(); } // can't get continuous movement to work to save my life //move player up if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){ toTileType = tileArray[pRow - 1][pCol].getType(); if (toTileType != 'w'){ player.setDirection('u'); player.move(); //playerSprite = player.getSprite(); } //adjust score & tile if applicable if (toTileType == 'd'){ tileArray[pRow - 1][pCol].setType('e'); score += 1; scoreDisplay.setString("Score: " + (std::to_string(score))); } else if (toTileType == 'u'){ tileArray[pRow - 1][pCol].setType('e'); score += 2; scoreDisplay.setString("Score: " + (std::to_string(score))); blinky.frightenGhost(fright); blinkySpr.setTextureRect(fright); //fright blinky inky.frightenGhost(fright); inkySpr.setTextureRect(fright); //fright inky pinky.frightenGhost(fright); pinkySpr.setTextureRect(fright); //fright pinky clyde.frightenGhost(fright); clydeSpr.setTextureRect(fright); //fright clyde } } //move player down if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){ toTileType = tileArray[pRow + 1][pCol].getType(); if (toTileType != 'w'){ player.setDirection('d'); player.move(); //playerSprite = player.getSprite(); } //adjust score & tile if applicable if (toTileType == 'd'){ tileArray[pRow + 1][pCol].setType('e'); score += 1; scoreDisplay.setString("Score: " + (std::to_string(score))); } else if (toTileType == 'u'){ tileArray[pRow + 1][pCol].setType('e'); score += 2; scoreDisplay.setString("Score: " + (std::to_string(score))); blinky.frightenGhost(fright); blinkySpr.setTextureRect(fright); //fright blinky inky.frightenGhost(fright); inkySpr.setTextureRect(fright); //fright inky pinky.frightenGhost(fright); pinkySpr.setTextureRect(fright); //fright pinky clyde.frightenGhost(fright); clydeSpr.setTextureRect(fright); //fright clyde } } //move player left if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){ toTileType = tileArray[pRow][pCol - 1].getType(); if (toTileType != 'w'){ player.setDirection('l'); if (pRow == 17 && pCol == 1) player.wrapHorizontal(); else { player.move(); } //playerSprite = player.getSprite(); } //adjust score & tile if applicable if (toTileType == 'd'){ tileArray[pRow][pCol - 1].setType('e'); score += 1; scoreDisplay.setString("Score: " + (std::to_string(score))); } else if (toTileType == 'u'){ tileArray[pRow][pCol-1].setType('e'); score += 2; scoreDisplay.setString("Score: " + (std::to_string(score))); blinky.frightenGhost(fright); blinkySpr.setTextureRect(fright); //fright blinky inky.frightenGhost(fright); inkySpr.setTextureRect(fright); //fright inky pinky.frightenGhost(fright); pinkySpr.setTextureRect(fright); //fright pinky clyde.frightenGhost(fright); clydeSpr.setTextureRect(fright); //fright clyde } } //move player right if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){ toTileType = tileArray[pRow][pCol + 1].getType(); if (pRow == 17 && pCol == 27) { player.setDirection('r'); player.wrapHorizontal(); //playerSprite = player.getSprite(); } else{ if (toTileType != 'w'){ player.setDirection('r'); player.move(); } } //playerSprite = player.getSprite(); //adjust score & tile if applicable if (toTileType == 'd'){ tileArray[pRow][pCol + 1].setType('e'); score += 1; scoreDisplay.setString("Score: " + (std::to_string(score))); } else if (toTileType == 'u'){ tileArray[pRow][pCol+1].setType('e'); score += 2; scoreDisplay.setString("Score: " + (std::to_string(score))); blinky.frightenGhost(fright); blinkySpr.setTextureRect(fright); //fright blinky inky.frightenGhost(fright); inkySpr.setTextureRect(fright); //fright inky pinky.frightenGhost(fright); pinkySpr.setTextureRect(fright); //fright pinky clyde.frightenGhost(fright); clydeSpr.setTextureRect(fright); //fright clyde } } //reset dots if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::R)){ for (int i = 0; i < rows; i++){ for (int j = 0; j < cols; j++){ tileArray[i][j].resetMap(i, j); if (tileArray[i][j].getType() == 'd'){ tileArray[i][j].setSprite(dot); } if (tileArray[i][j].getType() == 'u'){ tileArray[i][j].setSprite(powerup); } if (tileArray[i][j].getType() == 'e'){ tileArray[i][j].setSprite(wall); } } } } playerSprite = player.getSprite(); window.clear(); window.draw(background); //draw dots and powerups for (int j = 0; j < rows; j++){ for (int i = 0; i < cols; i++){ int xpos = i * 8; int ypos = j * 8; Tile t = tileArray[j][i]; //j row, i col /* if (i == 25 && j == 26) { //playerSprite.setPosition(i * 8, j * 8); //window.draw(playerSprite); } //*/ if (t.getType() == 'd' || t.getType() == 'u'){ sf::Sprite drawTi = t.getSprite(); drawTi.setPosition(xpos, ypos); window.draw(drawTi); } /* else if (t.getType() == 'e'){ sf::Sprite drawTi = wall; //t.getSprite(); drawTi.setPosition(xpos, ypos); window.draw(drawTi); } */ } } window.draw(playerSprite); window.draw(blinkySpr); window.draw(inkySpr); window.draw(pinkySpr); window.draw(clydeSpr); window.draw(scoreDisplay); window.display(); } } }
int main(){ //The game map is 224 x 288 //28 x 36 tiles of 8 pixels square //spritesheet is 452 x 248 sf::SoundBuffer introb; introb.loadFromFile("pacman_beginning.wav"); sf::Sound intro; intro.setBuffer(introb); sf::SoundBuffer nomgb; nomgb.loadFromFile("pacman_eatghost.wav"); sf::Sound nomGhost; nomGhost.setBuffer(nomgb); sf::SoundBuffer wakab; wakab.loadFromFile("pacman_chomp.wav"); sf::Sound waka; waka.setBuffer(wakab); sf::SoundBuffer dieb; dieb.loadFromFile("pacman_death.wav"); sf::Sound deathNoise; deathNoise.setBuffer(dieb); bool started = false; bool godMode = true; int addScore = 0; int score = 0; int dots = 0; int lives = 2; int locationID; double targetX; double targetY; double distance; double lastDistance; char nextDirection; int random; srand(100); sf::RenderWindow window(sf::VideoMode(224, 288), "SFML Application"); sf::Texture spriteSheet; spriteSheet.loadFromFile("Pac Man Map.png"); sf::Sprite mazeSprite; mazeSprite.setTexture(spriteSheet); mazeSprite.setPosition(0, 24); //create pacman sf::Sprite player; player.setTexture(spriteSheet); Player pacMan(player); sf::Sprite life1; sf::Sprite life2; life1.setTexture(spriteSheet); life2.setTexture(spriteSheet); life1.setTextureRect(sf::IntRect(225, 0, 16, 16)); life2.setTextureRect(sf::IntRect(225, 0, 16, 16)); life1.setPosition(2 * 8, 34 * 8); life2.setPosition(4 * 8, 34 * 8); Tile tileSet[28][36]; //give each tile a location and unique ID int ID = 0; for (int i = 0; i < 28; i++){ for (int j = 0; j < 36; j++){ tileSet[i][j].setTile('d', mazeSprite); tileSet[i][j].setLocationID(i * 8, j * 8, ID); ID++; } } tileSet[1][6].setTile('e', mazeSprite); tileSet[26][6].setTile('e', mazeSprite); tileSet[1][26].setTile('e', mazeSprite); tileSet[26][26].setTile('e', mazeSprite); //create ghosts //(i)nky, (b)linky, (c)lyde, (p)inky Ghost blinky('b', 110, (14 * 8) + 4, mazeSprite); Ghost pinky('p', 100, 100, mazeSprite); Ghost inky('i', 100, 100, mazeSprite); Ghost clyde('c', 120, 100, mazeSprite); Ghost enemies[4] = {blinky, pinky, inky, clyde}; double inkyX; double inkyY; while (window.isOpen()){ sf::Event event; while (window.pollEvent(event)){ if (event.type == sf::Event::Closed) window.close(); } //change PacMan's facing to direction pressed if direction valid if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){ if (tileSet[pacMan.getTileX() - 1][pacMan.getTileY()].isLegal() == true){ pacMan.move('l'); } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){ if (tileSet[pacMan.getTileX() + 1][pacMan.getTileY()].isLegal() == true){ pacMan.move('r'); } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){ if (tileSet[pacMan.getTileX()][pacMan.getTileY() - 1].isLegal() == true){ pacMan.move('u'); } } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){ if (tileSet[pacMan.getTileX()][pacMan.getTileY() + 1].isLegal() == true){ pacMan.move('d'); } } //move PacMan forward if there is no wall in front of him if (pacMan.getFacing() == 'u' && tileSet[pacMan.getTileX()][pacMan.getTileY() - 1].isLegal() == true || pacMan.getFacing() == 'd' && tileSet[pacMan.getTileX()][pacMan.getTileY() + 1].isLegal() == true || pacMan.getFacing() == 'l' && tileSet[pacMan.getTileX() - 1][pacMan.getTileY()].isLegal() == true || pacMan.getFacing() == 'r' && tileSet[pacMan.getTileX() + 1][pacMan.getTileY()].isLegal() == true){ pacMan.update(); } //eat whatever is in current tile, add to score, and apply effects addScore = tileSet[pacMan.getTileX()][pacMan.getTileY()].eatTile(); score = score + addScore; if (addScore == 10){ waka.play(); dots++; for (int i = 0; i < 4; i++){ enemies[i].add(); } if (dots == 254){ printf("all dots eaten"); for (int j = 0; j < 4; j++){ enemies[j].setMode('h'); } pacMan.die(); for (int k = 0; k < 28; k++){ for (int l = 0; l < 36; l++){ tileSet[k][l].resetTile(); } } tileSet[1][6].setTile('e', mazeSprite); tileSet[26][6].setTile('e', mazeSprite); tileSet[1][26].setTile('e', mazeSprite); tileSet[26][26].setTile('e', mazeSprite); started = false; } } else if (addScore == 50){ for (int i = 0; i < 4; i++){ enemies[i].setMode('f'); dots++; for (int i = 0; i < 4; i++){ enemies[i].add(); } if (dots == 254){ printf("all dots eaten"); for (int j = 0; j < 4; j++){ enemies[j].setMode('h'); } pacMan.die(); for (int k = 0; k < 28; k++){ for (int l = 0; l < 36; l++){ tileSet[k][l].resetTile(); } } tileSet[1][6].setTile('e', mazeSprite); tileSet[26][6].setTile('e', mazeSprite); tileSet[1][26].setTile('e', mazeSprite); tileSet[26][26].setTile('e', mazeSprite); started = false; } } } for (int i = 0; i < 4; i++){ //find pacmans's tile and compare to ghost's tile, if same eat or die locationID = tileSet[pacMan.getTileX()][pacMan.getTileY()].getID(); if (tileSet[enemies[i].getTileX()][enemies[i].getTileY()].getID() == locationID){ if (enemies[i].getMode() == 'f'){ enemies[i].setMode('h'); nomGhost.play(); } else if (godMode == false){ deathNoise.play(); Sleep(2000); for (int j = 0; j < 4; j++){ enemies[j].setMode('h'); } pacMan.die(); lives--; if (lives < 0){ score = 0; for (int k = 0; k < 28; k++){ for (int l = 0; l < 36; l++){ tileSet[k][l].resetTile(); } } tileSet[1][6].setTile('e', mazeSprite); tileSet[26][6].setTile('e', mazeSprite); tileSet[1][26].setTile('e', mazeSprite); tileSet[26][26].setTile('e', mazeSprite); started = false; } break; } } //check if each ghost is in a new tile, break if false if (tileSet[enemies[i].getTileX()][enemies[i].getTileY()].getID() != enemies[i].getCurrentTile()){ //set up target tile //chase mode different for each ghost if (enemies[i].getName() == 'b' && enemies[i].getMode() == 'c'){ targetX = pacMan.getTileX(); targetY = pacMan.getTileY(); } if (enemies[i].getName() == 'p' && enemies[i].getMode() == 'c'){ if (pacMan.getFacing() == 'l'){ targetX = pacMan.getTileX() - 3; targetY = pacMan.getTileY(); } if (pacMan.getFacing() == 'r'){ targetX = pacMan.getTileX() + 3; targetY = pacMan.getTileY(); } if (pacMan.getFacing() == 'u'){ //this is wrong intentionally, it is a bug in the original version of PacMan targetX = pacMan.getTileX() - 3; targetY = pacMan.getTileY() - 3; } if (pacMan.getFacing() == 'd'){ targetX = pacMan.getTileX(); targetY = pacMan.getTileY() + 3; } } if (enemies[i].getName() == 'i' && enemies[i].getMode() == 'c'){ if (pacMan.getFacing() == 'l'){ inkyX = pacMan.getTileX() - 3; inkyY = pacMan.getTileY(); } if (pacMan.getFacing() == 'r'){ inkyX = pacMan.getTileX() + 3; inkyY = pacMan.getTileY(); } if (pacMan.getFacing() == 'u'){ //this is wrong intentionally, it is a bug in the original version of PacMan inkyX = pacMan.getTileX() - 3; inkyY = pacMan.getTileY() - 3; } if (pacMan.getFacing() == 'd'){ inkyX = pacMan.getTileX(); inkyY = pacMan.getTileY() + 3; } targetX = inkyX + (inkyX - enemies[0].getTileX()); targetY = inkyY + (inkyY - enemies[0].getTileY()); } if (enemies[i].getName() == 'c' && enemies[i].getMode() == 'c'){ targetX = pacMan.getTileX(); targetY = pacMan.getTileY(); if (sqrt((enemies[i].getTileX() - targetX) * (enemies[i].getTileX() - targetX) + (pacMan.getTileY() - enemies[i].getTileY()) * (pacMan.getTileY() - enemies[i].getTileY())) < 8){ targetX = 0; targetY = 34; } } //set target to home corner in scatter mode if (enemies[i].getMode() == 's'){ if (enemies[i].getName() == 'b'){ targetX = 26; targetY = 0; } if (enemies[i].getName() == 'p'){ targetX = 2; targetY = 0; } if (enemies[i].getName() == 'i'){ targetX = 27; targetY = 34; } if (enemies[i].getName() == 'c'){ targetX = 0; targetY = 33; } } //check each tile in order around ghost, except for behind, for closest tile to target //right down left up order if (enemies[i].getMode() == 'c' || enemies[i].getMode() == 's'){ lastDistance = -1; if (tileSet[enemies[i].getTileX() + 1][enemies[i].getTileY()].isLegal() == true && enemies[i].getFacing() != 'l'){ nextDirection = 'r'; lastDistance = (sqrt((enemies[i].getTileX() + 1 - targetX) * (enemies[i].getTileX() + 1 - targetX) + (pacMan.getTileY() - enemies[i].getTileY()) * (pacMan.getTileY() - enemies[i].getTileY()))); //printf("R"); } if (tileSet[enemies[i].getTileX()][enemies[i].getTileY() + 1].isLegal() == true && enemies[i].getFacing() != 'u'){ distance = (sqrt((enemies[i].getTileX() - targetX) * (enemies[i].getTileX() - targetX) + (enemies[i].getTileY() + 1 - targetY) * (enemies[i].getTileY() + 1 - targetY))); if (distance <= lastDistance || lastDistance == -1){ nextDirection = 'd'; lastDistance = distance; } //printf("D"); } if (tileSet[enemies[i].getTileX() - 1][enemies[i].getTileY()].isLegal() == true && enemies[i].getFacing() != 'r'){ distance = (sqrt((enemies[i].getTileX() - 1 - targetX) * (enemies[i].getTileX() - 1 - targetX) + (enemies[i].getTileY() - targetY) * (enemies[i].getTileY() - targetY))); if (distance <= lastDistance || lastDistance == -1){ nextDirection = 'l'; lastDistance = distance; } //printf("L"); } if (tileSet[enemies[i].getTileX()][enemies[i].getTileY() - 1].isLegal() == true && enemies[i].getFacing() != 'd'){ distance = (sqrt((enemies[i].getTileX() - targetX) * (enemies[i].getTileX() - targetX) + (enemies[i].getTileY() - 1 - targetY) * (enemies[i].getTileY() - 1 - targetY))); if (distance <= lastDistance || lastDistance == -1){ nextDirection = 'u'; } //printf("U"); } } else if (enemies[i].getMode() == 'f'){ random = rand() % 4; for (int j = 0; j < 4; j++){ if (tileSet[enemies[i].getTileX()][enemies[i].getTileY() - 1].isLegal() == true && enemies[i].getFacing() != 'd'){ if (random == 0){ nextDirection = 'u'; random--; } else{ random--; } } if (tileSet[enemies[i].getTileX() - 1][enemies[i].getTileY()].isLegal() == true && enemies[i].getFacing() != 'r'){ if (random == 0){ nextDirection = 'l'; random--; } else{ random--; } } if (tileSet[enemies[i].getTileX()][enemies[i].getTileY() + 1].isLegal() == true && enemies[i].getFacing() != 'u'){ if (random == 0){ nextDirection = 'd'; random--; } else{ random--; } } if (tileSet[enemies[i].getTileX() + 1][enemies[i].getTileY()].isLegal() == true && enemies[i].getFacing() != 'l'){ if (random == 0){ nextDirection = 'r'; random--; } else{ random--; } } } } //if that tile is closer to target than last, face towards that one enemies[i].move(nextDirection); //set new currentTile enemies[i].setCurrentTile(tileSet[enemies[i].getTileX()][enemies[i].getTileY()].getID()); } enemies[i].update(); } window.clear(); window.draw(mazeSprite); for (int i = 0; i < 28; i++){ for (int j = 0; j < 36; j++){ if (tileSet[i][j].isVisible() == true){ window.draw(tileSet[i][j].getSprite()); } } } window.draw(pacMan.getSprite()); window.draw(enemies[0].getSprite()); window.draw(enemies[1].getSprite()); window.draw(enemies[2].getSprite()); window.draw(enemies[3].getSprite()); if (lives > 0){ window.draw(life1); } if (lives > 1){ window.draw(life2); } window.display(); if (started == false){ started = true; intro.play(); Sleep(4000); } } }
int main(int, char const**) { // Create the main window sf::RenderWindow window(sf::VideoMode(TILE_WIDTH*28, TILE_WIDTH*31), "PAC MAN"); window.setFramerateLimit(FRAME_RATE); // Set the Icon sf::Image icon; if (!icon.loadFromFile(resourcePath() + "icon.png")) { return EXIT_FAILURE; } window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr()); // Try to open the given texture sf::Texture tileset_texture; if (!tileset_texture.loadFromFile(resourcePath() + "data/full_texture_x3.png")) { return EXIT_FAILURE; } // More importantly, let's generate our tileset from that texture. AssetManager assetManager(TILE_WIDTH); std::map<sf::String, sf::Sprite> spriteSet = assetManager.generateSpriteSet(&tileset_texture); std::map<sf::String, PacTile*> tileSet; PacTile outer_top_left_corner(spriteSet["outer_top_left_corner"], "WALL"); tileSet["outer_top_left_corner"] = &outer_top_left_corner; PacTile weird_north_left_corner(spriteSet["weird_north_left_corner"], "WALL"); tileSet["weird_north_left_corner"] = &weird_north_left_corner; PacTile weird_west_upper_corner(spriteSet["weird_west_upper_corner"], "WALL"); tileSet["weird_west_upper_corner"] = &weird_west_upper_corner; PacTile weird_east_upper_corner(spriteSet["weird_east_upper_corner"], "WALL"); tileSet["weird_east_upper_corner"] = &weird_east_upper_corner; PacTile weird_west_lower_corner(spriteSet["weird_west_lower_corner"], "WALL"); tileSet["weird_west_lower_corner"] = &weird_west_lower_corner; PacTile weird_east_lower_corner(spriteSet["weird_east_lower_corner"], "WALL"); tileSet["weird_east_lower_corner"] = &weird_east_lower_corner; PacTile box_top_left_corner(spriteSet["box_top_left_corner"], "WALL"); tileSet["box_top_left_corner"] = &box_top_left_corner; PacTile top_right_corner(spriteSet["top_right_corner"], "WALL"); tileSet["top_right_corner"] = &top_right_corner; PacTile weird_north_right_corner(spriteSet["weird_north_right_corner"], "WALL"); tileSet["weird_north_right_corner"] = &weird_north_right_corner; PacTile box_top_right_corner(spriteSet["box_top_right_corner"], "WALL"); tileSet["box_top_right_corner"] = &box_top_right_corner; PacTile bottom_right_corner(spriteSet["bottom_right_corner"], "WALL"); tileSet["bottom_right_corner"] = &bottom_right_corner; PacTile box_bottom_right_corner(spriteSet["box_bottom_right_corner"], "WALL"); tileSet["box_bottom_right_corner"] = &box_bottom_right_corner; PacTile bottom_left_corner(spriteSet["bottom_left_corner"], "WALL"); tileSet["bottom_left_corner"] = &bottom_left_corner; PacTile box_bottom_left_corner(spriteSet["box_bottom_left_corner"], "WALL"); tileSet["box_bottom_left_corner"] = &box_bottom_left_corner; PacTile top_edge(spriteSet["top_edge"], "WALL"); tileSet["top_edge"] = &top_edge; PacTile box_top_edge(spriteSet["box_top_edge"], "WALL"); tileSet["box_top_edge"] = &box_top_edge; PacTile left_edge(spriteSet["left_edge"], "WALL"); tileSet["left_edge"] = &left_edge; PacTile inner_left_edge(spriteSet["inner_left_edge"], "WALL"); tileSet["inner_left_edge"] = &inner_left_edge; PacTile right_edge(spriteSet["right_edge"], "WALL"); tileSet["right_edge"] = &right_edge; PacTile inner_right_edge(spriteSet["inner_right_edge"], "WALL"); tileSet["inner_right_edge"] = &inner_right_edge; PacTile bottom_edge(spriteSet["bottom_edge"], "WALL"); tileSet["bottom_edge"] = &bottom_edge; PacTile box_bottom_edge(spriteSet["box_bottom_edge"], "WALL"); tileSet["box_bottom_edge"] = &box_bottom_edge; // House tiles! PacTile house_top_right_corner(spriteSet["house_top_right_corner"], "WALL"); tileSet["house_top_right_corner"] = &house_top_right_corner; PacTile house_bottom_right_corner(spriteSet["house_bottom_right_corner"], "WALL"); tileSet["house_bottom_right_corner"] = &house_bottom_right_corner; PacTile house_top_left_corner(spriteSet["house_top_left_corner"], "WALL"); tileSet["house_top_left_corner"] = &house_top_left_corner; PacTile house_bottom_left_corner(spriteSet["house_bottom_left_corner"], "WALL"); tileSet["house_bottom_left_corner"] = &house_bottom_left_corner; PacTile door(spriteSet["door"], "WALL"); tileSet["door"] = &door; PacTile floor(spriteSet["floor"], "FLOOR"); tileSet["floor"] = &floor; // Load up the map! Map map(sf::Vector2<double>(0, 0), sf::Vector2<int>(28, 31), TILE_WIDTH); map.configureMap(tileSet); // Create a graphical text to display /*sf::Font font; if (!font.loadFromFile(resourcePath() + "sansation.ttf")) { return EXIT_FAILURE; } // Load a music to play sf::Music music; if (!music.openFromFile(resourcePath() + "nice_music.ogg")) { return EXIT_FAILURE; }*/ // Declare the ghosts! Pinky pinky(sf::Vector2<double>(0, 0), "HOME"); Blinky blinky(sf::Vector2<double>(0, 0), "HOME"); Inky inky(sf::Vector2<double>(0, 0), "HOME"); Sue sue(sf::Vector2<double>(0, 0), "HOME"); // Game variables // Assemble the PacMan! PacMan pacman(1, 1, 1, 60, map); std::vector<sf::Sprite> pacUpSprites; std::vector<sf::Sprite> pacDownSprites; std::vector<sf::Sprite> pacLeftSprites; std::vector<sf::Sprite> pacRightSprites; pacUpSprites.push_back(spriteSet["pacUp0"]); pacUpSprites.push_back(spriteSet["pacUp1"]); pacUpSprites.push_back(spriteSet["pacUp2"]); pacUpSprites.push_back(spriteSet["pacUp1"]); pacDownSprites.push_back(spriteSet["pacDown0"]); pacDownSprites.push_back(spriteSet["pacDown1"]); pacDownSprites.push_back(spriteSet["pacDown2"]); pacDownSprites.push_back(spriteSet["pacDown1"]); pacLeftSprites.push_back(spriteSet["pacLeft0"]); pacLeftSprites.push_back(spriteSet["pacLeft1"]); pacLeftSprites.push_back(spriteSet["pacLeft2"]); pacLeftSprites.push_back(spriteSet["pacLeft1"]); pacRightSprites.push_back(spriteSet["pacRight0"]); pacRightSprites.push_back(spriteSet["pacRight1"]); pacRightSprites.push_back(spriteSet["pacRight2"]); pacRightSprites.push_back(spriteSet["pacRight1"]); pacman.setUpSprites(pacUpSprites, 4); pacman.setDownSprites(pacDownSprites, 4); pacman.setLeftSprites(pacLeftSprites, 4); pacman.setRightSprites(pacRightSprites, 4); pacman.setVelocity(sf::Vector2<double>(0.0, 1.0)); pacman.initialize("RIGHT"); // Play the music // music.play(); // Start the game loop while (window.isOpen()) { // Process events sf::Event event; while (window.pollEvent(event)) { // Close window: exit if (event.type == sf::Event::Closed) { window.close(); } // Escape pressed: exit if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) { window.close(); } } pacman.update(map); // DRAWING THE SCREEN window.clear(); // Draw the map drawMap(&window, map); // Then, draw any pellets / fruits, those type things // Then, draw the ghosts // Then, draw pacman window.draw(pacman.getSprite()); // Update the window window.display(); } return EXIT_SUCCESS; }
main_game::main_game() { Level levelMap[36][28]; sf::RenderWindow window(sf::VideoMode(screenW, screenH), "Pacman Game"); sf::Texture spriteSheet; spriteSheet.loadFromFile("SpriteSheet.png"); int screenW = 488; int screenH = 512; int map_rows = 36; int map_cols = 28; sf::Sprite playerSprite; playerSprite.setTexture(spriteSheet); playerSprite.setTextureRect(sf::IntRect(470, 0, 16, 16)); playerSprite.setOrigin(sf::Vector2f(8, 8)); playerSprite.setPosition(14 * 8, 20 * 8); Player player(20, 14, playerSprite); sf::Sprite background; sf::Texture mazeBackground; background.setPosition(10, 12); for (int a = 0; a < map_rows; a++) { for (int b = 0; b < map_cols; b++) { levelMap[a][b].resetMap(a, b); if (levelMap[a][b].getType() == 'ball') { levelMap[a][b].setSprite(ball); } if (levelMap[a][b].getType() == 'power') { levelMap[a][b].setSprite(wall); } } } sf::Font font; sf::Clock clock; sf::Time elapsed1; int waveCount = 1; int dotCounter = 0; sf::Texture ghostTex; ghostTex.loadFromFile("Level1 (blue).png"); sf::Sprite blinkySpr; blinkySpr.setOrigin(8, 8); blinkySpr.setTexture(ghostTex); sf::IntRect blink (228, 64, 16, 16); blinkySpr.setTextureRect(blink); Ghosts blinky('follow', 'blinky', blinkySpr, 14, 14); blinkySpr.setPosition(14 * 8, 14 * 8); sf::Sprite inkySpr; inkySpr.setOrigin(8, 8); inkySpr.setTexture(ghostTex); inkySpr.setTextureRect(sf::IntRect(228, 96, 16, 16)); Ghosts inky('origin', 'inky', inkySpr, 14, 14); inkySpr.setPosition(11.5 * 8, 16.5* 8); sf::Sprite pinkySpr; pinkySpr.setOrigin(8, 8); pinkySpr.setTexture(ghostTex); pinkySpr.setTextureRect(sf::IntRect(228, 80, 16, 16)); Ghosts pinky('origin', 'pinky', pinkySpr, 14, 14); pinkySpr.setPosition(13.5 * 8, 17 * 8); sf::Sprite clydeSpr; clydeSpr.setOrigin(8, 8); clydeSpr.setTexture(ghostTex); clydeSpr.setTextureRect(sf::IntRect(228, 112, 16, 16)); Ghosts clyde('origin', 'clyde', clydeSpr, 14, 14); clydeSpr.setPosition(15.5 * 8, 16.5 * 8); sf::IntRect fright (356, 64, 16, 16); sf::Text scoreDisplay; scoreDisplay.setFont(font); scoreDisplay.setCharacterSize(11); scoreDisplay.setPosition(8, screenH - 16); scoreDisplay.setColor(sf::Color::White); int score = 0; scoreDisplay.setString("Score: "+ (std::to_string(score)) ); if (event.type == sf::Event::Closed) { window.close(); } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { levelEntity = levelMap[pRow - 1][pCol].getType(); player.setDirection('up'); player.move(); } if (levelEntity == 'u') { levelMap[pRow - 1][pCol].setType('power'); score += 2; scoreDisplay.setString("Score: " + (std::to_string(score))); blinky.frightenGhost(fright); blinkySpr.setTextureRect(fright); inky.frightenGhost(fright); inkySpr.setTextureRect(fright); pinky.frightenGhost(fright); pinkySpr.setTextureRect(fright); clyde.frightenGhost(fright); clydeSpr.setTextureRect(fright); } else if (levelEntity == 'ball') { levelMap[pRow - 1][pCol].setType('power'); score += 1; scoreDisplay.setString("Score: " + (std::to_string(score))); } }