Fehler in Spiele Programmierung Tutorial?
Hallo,
ich wollte mich mal in der Spieleprogrammierung versuchen, hab eig noch keine Ahnung davon, deswegen hab ich mir über Google ein Tutorial gesucht.
Java is meine beste Sprache, deswegen nicht in C++ oder so.
Ich weiß, dass Java für Spiele suboptimal ist, aber für den Einstieg wirds gehen.
Auf dieser Seite habe ich ein einfaches Tutorial gefunden, sogar in deutsch, dass an einem Beispiel in die Spieleprogrammierung einführt:
http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli ...
Das eigentliche Tutorial kann man hier runterladen:
http://www.ralf-bauer.org/java/tutorial/Tutorial.zip
Hab ich gemacht und angefangen den ganzen Code zu verstehen und abzuschreiben. Bin bis Seite 32 gekommen, hab den Code bis dahin wirklich nur abgeschrieben.
Das Programm funktioniert auch.
Es ist ein einfacher Frame, in dem man einen Hubschrauber mit den Pfeiltasten rumfliegen lassen kann.
Das Problem ist, dass der Hubschrauber stockt.
Ich verwende Eclipse und jede halbe Sekunde bringt Eclipse folgende Fehlermeldung:
Hier der Code, den ich bis jetzt habe:
Jedes Mal, wenn die Fehlermeldung kommt, friert das "Spiel" für den Bruchteil einer Sekunde ein.
Das ist sehr störend, kann mir jemand sagen, woran das liegt und wie ich das beheben kann?
Garrarufa
ich wollte mich mal in der Spieleprogrammierung versuchen, hab eig noch keine Ahnung davon, deswegen hab ich mir über Google ein Tutorial gesucht.
Java is meine beste Sprache, deswegen nicht in C++ oder so.
Ich weiß, dass Java für Spiele suboptimal ist, aber für den Einstieg wirds gehen.
Auf dieser Seite habe ich ein einfaches Tutorial gefunden, sogar in deutsch, dass an einem Beispiel in die Spieleprogrammierung einführt:
http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli ...
Das eigentliche Tutorial kann man hier runterladen:
http://www.ralf-bauer.org/java/tutorial/Tutorial.zip
Hab ich gemacht und angefangen den ganzen Code zu verstehen und abzuschreiben. Bin bis Seite 32 gekommen, hab den Code bis dahin wirklich nur abgeschrieben.
Das Programm funktioniert auch.
Es ist ein einfacher Frame, in dem man einen Hubschrauber mit den Pfeiltasten rumfliegen lassen kann.
Das Problem ist, dass der Hubschrauber stockt.
Ich verwende Eclipse und jede halbe Sekunde bringt Eclipse folgende Fehlermeldung:
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
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
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4
at GamePackage.Sprite.drawObjects(Sprite.java:46)
at GamePackage.GamePanel.paintComponent(GamePanel.java:105)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$700(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Hier der Code, den ich bis jetzt habe:
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
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
package GamePackage;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ListIterator;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable, KeyListener {
private static final long serialVersionUID = 1L;
JFrame frame;
long delta = 0;
long last = 0;
long fps = 0;
Sprite copter;
Vector<Sprite> actors;
Vector<Sprite> painter;
boolean up;
boolean down;
boolean left;
boolean right;
boolean started;
int speed = 1000;
public static void main(String args){
new GamePanel(800, 600);
}
public GamePanel (int w, int h){
this.setPreferredSize(new Dimension(w,h));
frame = new JFrame("GameDemo");
frame.setLocation(100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.addKeyListener(this);
frame.pack();
frame.setVisible(true);
doInitializations();
Thread th = new Thread(this);
th.start();
}
private void doInitializations(){
last = System.nanoTime();
BufferedImage heli = loadPics("pics/heli.gif", 4);
actors = new Vector<Sprite>();
painter = new Vector<Sprite>();
copter = new Sprite(heli, 400, 300, 100, this);
actors.add(copter);
started = true;
}
public void run(){
while (frame.isVisible()){
computeDelta();
checkKeys();
doLogic();
moveObjects();
cloneVectors();
repaint();
try{
Thread.sleep(10);
} catch (InterruptedException e) {}
}
}
private void cloneVectors() {
painter = (Vector<Sprite>) actors.clone();
}
private void computeDelta() {
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = ((long) 1e9)/delta;
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
g.drawString("FPS: " + Long.toString(fps), 20, 10);
if (!started)
return;
for (ListIterator<Sprite> it = painter.listIterator(); it.hasNext();){
Sprite r = it.next();
r.drawObjects(g);
}
}
private void moveObjects() {
for (ListIterator<Sprite> it = actors.listIterator(); it.hasNext();){
Sprite r = it.next();
r.move(delta);
}
}
private void doLogic(){
for (ListIterator<Sprite> it = actors.listIterator(); it.hasNext();){
Sprite r = it.next();
r.doLogic(delta);
}
}
private void checkKeys(){
if (up){
copter.setVerticalSpeed(-speed);
}
if (down){
copter.setVerticalSpeed(speed);
}
if (right){
copter.setHorizontalSpeed(speed);
}
if (left){
copter.setHorizontalSpeed(-speed);
}
if (!up && !down){
copter.setVerticalSpeed(0);
}
if (!left && !right){
copter.setHorizontalSpeed(0);
}
}
private BufferedImage loadPics (String path, int pics){
BufferedImage anim = new BufferedImage[pics];
BufferedImage source = null;
URL pic_url = getClass().getClassLoader().getResource(path);
try{
source = ImageIO.read(pic_url);
} catch (IOException e){}
for (int x = 0; x < pics; x++){
anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, source.getWidth()/pics, source.getHeight());
}
return anim;
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP){
up = true;
}
if (e.getKeyCode() == KeyEvent.VK_DOWN){
down = true;
}
if (e.getKeyCode() == KeyEvent.VK_LEFT){
left = true;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT){
right = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP){
up = false;
}
if (e.getKeyCode() == KeyEvent.VK_DOWN){
down = false;
}
if (e.getKeyCode() == KeyEvent.VK_LEFT){
left = false;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT){
right = false;
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
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
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
package GamePackage;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
public class Sprite extends Rectangle2D.Double implements Drawable, Movable {
private static final long serialVersionUID = 1L;
long delay;
long animation = 0;
GamePanel parent;
BufferedImage pics;
int currentpic = 0;
protected double dx;
protected double dy;
public Sprite (BufferedImage i, double x, double y, long delay, GamePanel p){
pics = i;
this.x = x;
this.y = y;
this.delay = delay;
this.width = pics.getWidth();
this.height = pics.getHeight();
parent = p;
}
@Override
public void doLogic(long delta) {
animation += (delta/1000000);
if (animation > delay){
animation = 0;
computeAnimation();
}
}
private void computeAnimation() {
currentpic++;
if (currentpic > pics.length){
currentpic = 0;
}
}
@Override
public void drawObjects(Graphics g) {
g.drawImage(pics[currentpic], (int) x, (int) y, null);
}
public double getHorizontalSpeed(){
return dx;
}
public void setHorizontalSpeed(double dx){
this.dx = dx;
}
public double getVerticalSpeed(){
return dy;
}
public void setVerticalSpeed(double dy){
this.dy = dy;
}
@Override
public void move(long delta){
if (dx != 0){
x += dx*(delta/1e9);
}
if(dy != 0){
y += dy*(delta/1e9);
}
}
}
Jedes Mal, wenn die Fehlermeldung kommt, friert das "Spiel" für den Bruchteil einer Sekunde ein.
Das ist sehr störend, kann mir jemand sagen, woran das liegt und wie ich das beheben kann?
Garrarufa
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 193889
Url: https://administrator.de/forum/fehler-in-spiele-programmierung-tutorial-193889.html
Ausgedruckt am: 07.04.2025 um 16:04 Uhr
5 Kommentare
Neuester Kommentar