/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package gamemenu1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
public class GameMenu1 extends JFrame {
private CardLayout cardLayout;
private JPanel mainPanel;
public GameMenu1() {
setTitle("Game Menu");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
cardLayout = new CardLayout();
mainPanel = new JPanel(cardLayout);
// Menu Panel
JPanel menuPanel = new JPanel();
menuPanel.setLayout(new GridLayout(4, 1, 10, 10));
JButton btnLevel1 = new JButton("Level 1");
JButton btnLevel2 = new JButton("Level 2");
JButton btnLevel3 = new JButton("Level 3");
JButton btnClose = new JButton("Close");
menuPanel.add(btnLevel1);
menuPanel.add(btnLevel2);
menuPanel.add(btnLevel3);
menuPanel.add(btnClose);
// Game Panel (Level 1)
GamePanel level1Panel = new GamePanel(this);
// Add panels to CardLayout
mainPanel.add(menuPanel, "Menu");
mainPanel.add(level1Panel, "Level1");
// Button actions
btnLevel1.addActionListener(e -> {
cardLayout.show(mainPanel, "Level1");
level1Panel.requestFocusInWindow();
});
btnLevel2.addActionListener(e -> JOptionPane.showMessageDialog(this, "Level 2 not implemented yet."));
btnLevel3.addActionListener(e -> JOptionPane.showMessageDialog(this, "Level 3 not implemented yet."));
btnClose.addActionListener(e -> System.exit(0));
add(mainPanel);
setVisible(true);
}
public void showMenu() {
cardLayout.show(mainPanel, "Menu");
}
// Game Panel Class
static class GamePanel extends JPanel implements ActionListener {
private int playerX = 100, playerY = 100;
private final int playerSize = 30;
private final int speed = 5;
private java.util.List<Rectangle> missiles = new ArrayList<>();
private Timer timer;
private GameMenu1 parent;
public GamePanel(GameMenu1 parent) {
this.parent = parent;
setBackground(Color.BLACK);
setFocusable(true);
// Key Bindings for movement
bindKey("W", () -> playerY -= speed);
bindKey("S", () -> playerY += speed);
bindKey("A", () -> playerX -= speed);
bindKey("D", () -> playerX += speed);
bindKey("SPACE", this::fireMissile);
bindKey("ESCAPE", () -> parent.showMenu());
timer = new Timer(16, this); // ~60 FPS
timer.start();
}
private void bindKey(String key, Runnable action) {
getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key), key);
getActionMap().put(key, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
action.run();
}
});
}
private void fireMissile() {
missiles.add(new Rectangle(playerX + playerSize / 2 - 2, playerY - 10, 4, 10));
}
@Override
public void actionPerformed(ActionEvent e) {
// Move missiles upward
Iterator<Rectangle> it = missiles.iterator();
while (it.hasNext()) {
Rectangle m = it.next();
m.y -= 10;
if (m.y < 0) it.remove();
}
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// Draw player (circle)
g.setColor(Color.YELLOW);
g.fillOval(playerX, playerY, playerSize, playerSize);
// Draw missiles
g.setColor(Color.RED);
for (Rectangle m : missiles) {
g.fillRect(m.x, m.y, m.width+2, m.height+2);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(GameMenu1::new);
}
}

Tidak ada komentar:
Posting Komentar