Hallo liebes Forum,
nach nun mehreren Stunden ausprobieren bin ich immer noch ratlos...
ich bin ein Java Anfänger, der sich das erste Mal über ein 2D Spiel hergemacht hat..
also meckert nicht über den Quellcode, ich weiß er könnte besser sein.
Ich hab ein Programm indem man eben ein Art 'Raumschiff steuert und später mal Gegner abschießen kann.. Wenn man auf esc drückt wird eine Variable auf true gesetzt und dadurch wird ein pausemenü gezeichnet. Ich wollte keinen weiteren Frame, der einfach über dem Spiel Bildschirm steht, deshalb wollte ich ein 'durchsichtiges Menu. D.h. ich hab einfach überprüft, ob der Boolean auf true ist und dann ein String array mit den Auswahlmöglichkeiten "Go on!" "options" & "quit" gezeichnet.
1. Gibt es eine andere vermutlich viel bessere Möglichkeit, als ich es hier getan habe..? In den ganzen Shootern und sowas ist es dann meistens so, dass der PauseFrame leicht transparent ist.. wie könnte ich das machen?
2. Gehen wir davon aus es gibt keine andere / bessere Möglichkeit (siehe 1.), wie kann ich es dann schaffen, dass der GameFrame, also in dem man das Raumschiff bewegt etc. nicht mehr (solange das pause Menu offen ist) nicht mehr aktuallisiert wird?
Hier der Quellcode:
MAIN
Frame:
PAUSE MENU:
Ich hoffe ich hab es einigermaßen gut erklärt und ihr könnt mir helfen
nach nun mehreren Stunden ausprobieren bin ich immer noch ratlos...
ich bin ein Java Anfänger, der sich das erste Mal über ein 2D Spiel hergemacht hat..
also meckert nicht über den Quellcode, ich weiß er könnte besser sein.
Ich hab ein Programm indem man eben ein Art 'Raumschiff steuert und später mal Gegner abschießen kann.. Wenn man auf esc drückt wird eine Variable auf true gesetzt und dadurch wird ein pausemenü gezeichnet. Ich wollte keinen weiteren Frame, der einfach über dem Spiel Bildschirm steht, deshalb wollte ich ein 'durchsichtiges Menu. D.h. ich hab einfach überprüft, ob der Boolean auf true ist und dann ein String array mit den Auswahlmöglichkeiten "Go on!" "options" & "quit" gezeichnet.
1. Gibt es eine andere vermutlich viel bessere Möglichkeit, als ich es hier getan habe..? In den ganzen Shootern und sowas ist es dann meistens so, dass der PauseFrame leicht transparent ist.. wie könnte ich das machen?
2. Gehen wir davon aus es gibt keine andere / bessere Möglichkeit (siehe 1.), wie kann ich es dann schaffen, dass der GameFrame, also in dem man das Raumschiff bewegt etc. nicht mehr (solange das pause Menu offen ist) nicht mehr aktuallisiert wird?
Hier der Quellcode:
MAIN
Java:
package p_Game;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) {
Pause pause = new Pause();
List<Enemy> enemys = new LinkedList<Enemy>();
List<Bullet> bullets = new LinkedList<Bullet>(); //Eine Liste, die speichert, wenn ein Schuss getätigt wurde.
background bg = new background(150); //Speed, wie schnell sich der Background bewegt
Player p = new Player(200, 268, bullets); //Die Halbe Höhe(300) - die Hälfte der Grafik (32px)
Score score = new Score(enemys);
Frame f = new Frame(p, bg, score, bullets, enemys, pause);
enemys.add(new Enemy(300, 300));
enemys.add(new Enemy(400, 300));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 600);
f.setUndecorated(true);
f.setVisible(true);
f.setResizable(false);
f.setLocationRelativeTo(null);
// DisplayMode displayMode = new DisplayMode(800, 600, 16, 75);
// GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
// GraphicsDevice device = environment.getDefaultScreenDevice();
//
// device.setFullScreenWindow(f);
// device.setDisplayMode(displayMode);
f.makeStrat();
long lastFrame = System.currentTimeMillis();
while(true){
if(Keyboard.isKeyDown(KeyEvent.VK_ESCAPE)){
if(pause.getPause() == false){pause.isPause = true;}
else pause.isPause = false;}
long thisFrame = System.currentTimeMillis();
float timeSinceLastFrame = ((float)(thisFrame-lastFrame))/1000f;
lastFrame = thisFrame;
bg.update(timeSinceLastFrame);
p.update(timeSinceLastFrame);
f.repaintScreen();
for(int i = 0; i < bullets.size(); i++){
bullets.get(i).update(timeSinceLastFrame);
}
for(int i = 0; i < enemys.size(); i++){
enemys.get(i).update(timeSinceLastFrame);
}
try {
Thread.sleep(15);
} catch (InterruptedException e) {e.printStackTrace();}
}
}
}
Frame:
Java:
package p_Game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.util.List;
import javax.swing.JFrame;
import p_firstLook.MenuFonts;
public class Frame extends JFrame{
private static final long serialVersionUID = 1L;
// private Screen screen;
final Player player;
final background bg;
private Score score;
private List<Bullet> bullets;
private List<Enemy> enemys;
private Pause pause;
public static Color optionsColor;
public static final String[] options = {"Start", "Options", "Quit"};
public static int currentChoice = 0;
BufferStrategy strat = getBufferStrategy();
public Frame(Player player, background bg, Score score, List<Bullet> bullets, List<Enemy> enemys, Pause pause){
super(p_firstLook.Frame.TITLE + " v" + p_firstLook.Frame.VERSION);
this.player = player;
this.bg = bg;
this.score = score;
addKeyListener(new Keyboard());
this.bullets = bullets;
this.enemys = enemys;
this.pause = pause;
}
public void makeStrat(){
createBufferStrategy(2);
strat = getBufferStrategy();
}
public void repaintScreen(){
Graphics g = strat.getDrawGraphics();
draw(g);
pause.startPauseMenu(pause.isPause, g);
g.dispose();
strat.show();
}
private void draw(Graphics g){
g.drawImage(bg.getLook(), bg.getX(), 0, null);
g.drawImage(bg.getLook(), bg.getX()+bg.getLook().getWidth(), 0, null);
for(int i = 0; i< bullets.size(); i++){
Bullet b = bullets.get(i);
g.drawImage(Bullet.getLook(), b.getBounding().x, b.getBounding().y, null);
}
g.drawImage(player.getLook(), player.getBounding().x, player.getBounding().y, null);
for(int i = 0; i < enemys.size(); i++){
Enemy e = enemys.get(i);
g.drawImage(e.getLook(), e.getBounding().x, e.getBounding().y, null);
}
g.setColor(Color.PINK);
g.drawString(score.oneScoreMore(), 20, 20);
}
}
PAUSE MENU:
Java:
package p_Game;
import java.awt.Color;
import java.awt.Graphics;
import p_firstLook.MenuFonts;
public class Pause {
public boolean isPause = false;
public static Color pausedColor;
public static final String[] paused = {"Go On!", "Options", "Quit"};
public static int currentChoice = 0;
public Pause(){}
public boolean getPause(){
return isPause;
}
public void startPauseMenu(boolean isPause, Graphics g){
if(getPause() == true){
for(int i = 0; i < paused.length; i++){
MenuFonts.drawString(g, pausedColor, paused[i], 150 + i * 20);
if(i == currentChoice){pausedColor = Color.RED;}
if(i != currentChoice){pausedColor = Color.BLACK;}
while(getPause() == true){}
}
}
}
}
Ich hoffe ich hab es einigermaßen gut erklärt und ihr könnt mir helfen