Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Fehler in Spiele Programmierung Tutorial?

Mitglied: Garrarufa

Garrarufa (Level 1) - Jetzt verbinden

07.11.2012, aktualisiert 17:13 Uhr, 3474 Aufrufe, 5 Kommentare

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:

01.
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 
02.
	at GamePackage.Sprite.drawObjects(Sprite.java:46) 
03.
	at GamePackage.GamePanel.paintComponent(GamePanel.java:105) 
04.
	at javax.swing.JComponent.paint(Unknown Source) 
05.
	at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
06.
	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
07.
	at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
08.
	at javax.swing.RepaintManager.paint(Unknown Source) 
09.
	at javax.swing.JComponent._paintImmediately(Unknown Source) 
10.
	at javax.swing.JComponent.paintImmediately(Unknown Source) 
11.
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
12.
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
13.
	at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) 
14.
	at javax.swing.RepaintManager.access$700(Unknown Source) 
15.
	at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) 
16.
	at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
17.
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
18.
	at java.awt.EventQueue.access$200(Unknown Source) 
19.
	at java.awt.EventQueue$3.run(Unknown Source) 
20.
	at java.awt.EventQueue$3.run(Unknown Source) 
21.
	at java.security.AccessController.doPrivileged(Native Method) 
22.
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
23.
	at java.awt.EventQueue.dispatchEvent(Unknown Source) 
24.
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
25.
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
26.
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
27.
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
28.
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
29.
	at java.awt.EventDispatchThread.run(Unknown Source)
Hier der Code, den ich bis jetzt habe:

01.
package GamePackage; 
02.
 
03.
import java.awt.Color; 
04.
import java.awt.Dimension; 
05.
import java.awt.Graphics; 
06.
import java.awt.event.KeyEvent; 
07.
import java.awt.event.KeyListener; 
08.
import java.awt.image.BufferedImage; 
09.
import java.io.IOException; 
10.
import java.net.URL; 
11.
import java.util.ListIterator; 
12.
import java.util.Vector; 
13.
 
14.
import javax.imageio.ImageIO; 
15.
import javax.swing.JFrame; 
16.
import javax.swing.JPanel; 
17.
 
18.
public class GamePanel extends JPanel implements Runnable, KeyListener { 
19.
 
20.
	private static final long serialVersionUID = 1L; 
21.
	JFrame frame; 
22.
	 
23.
	long delta = 0; 
24.
	long last = 0; 
25.
	long fps = 0; 
26.
	 
27.
	Sprite copter; 
28.
	Vector<Sprite> actors; 
29.
	Vector<Sprite> painter; 
30.
	 
31.
	boolean up; 
32.
	boolean down; 
33.
	boolean left; 
34.
	boolean right; 
35.
	boolean started; 
36.
	int speed = 1000; 
37.
	 
38.
	public static void main(String[] args){ 
39.
		new GamePanel(800, 600); 
40.
41.
	 
42.
	public GamePanel (int w, int h){ 
43.
		this.setPreferredSize(new Dimension(w,h)); 
44.
		frame = new JFrame("GameDemo"); 
45.
		frame.setLocation(100, 100); 
46.
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
47.
		frame.add(this); 
48.
		frame.addKeyListener(this); 
49.
		frame.pack(); 
50.
		frame.setVisible(true); 
51.
		 
52.
		doInitializations(); 
53.
		 
54.
		Thread th = new Thread(this); 
55.
		th.start(); 
56.
57.
	 
58.
	private void doInitializations(){ 
59.
		last = System.nanoTime(); 
60.
		 
61.
		BufferedImage[] heli = loadPics("pics/heli.gif", 4); 
62.
		 
63.
		actors = new Vector<Sprite>(); 
64.
		painter = new Vector<Sprite>(); 
65.
		copter = new Sprite(heli, 400, 300, 100, this); 
66.
		actors.add(copter); 
67.
		 
68.
		started = true; 
69.
70.
 
71.
	public void run(){ 
72.
		while (frame.isVisible()){ 
73.
			computeDelta(); 
74.
			checkKeys(); 
75.
			doLogic(); 
76.
			moveObjects(); 
77.
			cloneVectors(); 
78.
			repaint(); 
79.
			try{ 
80.
				Thread.sleep(10); 
81.
			} catch (InterruptedException e) {} 
82.
83.
84.
 
85.
	private void cloneVectors() { 
86.
		painter = (Vector<Sprite>) actors.clone(); 
87.
88.
 
89.
	private void computeDelta() { 
90.
		delta = System.nanoTime() - last; 
91.
		last = System.nanoTime(); 
92.
		fps = ((long) 1e9)/delta; 
93.
94.
	 
95.
	@Override 
96.
	public void paintComponent(Graphics g){ 
97.
		super.paintComponent(g); 
98.
		g.setColor(Color.red); 
99.
		g.drawString("FPS: " + Long.toString(fps), 20, 10); 
100.
		 
101.
		if (!started) 
102.
			return; 
103.
		for (ListIterator<Sprite> it = painter.listIterator(); it.hasNext();){ 
104.
			Sprite r = it.next(); 
105.
			r.drawObjects(g); 
106.
107.
108.
	 
109.
	private void moveObjects() { 
110.
		for (ListIterator<Sprite> it = actors.listIterator(); it.hasNext();){ 
111.
			Sprite r = it.next(); 
112.
			r.move(delta); 
113.
114.
115.
	 
116.
	private void doLogic(){ 
117.
		for (ListIterator<Sprite> it = actors.listIterator(); it.hasNext();){ 
118.
			Sprite r = it.next(); 
119.
			r.doLogic(delta); 
120.
121.
122.
	 
123.
	private void checkKeys(){ 
124.
		if (up){ 
125.
			copter.setVerticalSpeed(-speed); 
126.
127.
		if (down){ 
128.
			copter.setVerticalSpeed(speed); 
129.
130.
		if (right){ 
131.
			copter.setHorizontalSpeed(speed); 
132.
133.
		if (left){ 
134.
			copter.setHorizontalSpeed(-speed); 
135.
136.
		if (!up && !down){ 
137.
			copter.setVerticalSpeed(0); 
138.
139.
		if (!left && !right){ 
140.
			copter.setHorizontalSpeed(0); 
141.
142.
143.
	 
144.
	private BufferedImage[] loadPics (String path, int pics){ 
145.
		BufferedImage[] anim = new BufferedImage[pics]; 
146.
		BufferedImage source = null; 
147.
		 
148.
		URL pic_url = getClass().getClassLoader().getResource(path); 
149.
		 
150.
		try{ 
151.
			source = ImageIO.read(pic_url); 
152.
		} catch (IOException e){} 
153.
		 
154.
		for (int x = 0; x < pics; x++){ 
155.
			anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, source.getWidth()/pics, source.getHeight()); 
156.
157.
		return anim; 
158.
159.
 
160.
	@Override 
161.
	public void keyPressed(KeyEvent e) { 
162.
		if (e.getKeyCode() == KeyEvent.VK_UP){ 
163.
			up = true; 
164.
165.
		if (e.getKeyCode() == KeyEvent.VK_DOWN){ 
166.
			down = true; 
167.
168.
		if (e.getKeyCode() == KeyEvent.VK_LEFT){ 
169.
			left = true; 
170.
171.
		if (e.getKeyCode() == KeyEvent.VK_RIGHT){ 
172.
			right = true; 
173.
174.
175.
 
176.
	@Override 
177.
	public void keyReleased(KeyEvent e) { 
178.
		if (e.getKeyCode() == KeyEvent.VK_UP){ 
179.
			up = false; 
180.
181.
		if (e.getKeyCode() == KeyEvent.VK_DOWN){ 
182.
			down = false; 
183.
184.
		if (e.getKeyCode() == KeyEvent.VK_LEFT){ 
185.
			left = false; 
186.
187.
		if (e.getKeyCode() == KeyEvent.VK_RIGHT){ 
188.
			right = false; 
189.
190.
191.
 
192.
	@Override 
193.
	public void keyTyped(KeyEvent arg0) { 
194.
		// TODO Auto-generated method stub 
195.
		 
196.
197.
}


01.
package GamePackage; 
02.
 
03.
import java.awt.Graphics; 
04.
import java.awt.geom.Rectangle2D; 
05.
import java.awt.image.BufferedImage; 
06.
 
07.
public class Sprite extends Rectangle2D.Double implements Drawable, Movable { 
08.
 
09.
	private static final long serialVersionUID = 1L; 
10.
	long delay; 
11.
	long animation = 0; 
12.
	GamePanel parent; 
13.
	BufferedImage[] pics; 
14.
	int currentpic = 0; 
15.
	protected double dx; 
16.
	protected double dy; 
17.
	 
18.
	public Sprite (BufferedImage[] i, double x, double y, long delay, GamePanel p){ 
19.
		pics = i; 
20.
		this.x = x; 
21.
		this.y = y; 
22.
		this.delay = delay; 
23.
		this.width = pics[0].getWidth(); 
24.
		this.height = pics[0].getHeight(); 
25.
		parent = p; 
26.
27.
	 
28.
	@Override 
29.
	public void doLogic(long delta) { 
30.
		animation += (delta/1000000); 
31.
		if (animation > delay){ 
32.
			animation = 0; 
33.
			computeAnimation(); 
34.
35.
36.
 
37.
	private void computeAnimation() { 
38.
		currentpic++; 
39.
		if (currentpic > pics.length){ 
40.
			currentpic = 0; 
41.
42.
43.
 
44.
	@Override 
45.
	public void drawObjects(Graphics g) { 
46.
		g.drawImage(pics[currentpic], (int) x, (int) y, null); 
47.
48.
	 
49.
	public double getHorizontalSpeed(){ 
50.
		return dx; 
51.
52.
	 
53.
	public void setHorizontalSpeed(double dx){ 
54.
		this.dx = dx; 
55.
56.
	 
57.
	public double getVerticalSpeed(){ 
58.
		return dy; 
59.
60.
	 
61.
	public void setVerticalSpeed(double dy){ 
62.
		this.dy = dy; 
63.
64.
	 
65.
	@Override 
66.
	public void move(long delta){ 
67.
		if (dx != 0){ 
68.
			x += dx*(delta/1e9); 
69.
70.
		if(dy != 0){ 
71.
			y += dy*(delta/1e9); 
72.
73.
74.
}
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
Mitglied: facebraker
07.11.2012 um 15:15 Uhr
Hallo

Bitte verwende Code-Tags und warum fragst du nicht in dem Forum wo du das Beispiel gefunden hast?

Gruß Alex
Bitte warten ..
Mitglied: catachan
07.11.2012 um 15:41 Uhr
Hi

Offensichtlich greifst du auf einen Index in einem array zu das es nicht gibt. Check das mal durch

LG
Bitte warten ..
Mitglied: Garrarufa
07.11.2012 um 17:18 Uhr
Sry, habs geändert.
Der Fehler wurde im Forum schon bemängelt, bis jetzt hat aber niemand eine Lösung dazu gepostet.
Deswegen hab ich parallel hier nochmal die Frage gestellt, weil ich der Meinung bin, dass der Code bis jetzt nicht so übermäßig kompliziert aussieht.
Dachte vllt sieht jemand den Fehler.
Bitte warten ..
Mitglied: dog
07.11.2012, aktualisiert um 22:12 Uhr
Sprite: 39
if (currentpic > pics.length){

Der Wraparound passiert wenn currentpic größer als die Länge von pics ist.
Ein Array in Java (und 90% der restlichen Programmiersprachen) ist aber 0-basiert, deshalb trifft diese Bedingung nur zu wenn du ohnehin schon Eins hinter dem Ende des Arrays bist...
Bitte warten ..
Mitglied: Garrarufa
07.11.2012, aktualisiert um 23:03 Uhr
Perfekt! Danke, jetzt gehts, das war der Fehler.
Es muss >= heißen. Logisch...
Bitte warten ..
Ähnliche Inhalte
HTML
HTML Programmierung
Frage von Alex29HTML5 Kommentare

Hallo zusammen, ich wollte mein Haus etwas smarter machen und habe daher nun einige Microcontroller laufen, die einige Steuerungsfunktionen ...

VB for Applications
VBA Programmierung
Frage von specialuserVB for Applications4 Kommentare

Hallo zusammen, der Wert aus Zelle L30 und N30 soll ins wb2 kopiert werden funktionier so weit auch ganz ...

Batch & Shell

Shellscript Programmierung gegen Bezahlung

gelöst Frage von lord-iconBatch & Shell

Hallo, es wird jm gesucht, der sich mit Bash-Befehlen auskennt. Es muß ein bash-script erstellt werden. Hintergrund: Von einen ...

Visual Studio

Anfängerfrage zu INI-Dateien bei der Programmierung

gelöst Frage von Freund.der.NachtVisual Studio6 Kommentare

Guten Tag an alle! Ich habe in VB.Net ein Programm geschrieben. Da dieses Programm auch Einstellungen speichern muss, legt ...

Neue Wissensbeiträge
Humor (lol)
IoT-Gefahr: Smartes Aquarium leckt!
Information von Lochkartenstanzer vor 2 StundenHumor (lol)3 Kommentare

Moin, Die IoT-Manie hat weitere Opfer gefunden. Ein Casino-Leck durch ein smartes Aquarium: Allerdings haben sie kein Wasser, sondern ...

Router & Routing

Olle Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 10 StundenRouter & Routing3 Kommentare

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 1 TagSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 1 TagWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
Server SSD: NVMe PCIe 3.0 RAID?
Frage von bouneeFestplatten, SSD, Raid15 Kommentare

Hallo liebe Admins, mir stellt sich gerade die Frage, ob ein neuer Server mit SSD NVMe PCIe 3.0 Sinn ...

Sicherheit
Verbindliche Zustellung per E-Mail?
Frage von ahussainSicherheit14 Kommentare

Hallo allerseits, ein Kunde von mir nutzt intensiv Fax. Hauptgrund: zusammen mit einer Empfangsbestätigung ist eine verbindliche Zustellung gewährleistet. ...

Sonstige Systeme
Wie Normenkataloge im Unternehmen bereit stellen?
Frage von MuzzepuckelSonstige Systeme14 Kommentare

Hallo Kollegen, ich lese schon lange hier mit, nun mein ersrer Beitrag, bzw. Frage. :-) Wir benötigen für unsere ...

LAN, WAN, Wireless
OpenVPN Client Fehlermeldungen
Frage von chris84LAN, WAN, Wireless14 Kommentare

Hallo Zusammen, wir nutzen seit kurzem einen neuen Router und den OpenVPN Client. Die VPN Verbindung klappt; allerdings kommen ...