Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package de.sirrio.vermillionFighter;
- import java.util.ArrayList;
- import java.util.List;
- import de.sirrio.framework.AbstractGame;
- import de.sirrio.framework.Enemy;
- import de.sirrio.framework.KeyCode;
- import de.sirrio.framework.Player;
- import de.sirrio.framework.Projectile;
- import de.sirrio.framework.GameObject;
- import de.sirrio.framework.GraphicsTool;
- import de.sirrio.framework.TextObject;
- import de.sirrio.framework.Tile;
- import de.sirrio.framework.Vertex;
- import de.sirrio.framework.World;
- import de.sirrio.framework.sound.SoundManager;
- public class VermillionFighter<I> extends AbstractGame<I> {
- /*
- *
- * Simple statemanagement of the game which determine if the game is
- * in the menu, game is running or game is lost/won
- *
- */
- private enum STATE {
- MENU,
- GAME,
- WIN,
- LOST
- }
- static final int SCREENSIZEX = 800;
- static final int SCREENSIZEY = 600;
- static final int TILESIZEX = 32;
- static final int TILESIZEY = 32;
- static int WORLDSIZEX = 0;
- static int WORLDSIZEY = 0;
- static int enemiesLeft = 0;
- static final double MAXGRAVITY = 10;
- STATE state = STATE.MENU;
- List<Tile<I>> tiles = new ArrayList<>();
- List<Enemy<I>> enemies = new ArrayList<>();
- List<Projectile<I>> projectiles = new ArrayList<>();
- List<TextObject<I>> uiTexts = new ArrayList<>();
- TextObject<I> textPlayerHealth;
- TextObject<I> textEnemiesLeft;
- TextObject<I> textDebug;
- TextObject<I> newGame;
- TextObject<I> nextLevel;
- public VermillionFighter() {
- super(new Player<>("playerRight.png", new Vertex(0, 0), new Vertex(0, 0)), SCREENSIZEX, SCREENSIZEY);
- SoundManager.loopSound("background.wav");
- player.getPos().moveTo(new Vertex(30, 50));
- TextObject<I> gameTitle = new TextObject<>(new Vertex(90, 125), "vermillionFIGHTER", "ARIAL", 80, 227, 66, 52 );
- uiTexts.add(gameTitle);
- uiTexts.add(newGame = new TextObject<>(new Vertex(SCREENSIZEX/2, SCREENSIZEY/2), "newGAME", "ARIAL", 75, 227, 66, 52 ));
- getUIOss().add(uiTexts);
- }
- /*
- * this method loads a new level and resets the old variables of the logic
- */
- public void loadLevel(String levelName) {
- state = STATE.GAME;
- tiles.clear();
- enemies.clear();
- projectiles.clear();
- uiTexts.clear();
- getGOss().clear();
- getUIOss().clear();
- World<I> world = new World<>(levelName, TILESIZEX, TILESIZEY);
- WORLDSIZEX = world.getWorldsizeX();
- WORLDSIZEY = world.getWorldsizeY();
- getPlayer().getPos().moveTo(world.getSpawnPoint());
- enemies = world.getEnemies();
- tiles = world.getTiles();
- enemiesLeft = enemies.size();
- uiTexts.add(textPlayerHealth = new TextObject<>(new Vertex(5, 40), "Health: " + player.getHealth(), "ARIAL", 35, 227, 66, 52 ));
- uiTexts.add(textEnemiesLeft = new TextObject<>(new Vertex(5, 60), "Enemies left: " + enemiesLeft, "ARIAL", 15, 227, 66, 52));
- //uiTexts.add(textDebug = new TextObject<>(new Vertex(300,300), "DEBUGTEXT", "Arial", 100));
- getUIOss().add(uiTexts);
- getGOss().add(enemies);
- getGOss().add(tiles);
- getGOss().add(projectiles);
- }
- /*
- * camX and camY an the offsets are used to move the position all gameobjects from
- * the worldspace to the corresponding screenspace.
- * camera "follows" the middle of the player.
- */
- @Override
- public void render(GraphicsTool<I> g) {
- double maxOffsetX = WORLDSIZEX - SCREENSIZEX;
- double maxOffsetY = WORLDSIZEY - SCREENSIZEY;
- double minOffsetX = 0;
- double minOffsetY = 0;
- double camX = player.getPos().x + player.getWidth()/2 - SCREENSIZEX/2;
- double camY = player.getPos().y + player.getHeight()/2 - SCREENSIZEY/2;
- if (camX > maxOffsetX) camX = maxOffsetX;
- if (camX < minOffsetX) camX = minOffsetX;
- if (camY > maxOffsetY) camY = maxOffsetY;
- if (camY < minOffsetY) camY = minOffsetY;
- getPlayer().paintTo(g, camX, camY);
- for (List<? extends GameObject<I>> gos : getGOss())
- for (GameObject<I> go : gos) {
- go.paintTo(g, camX, camY);
- }
- for (List<? extends GameObject<I>> uos : getUIOss())
- for (GameObject<I> uo : uos) {
- uo.paintTo(g);
- }
- }
- /*
- * every collision and movement happens here
- */
- @Override
- public void tick() {
- if (!isStopped()) {
- // Apply gravity to player
- if (getPlayer().getMotion().y < MAXGRAVITY) getPlayer().getMotion().move(new Vertex(0, 0.2));
- // Projectile collision checks
- for (Projectile<I> pr : projectiles) {
- if (!pr.hasCollision()) continue;
- for (Enemy<I> en : enemies) {
- if (pr.touches(en) && en.hasCollision()) {
- en.getDamaged(pr.getDmg());
- if (en.getHealth() <= 0) {
- enemiesLeft--;
- textEnemiesLeft.text = "Enemies left: " + enemiesLeft;
- en.dispose();
- }
- pr.dispose();
- }
- }
- for (Tile<I> tile : tiles) {
- if (pr.touches(tile) && tile.hasCollision()) {
- pr.dispose();
- }
- }
- pr.move();
- }
- // Enemy collision checks
- for (Enemy<I> en : enemies) {
- if (!en.hasCollision()) continue;
- if (en.getMotion().y < MAXGRAVITY) en.getMotion().move(new Vertex(0, 0.2));
- en.calcMove(getPlayer());
- for (Tile<I> tile : tiles) {
- if (!tile.hasCollision()) continue;
- if (en.touchTop(tile) && en.getMotion().y > 0) {
- en.setMotion(new Vertex(en.getMotion().x, 0));
- // The next line fixes a issue when the enemy falls "too fast" and
- // gets stuck in the floor - its dirty and i don't like but its there and it kind of works
- en.getPos().moveTo(new Vertex(en.getPos().x, tile.getPos().y - en.getHeight()));
- }
- if (en.touchBottom(tile) && en.getMotion().y < 0)
- en.setMotion(new Vertex(en.getMotion().x, 0));
- if (en.touchRight(tile) && en.getMotion().x < 0)
- en.setMotion(new Vertex(0, en.getMotion().y));
- if (en.touchLeft(tile) && en.getMotion().x > 0)
- en.setMotion(new Vertex(0, en.getMotion().y));
- }
- en.move();
- if (getPlayer().touchLeft(en)) {
- getPlayer().getPos().move(new Vertex(-10, -1));
- getPlayer().getDamaged(en.getDmg());;
- textPlayerHealth.text = "Health: " + getPlayer().getHealth();
- }
- if (getPlayer().touchRight(en)) {
- getPlayer().getPos().move(new Vertex(10, -1));
- getPlayer().getDamaged(en.getDmg());;
- textPlayerHealth.text = "Health: " + getPlayer().getHealth();
- }
- if (getPlayer().touchTop(en)) {
- en.getDamaged(en.getHealth());
- en.dispose();
- enemiesLeft--;
- textEnemiesLeft.text = "Enemies left: " + enemiesLeft;
- }
- }
- // Tile collision checks
- for (Tile<I> tile : tiles) {
- if (!tile.hasCollision()) continue;
- if (getPlayer().touchTop(tile) && getPlayer().getMotion().y > 0) {
- getPlayer().setMotion(new Vertex(getPlayer().getMotion().x, 0));
- getPlayer().canJump = true;
- // The next line fixes a issue when the player falls "too fast" (like enemies) and
- // gets stuck in the floor - its dirty and i don't like but its there and it kind of works
- getPlayer().getPos().moveTo(new Vertex(getPlayer().getPos().x, tile.getPos().y - getPlayer().getHeight() + 3));
- }
- if (getPlayer().touchBottom(tile) && getPlayer().getMotion().y < 0)
- getPlayer().setMotion(new Vertex(getPlayer().getMotion().x, 0));
- if (getPlayer().touchRight(tile) && getPlayer().getMotion().x < 0)
- getPlayer().setMotion(new Vertex(0, getPlayer().getMotion().y));
- if (getPlayer().touchLeft(tile) && getPlayer().getMotion().x > 0)
- getPlayer().setMotion(new Vertex(0, getPlayer().getMotion().y));
- }
- // Move player at last
- getPlayer().move();
- }
- }
- /*
- * isStopped is extended to clacluate the win or lose conition (playerhealt < 0 or enemies < 0) and
- * hanndle all the gamestates to actually stop the game
- *
- */
- @Override
- public boolean isStopped() {
- if (state == STATE.MENU || state == STATE.WIN || state == STATE.LOST ) return true;
- if (getPlayer().getHealth() <= 0) {
- TextObject<I> lost = new TextObject<>(new Vertex(SCREENSIZEX/2, SCREENSIZEY/2), "YOU LOST", "ARIAL", 75, 227, 66, 52 );
- uiTexts.add(lost);
- uiTexts.add(newGame = new TextObject<>(new Vertex(SCREENSIZEX/2 + 100, SCREENSIZEY/2 + 85), "restartGame", "ARIAL", 50, 227, 66, 52 ));
- state = STATE.LOST;
- return true;
- }
- if (enemiesLeft <= 0) {
- TextObject<I> win = new TextObject<>(new Vertex(SCREENSIZEX/2, SCREENSIZEY/2), "YOU WIN", "ARIAL", 75, 227, 66, 52 );
- nextLevel = new TextObject<>(new Vertex(SCREENSIZEX/2 + 100, SCREENSIZEY/2 + 85), "nextLEVEL", "ARIAL", 50, 227, 66, 52 );
- uiTexts.add(win);
- uiTexts.add(nextLevel);
- state = STATE.WIN;
- }
- return false;
- }
- public void keyPressed(KeyCode keycode) {
- if (keycode != null && !isStopped()) {
- switch (keycode) {
- case RIGHT_ARROW:
- getPlayer().walkRight();
- break;
- case LEFT_ARROW:
- getPlayer().walkLeft();
- break;
- case UP_ARROW:
- getPlayer().jump();
- break;
- case VK_SPACE:
- Projectile<I> p = getPlayer().shot();
- if (p != null) projectiles.add(getPlayer().shot());
- }
- }
- }
- public void keyReleased(KeyCode keycode) {
- if (keycode != null && !isStopped()) {
- switch (keycode) {
- case RIGHT_ARROW:
- if (player.getMotion().x > 0)
- player.stopWalking();
- break;
- case LEFT_ARROW:
- if (player.getMotion().x < 0)
- player.stopWalking();;
- break;
- }
- }
- }
- public void mousePressed(int x, int y) {
- if (state == STATE.MENU ) {
- if (y > newGame.getPos().y - newGame.getHeight() && y < newGame.getPos().y && x > newGame.getPos().x) {
- getPlayer().resetHealth();
- loadLevel("map1.xml");
- }
- }
- if (state == STATE.WIN) {
- if (y > nextLevel.getPos().y - nextLevel.getHeight() && y < nextLevel.getPos().y && x > nextLevel.getPos().x) {
- loadLevel("map2.xml");
- }
- }
- if (state == STATE.LOST) {
- if (y > newGame.getPos().y - newGame.getHeight() && y < newGame.getPos().y && x > newGame.getPos().x) {
- getPlayer().resetHealth();
- loadLevel("map1.xml");
- }
- }
- }
- public void mouseMoved(int x, int y) {
- if (state == STATE.MENU) {
- if (y > newGame.getPos().y - newGame.getHeight() && y < newGame.getPos().y && x > newGame.getPos().x) {
- newGame.fontSize = 77;
- newGame.changeColor(150, 30, 20);
- } else {
- newGame.fontSize = 75;
- newGame.changeColor(227, 66, 52);
- }
- }
- if (state == STATE.WIN ) {
- if (y > nextLevel.getPos().y - nextLevel.getHeight() && y < nextLevel.getPos().y && x > nextLevel.getPos().x) {
- nextLevel.fontSize = 52;
- nextLevel.changeColor(150, 30, 20);
- } else {
- nextLevel.fontSize = 50;
- nextLevel.changeColor(227, 66, 52);
- }
- }
- if (state == STATE.LOST) {
- if (y > newGame.getPos().y - newGame.getHeight() && y < newGame.getPos().y && x > newGame.getPos().x) {
- newGame.fontSize = 51;
- newGame.changeColor(150, 30, 20);
- } else {
- newGame.fontSize = 50;
- newGame.changeColor(227, 66, 52);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement