ERLEDIGT
NEIN
NEIN
ANTWORTEN
1
1
ZUGRIFFE
478
478
EMPFEHLEN
-
17.06.11 20:11 #1
- Registriert seit
- Jun 2011
- Beiträge
- 1
Ersteinmal ein kleines Hallo, bin ja noch neu hier um euch direkt mit einem Problem zu belästigen.
Nachdem wir in der Schule vor mehreren Wochen mit der Programmiersprache Java, aber nur mit der "Stift und Maus" Bibliothek des MG-Werl, angefangen haben, dürfen wir uns unser letztes Projekt in diesem Schuljahr selber auszudenken und entwerfen. Da jedoch wie ich finde die SuM Bibliothek einem von Java nur wenig beibringt, will ich dieses mal ohne sie programmieren, weshalb ich schon mehrere Tutorials gelesen habe.
Jedenfalls habe ich angefangen ein 2d Rennspiel mit einer Vogelansicht von Oben zu programmieren, wobei sich im moment das Objekt der Klasse Auto bewegt und die Strecke/der Hintergrund (dieses ist bisjetzt nur ein Bild) nicht... nun möchte ich jedoch, das das Auto im Zentrum des Bildschirms ist und sich der Hintergrund bewegt, wozu ich jedoch keinen für mich verständlichen Ansatz finde.
Hier einmal mein bisheriger Code:
Meine Klasse zum ausführen des Programmes:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import javax.swing.JFrame; import java.awt.image.BufferStrategy; public class CarRPG extends JFrame { public CarRPG() { add(new Spielfeld()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(1280,800); setLocationRelativeTo(null); setTitle("CarRPG"); setResizable(true); setVisible(true); } public static void main(String[] args) { new CarRPG(); } }
Die Klasse Auto (die //Kommentierung ist nur für unseren Lehrer, da diese verlangt ist):
Code java: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
import java.awt.*; import java.awt.event.*; import java.awt.image.AffineTransformOp; import java.awt.geom.*; import javax.sound.sampled.*; import javax.sound.*; import java.applet.*; import java.io.*; import java.net.*; import javax.swing.*; public class Auto { private double dx;//deltax gibt die Veränderung der X Koordinate des Autos an private double dy;//deltay gibt die Veränderung der Y Koordinate des Autos an private double x;//Aktuelle X-Koordinate des Autos (wird im Hauptprogramm benötigt) private double y;//Aktuelle Y-Koordinate des Autos (wird im Hauptprogramm benötigt) private double winkel;//drehung des Autos private Image image;//Bild(Sprite) welches das Auto widerspigelt private String auto = "auto.gif";//dient als URL zum Bild des Autos private double v;//Geschwindigkeit private boolean drehelinks;//Abfrage ob nach links gelenkt werden soll private boolean dreherechts;//Abfrage ob nach rechts gelenkt werden soll private boolean beschleunigen;//Abfrage ob nach beschleunigt werden soll private boolean bremsen;//Abfrage ob gebremst werden soll private double vmax;//höchstgeschwindigkeit des Autos in pixel private double handling;//Lenkeinschlag des Autos in ° private double beschleunigung;//beschleunigung des Autos in pixel private double bremsbeschleunigung;//bremsbeschleunigung des Autos in pixel private double trägheit;//Faktor mit dem das Auto abbremst private double vmaxrückwärts;//höchstgeschwindigkeit beim rückwärtsfahren public Auto() { ImageIcon ii = new ImageIcon(this.getClass().getResource(auto));//das Bild wird geladen image = ii.getImage();// x = 500;//Startkoordinaten des Autos y = 500;// winkel = 0;//Anfangswinkel v = 0;//Anfangsgeschwindigkeit vmax = 5;//deklarieren der Variablen, welche das Fahrverhalten bestimmen vmaxrückwärts = -1;// handling = 3;// beschleunigung = 0.15;// bremsbeschleunigung = 0.2;// trägheit = 0.997;// } public void winkel()//veränderung der X und Y Koordinaten wird bestimmt { dx = Math.cos(Math.toRadians(winkel)) * v;//DeltaX = cos^-1(winkel)*geschwindigkeit(Hypothenuse) dy = Math.sin(Math.toRadians(winkel)) * v;//DeltaY = sin^-1(winkel)*geschwindigkeit(Hypothenuse) } public void bewegen()//das Auto wird bewegt { dx = Math.cos(Math.toRadians(winkel)) * v;//DeltaX = cos^-1(winkel)*geschwindigkeit(Hypothenuse) dy = Math.sin(Math.toRadians(winkel)) * v;//DeltaY = sin^-1(winkel)*geschwindigkeit(Hypothenuse) if (drehelinks == true) { if (dx != 0 || dy != 0) { if (winkel == 0) winkel = 360; if (v > 0) winkel = winkel - handling*(v/vmax); else winkel = winkel - handling*(v/vmax); } } if (dreherechts == true) { if (dx != 0 || dy != 0) { if (winkel == 360) winkel = 0; if (v > 0) winkel = winkel + handling*(v/vmax); else winkel = winkel + handling*(v/vmax); } } if (beschleunigen == true) { if (v < vmax) v += beschleunigung; } if (bremsen == true) { if (v > vmaxrückwärts) { if (v < vmaxrückwärts) v -= beschleunigung; else v -= bremsbeschleunigung; } } if (bremsen == false && beschleunigen == false) { v = v * trägheit; } x += dx; y += dy; } public int getX()//die X Koordinate wird abgerufen { return (int) StrictMath.round(x); } public int getY()//die Y-Koordinate wird abgerufen { return (int) StrictMath.round(y); } public Image getImage()//das Bild des Autos wird abgerufen { return image; } public void keyPressed(KeyEvent e)//ereignisse, welche beim drücken bestimmter Tasten hervorgerufen wird { int key = e.getKeyCode(); if (e.getKeyCode() == KeyEvent.VK_LEFT) { drehelinks = true; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { dreherechts = true; } if (e.getKeyCode() == KeyEvent.VK_UP) { beschleunigen = true; } if (e.getKeyCode() == KeyEvent.VK_DOWN) { bremsen = true; } } public void keyReleased(KeyEvent e)//ereignisse, welche beim loslassen bestimmter Tasten hervorgerufen wird { int key = e.getKeyCode(); if (e.getKeyCode() == KeyEvent.VK_LEFT) { drehelinks = false; } if (e.getKeyCode() == KeyEvent.VK_RIGHT) { dreherechts = false; } if (e.getKeyCode() == KeyEvent.VK_UP) { beschleunigen = false; } if (e.getKeyCode() == KeyEvent.VK_DOWN) { bremsen = false; } } public void zeichnen(Graphics g) { Graphics2D g2d = (Graphics2D)g; AffineTransform af = g2d.getTransform(); double centerx,centery; centerx = Math.cos(Math.toRadians(winkel))*10; centery = Math.sin(Math.toRadians(winkel))*43; g2d.rotate(Math.toRadians(winkel+90),x,y); g2d.drawImage(this.getImage(), this.getX(), this.getY(),null ); g2d.setTransform(af); } }
Und mein Spielfeld:
Code java: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
import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; import javax.swing.*; public class Spielfeld extends JPanel implements ActionListener { private Timer timer; private Auto auto; public static int wartezeit = 1000/60; Image hintergrund; public Spielfeld() { ImageIcon ii = new ImageIcon(this.getClass().getResource("hintergrund.gif")); hintergrund = ii.getImage(); addKeyListener(new TAdapter()); setFocusable(true); setDoubleBuffered(true); auto = new Auto(); timer = new Timer(wartezeit, this); timer.start(); } public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D) g; g2d.drawImage(hintergrund, 10, 10, null); auto.zeichnen(g); Toolkit.getDefaultToolkit().sync(); g.dispose(); } public void actionPerformed(ActionEvent e) { auto.bewegen(); repaint(); timer.setRepeats(true); timer.start(); } private class TAdapter extends KeyAdapter { public void keyReleased(KeyEvent e) { auto.keyReleased(e); } public void keyPressed(KeyEvent e) { auto.keyPressed(e); } } }
Desweiteren ist noch anzumerken das der Hintergrund enorm flackert, wobei ich auch hier nicht die Gründe dafür kenne, unseren Lehrer kann ich leider nicht fragen da er bei Problemen nur auf Fehlermeldungen hinweist (wobei ja eigentlich garkeine entsteht).
Nunja, wenn jemand die Zeit findet mir zu helfen kann ich erstmal nur Danke sagen, bis später.Geändert von Kloser1911 (18.06.11 um 08:37 Uhr)
-
17.06.11 23:31 #2
- Registriert seit
- Jun 2009
- Beiträge
- 870
Hallo
erst mal allgemein: den Code bitte in java-Tags, dann kann man ihn besser lesen (siehe meine Signatur).
Zu den Kommentaren: Das ist doch gut, dass du so viel kommentierst! Bei größeren Softwareprojekten gilt die Faustregel, dass der Code nur dann gut zu warten und wiederverwenden ist, wenn mehr (aussagekräftige) Kommentare als Code vorhanden sind.
Eine Anregung:
Prinzipiell ist es üblich, dass du statische Objekte durch Zeichnen in die höhere Ebene realisierst. In deinem Fall könnte man also nur den Hintergrund bewegt, das Auto aber gar nicht. Der Hintergrund wird dann einfach umgekehrt zur Bewegungsrichtung gedreht, d.h.:
statt das Auto nach links zu drehen, wird der Hintergrund nach rechts gedreht.
statt das Auto nach vorne(oben) zu bewegen, wird der Hintergrund nach hinten(unten) bewegt.
In deinem Code habe ich einen Fehler gefunden: Bei graphischen Komponenten des Pakets javax.swing (z.B. JPanel, JComponent, JButton, JFrame, ...) sollte man nicht die paint()-Methode überschreiben (wie du es getan hast), sondern stattdessen die paintComponent()-Methode. Dies kann die Ursache für das von dir beobachtete Flackern sein. Außerdem sollte man zu Beginn dieser Methode dann auch super.paintComponent() aufrufen oder wenigstens die komplette Fläche übermalen, wie du es in der paint()-Methode schon gemacht hast.
EDIT: du solltest nicht die Methode dispose() vor Graphics aufrufen. Das steht auch so in der JavaDoc: http://download.oracle.com/javase/6/....html#dispose()Geändert von genodeftest (17.06.11 um 23:35 Uhr)
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
Ähnliche Themen
-
Rennspiel - Die perfekte Steuerung?
Von tobee im Forum SmalltalkAntworten: 3Letzter Beitrag: 29.10.09, 09:19 -
Rennspiel - Schnellere Zeiten möglich?
Von String im Forum Flash PlattformAntworten: 7Letzter Beitrag: 15.07.09, 15:58 -
Form auf Bildschirm zentrieren
Von deusfalsus im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 09.06.08, 14:38 -
Rennspiel Hilfe
Von 1000 im Forum Flash PlattformAntworten: 4Letzter Beitrag: 01.01.08, 20:45 -
Tabelle auf dem Bildschirm entprechend zentrieren
Von dsolianyi im Forum HTML & XHTMLAntworten: 27Letzter Beitrag: 03.07.04, 17:20





Zitieren
Login





