Wie pausiere ich mein Java Game?

 - (Computer, Technik, Technologie)

2 Antworten

Wie sieht denn dein Core Game System aus? Ist das ganze Ereignisgesteuert oder benutzt du eine Engine? Da das ganze sehr basic aussieht würde ich vielleicht mal sagen, beim klicken auf „Resume“ rufst du die Funktionen mit zuvor gespeicherten Werten neu auf, und beim klicken aus „Pause“ lässt du die Abbruchbedingung für die Funktionen eintreffen und speicherst die Werte zwischen.

1

Das ganze ist Ereignisgesteuert. Wenn ich ingame Pause drücke wird die case STATE_MENU_PAUSE aufgerufen, nutze ich dann resume wird STATE_GAME_PLAY aufgerufen, also der STATE der bevor ich pause gedrückt habe aktiv war (also das ingame) die frage ist wie ich nun den Status von STATE_GAME_PLAY aufhebe, bis ich von pause üner resume wieder zurück in das spiel komme, hier mein Core Game:

package spaceinvader.game;


import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;


import javax.swing.JFrame;


import spaceinvader.game.manager.ElementManager;
import spaceinvader.game.manager.GameStateManager;
import spaceinvader.game.settings.GameSettings;
import spaceinvader.input.Keyboard;


public class Game extends JFrame implements KeyListener{
	private static final Cursor INVISIBLE_CURSOR =
			Toolkit.getDefaultToolkit().
				createCustomCursor(
						Toolkit.getDefaultToolkit().getImage(""), 
						new Point(0, 0), "invisible_curser");
	
	private Dimension screenSize;
	
	private BufferedImage image;
	private Graphics2D imageG2;
	
	private boolean running;
	
	private Keyboard keyboard;
	private GameSettings gameSettings;
	private GameStateManager gameStateManager;


	private ElementManager elementManager;
	
	public Game() {
		screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setLocation(0, 0);
		setSize(screenSize.width, screenSize.height);
		setUndecorated(true);
		setResizable(false);
		setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
		setIgnoreRepaint(true);
		setCursor(INVISIBLE_CURSOR);
		
		setVisible(true);
		
		addKeyListener(this);
	}
	
	public void init() {
		image =  new BufferedImage(screenSize.width, screenSize.height, BufferedImage.TYPE_INT_ARGB);
		imageG2 = image.createGraphics();
		
		keyboard = new Keyboard();
		keyboard.init();
		
		gameSettings = new GameSettings(screenSize);
		gameSettings.init();
		
		elementManager = new ElementManager(this);
		elementManager.init();
		
		gameStateManager = new GameStateManager(this);
		gameStateManager.init();
	}
	
	public void run() {
		long startTime = System.currentTimeMillis();
		long currentTime = startTime;
		long elapsedTime;
		long waitTime;
				
		running = true;
				
		while (running) {
			elapsedTime = currentTime - startTime;
			elapsedTime *= gameSettings.getTimeFactor();
			
			gameStateManager.update(elapsedTime);
			running = gameStateManager.processInput();
			keyboard.update();


			
			draw();
			drawToScreen();
			
			startTime = currentTime;
			currentTime = System.currentTimeMillis();
			
			waitTime = 1000 / gameSettings.getFramesPerSecond() - elapsedTime;
			
			gameStateManager.delay(waitTime);
		}
		
		dispose();
	}
	
	public void draw() {
		gameStateManager.draw();
	}
	
	public void drawToScreen() {
		Graphics2D g2 = (Graphics2D) getGraphics();
		g2.drawImage(image, 0, 0, screenSize.width, screenSize.height, null);
		g2.dispose();
	}
	
	@Override
	public void keyPressed(KeyEvent event) {
		keyboard.setKeyState(event.getKeyCode(), true);
	}
	
	@Override
	public void keyReleased(KeyEvent event) {
		keyboard.setKeyState(event.getKeyCode(), false);		
	}
	
	@Override
	public void keyTyped(KeyEvent arg0) {
		
	}
	
	public Graphics2D getGraphicsContex() {
		return imageG2;
	}
	
	public Keyboard getKeyboard() {
		return keyboard;
	}
	
	public GameSettings getGameSettings() {
		return gameSettings;
	}
	
	public GameStateManager getGameStateManager() {
		return gameStateManager;
		
	}


	public ElementManager getElementManager() {
		
		return elementManager;
	}


	public BufferedImage getBufferedImage() {
		return getBufferedImage();
	}
	
	
}

0
1
@TrollingDEAD

Hier mein GameStateManager

package spaceinvader.game.manager;


import java.awt.event.KeyEvent;
import java.util.HashMap;


import spaceinvader.game.Game;
import spaceinvader.game.gamestates.GameOver;
import spaceinvader.game.gamestates.GamePause;
import spaceinvader.game.gamestates.GamePlay;
import spaceinvader.game.gamestates.GameState;
import spaceinvader.game.gamestates.MenuMain;
import spaceinvader.game.gamestates.MenuOptions;
import spaceinvader.game.gamestates.MenuPlayerAppearance;
import spaceinvader.game.gamestates.MenuWindowedMode;


public class GameStateManager {
	public static final int STATE_MENU_MAIN = 0;
	public static final int STATE_MENU_OPTIONS = 1;
	public static final int STATE_GAME_PLAY = 2;
	public static final int STATE_GAME_PAUSE = 3;
	public static final int STATE_GAME_OVER = 4;
	public static final int STATE_MENU_PLAYERAPPEARANCE = 5;
	public static final int STATE_MENU_WINDOWEDMODE = 6;
	
	private Game game;
	
	private HashMap<Integer, GameState> gameStates;
	private GameState current;
	
	public GameStateManager(Game game) {
		this.game = game;
		
		gameStates = new HashMap<Integer, GameState>();
	}


	public void init() {
		gameStates.put(STATE_MENU_MAIN, new MenuMain(game));
		gameStates.put(STATE_GAME_PLAY, new GamePlay(game));
		gameStates.put(STATE_MENU_OPTIONS, new MenuOptions(game));
		gameStates.put(STATE_GAME_PAUSE,  new GamePause(game));
		gameStates.put(STATE_GAME_OVER, new GameOver(game));
		gameStates.put(STATE_MENU_PLAYERAPPEARANCE, new MenuPlayerAppearance(game));
		gameStates.put(STATE_MENU_WINDOWEDMODE, new MenuWindowedMode(game));
		
		
		setState(STATE_MENU_MAIN, true);				
	}
	
	public void update(long elapsedTime) {
		if (current != null)	current.update(elapsedTime);		
	}
	
	public void draw() {
		if (current != null)	current.draw();
	}
	
	public boolean processInput() {
		boolean result = true;
		
		if (current != null)
			result = current.processInput();
		
		return result;		
	}
	
	public void delay(long delayTime) {
		if (current != null) current.delay(delayTime);
	}
	
	public void setState(int gameState, boolean init) {
		if (gameState >= 0 && gameState < gameStates.size());
			GameState newState = gameStates.get(gameState);
			
			if (init) newState.init();
			current = newState;
	}
}


0
1
@TrollingDEAD

Bitte frag ruhig nach allem was du benötigt um mir weiter helfen zu können, vielen dank!

0
1
@TrollingDEAD
Und hier das GamePlay selber

package spaceinvader.game.gamestates;


import java.awt.Color;
import java.awt.event.KeyEvent;


import spaceinvader.game.Game;
import spaceinvader.game.elements.EnemyOne;
import spaceinvader.game.elements.Player;
import spaceinvader.game.manager.ElementManager;
import spaceinvader.game.manager.GameStateManager;


public class GamePlay extends GameState{
	private ElementManager elementManager;
	
	private EnemyOne enemyOne;
	
	public GamePlay(Game game) {
		super(game);
		
		elementManager = game.getElementManager();
	}
	
	public void init() {
		elementManager.init();
		elementManager.createPlayer();
		
		enemyOne = new EnemyOne(game);
		enemyOne.init();
		elementManager.addDestroyableEnemy(enemyOne);
		
	}
	
	public void draw() {
		g2.draw("BackgroundOne.jpg", 0, 0, game);
		g2.fillRect(0, 0, screenSize.width, screenSize.height);
		
		elementManager.draw();
	}
	
	
	public void update(long elapsedTime) {
		elementManager.update(elapsedTime);
	}
	
	public boolean processInput() {
		elementManager.processInput();
		
		if (keyboard.isPressed(keyboard.ESCAPE)) {
			gameStateManager.setState(GameStateManager.STATE_GAME_PAUSE, false);
		}
		
		return true;
	}
}


0

In Game.run befindet sich deine draw loop, die eigentlich nur etwas modifiziert werden muss:

while (running) {
  // do some time calculation and keyboard input handling

  if (gameStateManager.isPaused()) {
    continue;
  }

  draw();
  // etc. ...

Der GameStateManager bekommt seine neue Methode isPaused, die einfach nur Auskunft darüber gibt, ob sich der aktuelle Status im Pausezustand befindet oder nicht.

Da du die Schleife von nun an überspringst, wenn dieser Status zutrifft, wird die Zeichenfläche auch nicht neu gezeichnet. Alle Werte behalten ihren Wert - einzig wenn du noch irgendwo Timer laufen hast, solltest du diese noch explizit stoppen.

Achte an der Stelle auch darauf, dass die Methode, die das Menü zeichnet, trotzdem noch ausgeführt wird (bestenfalls dann vor continue).

Bezüglich deiner GameStateManager-Klasse (da ich sie eben noch überflogen habe) wäre im Übrigen mein Rat, statt Konstanten, ein Enum zu verwenden:

public enum GameState {
  MENU_MAIN,
  MENU_OPTIONS
  GAME_PLAY,
  GAME_PAUSE,
  GAME_OVER,
  MENU_PLAYERAPPEARANCE,
  MENU_WINDOWEDMODE
}

Dies fasst die jeweiligen Zustände besser zusammen, macht den Code lesbarer und typsicherer als umhergewürfelte Konstanten.

1

@regex9 Wow, vielen vielen Dank für diese Antwort. Seid ewigkeiten suche ich nach Hilfe die mir hilft und mich nicht, stattdessen ersteinmal darauf aufmerksam macht, das ich doch die im Forum übliche Formatierung nutzen soll (stackoverflow*hust*). Und siehe da, der Retter in der Not. Du beist mein Held des Monats. Danke dir, ernsthaft. Es ist leider mitlerweile so schwer geworden im internet solche Hilfe zu finden ohne erst AGBs und Forumssitten studieren zu müssen. Grüße, Maurice.

0
30
@TrollingDEAD

Es hat nicht damit zu tun, ob es eine Sitte ist, etwas zu formatieren. Es macht das Lesen des Codes sehr viel einfacher, für den, der dir helfen möchte. Ich glaube nicht, dass wenn dir jemand hilft, dass der Code auch so schlecht formatiert ist wie deiner in der Frage ;-)

Und wenn das hier doof ist, alles in einen Quelltext Block zu packen, benutzt https://www.hastebin.com und packe da deinen Code rein, drück STRG+S kopiere den link und hänge hinter den Punkt der URL ein Java statt dem, was da steht.

1

Java Primzahlen Programm

Hey Leute, ich habe mal wieder eine Java-Aufgabe, bei welcher ich den Fehler nicht finde. Ich hoffe ihr könnt mir irgendwie weiterhelfen.

