You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

lehu

User / Kunde

  • "lehu" started this thread

Posts: 110

  • Send private message

1

Monday, July 17th 2017, 9:15pm

2 JFrames mit einem JButton

Hallo,

ich programmiere derzeit ein PacMan spiel in Java als Schulprojekt, jedoch habe ich beim erstellen des StartScreens Probleme :
Das Spiel funktioniert einwandfrei, aber wenn ich jetz das Spiel über einen StartScreen starten will (mit JButton) öffnet sich zwar das Spiel und die Monster bewegen sich, doch der Spieler reagiert nicht und die Applikation lässt sich nicht schließen. Wenn ich die start() Methode rauslasse, lässt sich der Screen schließen...

Meine Hauptklasse :

Spoiler Spoiler

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
ackage de.leo.pacman;

import de.leo.pacman.elements.Map;
import de.leo.pacman.entity.Direction;
import de.leo.pacman.entity.player.PacMan;
import de.leo.pacman.listener.ButtonListener;
import de.leo.pacman.listener.DirectionListener;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;

/**
 * Created by Leo on 04.07.2017.
 */
public class GameManager extends Canvas {

    private JFrame frame;
    private JFrame startFrame;
    private JFrame endFrame;
    private JButton startButton;

    private String title;
    private int width;
    private int height;
    private int level;
    private Dimension dimension;

    private PacMan pacMan;
    private Map map;

    private Thread thread;
    private boolean isRunning;
    private DirectionListener listener;

    public GameManager() {
        this.title = "PacMan";
        this.level = 1;
        this.pacMan = new PacMan(this, 0, 0, 4, Direction.NO);
        this.map = new Map(this);

        this.width = map.getWidth()*32;
        this.height = map.getHeight()*32;
        this.isRunning = false;
    }


    private void renderGraphics() {
        if(getBufferStrategy() != null) {
            BufferStrategy strategy = getBufferStrategy();

            Graphics graphic = strategy.getDrawGraphics();

            graphic.setColor(Color.DARK_GRAY);
            graphic.fillRect(0, 0, width, height);

            pacMan.render(graphic);
            map.render(graphic);

            graphic.dispose();
            strategy.show();
        } else {
            createBufferStrategy(3);
        }
    }

    private void move() {
        pacMan.move();
        map.moveMonsters();
    }

    public void start() {
        if(!isRunning) {
            this.isRunning = true;
            this.thread = new Thread(new Runnable() {

                @Override
                public void run() {

                    while (isRunning) {
                        try {
                            Thread.sleep(35);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        renderGraphics();
                        move();
                    }
                    Thread.currentThread().stop();
                }

            });
            this.thread.run();
        }
    }

    public void stop() {
        if(isRunning) {
            this.isRunning = false;
            try {
                this.thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void loadEndScreen() {

    }

    public void loadStartSceen() {
        Dimension dimension = new Dimension(600, 400);
        this.startFrame = new JFrame("PacManStart");
        startFrame.setPreferredSize(dimension);
        startFrame.setMaximumSize(dimension);
        startFrame.setMinimumSize(dimension);
        startFrame.setSize(dimension);

        startFrame.setResizable(false);
        startFrame.pack();

        startFrame.setBackground(Color.DARK_GRAY);
        startFrame.setVisible(true);
        startFrame.setLocationRelativeTo(null);
        startFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JButton startButton = new JButton();
        startButton.setText("Neues Spiel");
        startButton.setBackground(Color.lightGray);

        startFrame.add(startButton, BorderLayout.CENTER);

        startButton.addActionListener(e -> {
            startFrame.dispose();
            loadGameScreen();
            start();
        });
    }

    public void loadGameScreen() {
        this.dimension = new Dimension(width, height);
        this.setPreferredSize(dimension);
        this.setMinimumSize(dimension);
        this.setMaximumSize(dimension);

        this.frame = new JFrame(this.getTitle());
        frame.add(this);
        frame.setResizable(false);
        frame.pack();

        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.listener = new DirectionListener(this);
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public void setPacMan(PacMan man) {
        this.pacMan = man;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public JButton getStartButton() {
        return startButton;
    }

    public JFrame getEndFrame() {
        return endFrame;
    }

    public JFrame getStartFrame() {
        return startFrame;
    }

    public JFrame getFrame() {
        return frame;
    }

    public String getTitle() {
        return title;
    }

    public PacMan getPacMan() {
        return pacMan;
    }

    public int getLevel() {
        return level;
    }

    public Map getMap() {
        return map;
    }

    public static void main(String[] args) {
        GameManager game = new GameManager();
        game.loadStartSceen();
    }

}


Vielen Dank für jede Hilfe

EuroCent

User / Kunde

  • "EuroCent" is male

Posts: 376

Location: Thüringen

Occupation: Vodafone Mitarbeiter

  • Send private message

2

Tuesday, July 18th 2017, 1:24pm

Hast Du mal den Debugger verwendet, bzw. an bestimmten Punkten Debug-Message ausgeben lassen?

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

3

Tuesday, July 18th 2017, 2:55pm

Ich hab selber noch nichts mit Threads gemacht, deshalb hab ich da nur theoretisches Wissen und weiss nix über die API. Aber ist das gewollt, dass du in der Startmethode "Thread" statisch ansprichst, statt des Threads, der erstellt wurde?
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

lehu

User / Kunde

  • "lehu" started this thread

Posts: 110

  • Send private message

4

Tuesday, July 18th 2017, 9:58pm

Ich habe das Problem mitlerweile gelöst: Da die Methode start nicht beendet wird, bis die Methode stop aufgerufen wird, kann die Methode actionPerformed des ActionListeners nicht abgeschlossen werden. Dies führt dazu, dass der Focus auf dem ersten Frame liegt, wodurch der KeyListener nicht reagiert.
Eine Frage jedoch noch zu JFrames: Ich bekomme das Verschieben von JButtons und JLabels irgendwie nicht hin. Die bleiben immer an der selben stelle im Frame :|

@Stuppsman
Ja das ist gewollt, da das immer den aktuellen Thread betrifft

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

5

Wednesday, July 19th 2017, 2:44am

Ja das ist gewollt, da das immer den aktuellen Thread betrifft


Danke, ich werd mich wohl mal einlesen müssen ^^

Eine Frage jedoch noch zu JFrames: Ich bekomme das Verschieben von JButtons und JLabels irgendwie nicht hin. Die bleiben immer an der selben stelle im Frame


Wenn mich nicht alles täuscht, musst du dem Frame auch noch ein Layout setzen, damit das funktioniert. (BorderLayout / GridBagLayout würd ich empfehlen).
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

This post has been edited 1 times, last edit by "Stuppsman" (Jul 19th 2017, 2:49am)


lehu

User / Kunde

  • "lehu" started this thread

Posts: 110

  • Send private message

6

Wednesday, July 19th 2017, 6:16pm

Danke :)

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net