public class PrimeNumbers {

static int x = 1000;
private static boolean[] Primes = new boolean[x];

// Hier ist der "statische Konstruktor"
static {
}

private static boolean checkPrime(int number) {

    return false;
}

public static boolean isPrime(int number) {
    int limit=1000;
    int zahl;      
    int zaehler;   
    boolean primzahl; 

    for (zahl = 2; zahl <= limit; zahl++) {
        primzahl = true;

        for (zaehler = 2; zaehler <= zahl/2; zaehler++) {
            if (zahl % zaehler == 0) {
                primzahl = false;
              break;
            }

        }

        if (primzahl) {
            return true;
        }
    }
    return false;
}

Die Primzahlen, welche zu überprüfen sind werden in einer anderen Methode übergeben und abefragt. Ich habe hier das Problem, dass er mir entweder immer true oder immer false returned, egal ob es nun eine Primzahl ist oder nicht. Ich komme einfach nicht weiter, egal wie ich es drehe und wende. Ich hoffe ihr könnt mir weiterhelfen.

Grüße Dubsepp

...zur Frage

Wie kann ich in Java überprüfen, ob alle Elemete eines Boolean-Arrays true sind?

...zur Frage

Etwas nur ausführen wenn sich ein boolean ändert (Java)?

Hallo, ich habe eine True Schleife in dieser ist eine Abfrage die abfragt ob ein boolean true oder false ist das Problem ist das sobald der boolean true ist der code der nach der Abfrage kommt hunderttausendmillionen mal ausgeführt wird und das will ich nicht ich will das dieser Code nur einmal ausgeführt wird. Wie kann ich das machen?

...zur Frage

Java - Primzahlen ermitteln

Soll zwischen 1 und 100 alle Primzahlen in Java ermitteln. Lasse ich das Programm laufen wird keine Zahl ausgegeben. Ich habe festgestellt, dass bei jeder Zahl primzahl == false ist. Zu beginn war der boolean primzahl true. Was habe ich falsch gemacht?

System.out.println ("Primzahlen:");

for (i=1 ;i<=100 ;i++ ) {
  if (i==1) {
    primzahl = false;
  } // end of if
    else {
    for (j=2 ;j<i ;j++ ) {
      if (i % j == 0) {
        primzahl = false;
      } // end of if
    } // end of for
  } // end of if-else
  if (primzahl == true) {
    System.out.println (i);
  } // end of if
} // end of for
...zur Frage

Java Supermarkt Kasse?

Ich würde gerne in einem Java Supermarkt der per Konsole gesteuert wird, eine Kasse einbauen, die je nachdem was man kaufen möchte, alle Preise zusammen rechnet und den Endpreis in einer Verabscheidung wie "Das macht dann bitte x €, vielen Dank für ihren Besuch und bis zum nächsten Mal." Ausserdem gibt es einen Bug mit dem ich momenntan etwas überfordert bin (hab grad erst angefange mit Java) der COde ist wie folgt :

import java.util.Scanner;

public class Supermarkt {

Scanner in = new Scanner (System.in);

boolean Wasser;
boolean Softdrinks;
boolean Milsch;
boolean Alkohol;
boolean Saft;
boolean Waschmittel;
boolean Rasierer;
boolean Zahnpflege;
boolean Shampoo;
boolean Klopapier;
boolean Fleisch;
boolean Käse;
boolean Brot;   

public void Begrüssung (){
    System.out.println("Hallo, wie kann ich ihnen helfen?");
    this.listeObergruppe();
}

public void listeObergruppe(){
    Scanner in = new Scanner (System.in);
    System.out.println("1 : Lebensmittel \n2 : Hygiene \n3 : Getränke \n4 : Dekoration \n5 : Kasse");

    int listeObergruppe;
    listeObergruppe = in.nextInt();
    switch (listeObergruppe){
        case 1:
        this.listeLebensmittel();

        case 2:
        this.listeHygiene();

        case 3:
        this.listeGetränke();

        //case 4:
        //this.listeDeko();
        
        //this.Kasse();
    }
    
}   



    public void listeLebensmittel() {
    System.out.println("1 : Fleisch \n2 : Käse \n3 : Brot");
    int listeLebensmittel;
    listeLebensmittel = in.nextInt();
    switch (listeLebensmittel){

        case 1 :
        Fleisch = true;
        case 2 :
        Käse = true;
        case 3 :
        Brot = true;
    }
}

public void listeHygiene(){
    System.out.println("1 : Waschmittel \n2 : Shampoo \n3 : Rasierer \n4 : Zahnpflege \n5 : Klopapier");
    int listeHygiene;
    listeHygiene = in.nextInt();
    switch(listeHygiene){
        case 1 :
        Waschmittel = true;
        case 2 :
        Shampoo = true;
        case 3 :
        Rasierer = true;
        case 4:
        Zahnpflege = true;
        case 5 :
        Klopapier = true;
    }

}

public void listeGetränke(){
    System.out.println("1 : Wasser \n2 : Softdrinks \n3 : Milsch \n4 : Alkohol \n5 : Saft");
    int listeGetränke;
    listeGetränke = in.nextInt();
    switch (listeGetränke){

        case 1 :
        Wasser = true;
        case 2 :
        Softdrinks=true;
        case 3 :
        Milsch = true;
        case 4:
        Alkohol = true;
        case 5 :
        Saft = true;
    }

}



//public void listeDeko(){



//public void Kasse() {
...zur Frage

Java , boolean gleich = 2.05-0.05 == 2.00; eigentlich sollte das TRUE ergeben, ergibt aber false, bei boolean gleich = 2.1-0.1 = 2.00; kommt True raus, warum?

Also genauer zu sagen :

ich bin dabei, Java zu erlernen und wollte da oben gennante Zeile ausprobieren, was aber "false" rausgibt.

Code lautet :

boolean gleich = (2.05-0.05) == 2.00; //habe auch mit 2 oder 2d probiert, geht nicht. System.out.print(gleich);

und das wars.

komischerweise gibt true, wenn ich schreb 2.1-0.1 == 2, was ist da der Fehler, verstehe nicht ?

MfG KingOff

...zur Frage

Was möchtest Du wissen?