2017-11-01 6 views
1

Ich mache ein Rennauto Spiel für meine Klasse und ich habe nur in Java für ein paar Wochen programmiert und so frage ich mich, wie ich meine Autos anders bewegen könnte Geschwindigkeiten mit einer Zufallszahl.Ein JPanel Bild mit einer zufälligen Nummer bewegen

package racing.game; 

import java.awt.Color; 
import java.util.Random; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class RacingGame { 

    public static void main(String[] args) { 
     int temp ; 
     int dist1 = 0; 
     int dist2 = 0; 
     int dist3 = 0; 
     int dist4 = 0; 
     int i = 0; 

     JFrame freRace = new JFrame(); 
     freRace.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     freRace.setSize(1900, 1080); 
     freRace.setLayout(null); 

     //Creating the vehicles 
     JLabel labelCar1 = new JLabel(); 
     labelCar1.setIcon(new ImageIcon("images/car1.jpg")); 
     labelCar1.setBounds((0), (50), labelCar1.getPreferredSize().width, labelCar1.getPreferredSize().height); 
     freRace.add(labelCar1); 

     JLabel labelCar2 = new JLabel(); 
     labelCar2.setIcon(new ImageIcon("images/car2.jpg")); 
     labelCar2.setBounds((0), (310), labelCar2.getPreferredSize().width, labelCar2.getPreferredSize().height); 
     freRace.add(labelCar2); 

     JLabel labelCar3 = new JLabel(); 
     labelCar3.setIcon(new ImageIcon("images/car3.jpg")); 
     labelCar3.setBounds((0), (580), labelCar3.getPreferredSize().width, labelCar3.getPreferredSize().height); 
     freRace.add(labelCar3); 

     JLabel labelCar4 = new JLabel(); 
     labelCar4.setIcon(new ImageIcon("images/car4.jpg")); 
     labelCar4.setBounds((0), (900), labelCar4.getPreferredSize().width, labelCar4.getPreferredSize().height); 
     freRace.add(labelCar4); 

     JLabel labelBackground = new JLabel(); 
     labelBackground.setIcon(new ImageIcon("images/race track.jpg")); 
     labelBackground.setBounds((0), (0), labelBackground.getPreferredSize().width, labelBackground.getPreferredSize().height); 
     freRace.add(labelBackground); 
     freRace.setBackground(Color.WHITE); 

     // freRace.setVisible(true); 
     while (dist1 <= 1890) { 

      Random rn = new Random(); 

      dist1 = dist1 + rn.nextInt(5); 
      dist2 = dist2 + rn.nextInt(4); 
      dist3 = dist3 + rn.nextInt(3); 
      dist4 = dist4 + rn.nextInt(2); 
      labelCar1.setBounds((dist1), (50), labelCar1.getPreferredSize().width, labelCar1.getPreferredSize().height); 
      labelCar2.setBounds((dist2), (310), labelCar2.getPreferredSize().width, labelCar2.getPreferredSize().height); 
      labelCar3.setBounds((dist3), (580), labelCar3.getPreferredSize().width, labelCar3.getPreferredSize().height); 
      labelCar4.setBounds((dist4), (900), labelCar4.getPreferredSize().width, labelCar4.getPreferredSize().height); 
      freRace.setVisible(true); 
     } 
    } 
} 

Der Code soll Rennwagen auf dem Bildschirm zufällig unterschiedlichen Geschwindigkeiten bekommen, aber ich weiß nicht, welche Schleife für diese zu wählen und wie ich, dass er Autos machen könnte beschleunigt i

erraten COMPLETLEY bewegen zufällig so
+0

Holen Sie 'freRace.setVisible (true);' aus Ihrer Weile, und verwenden Sie einen Thread für die Schleife, Ändern der Position zufällig ist keine Geschwindigkeit, um eine Geschwindigkeit zu implementieren, müssen Sie zuerst, wie 'x' zu beheben Versuchen Sie dann, den Rahmen jede Sekunde entsprechend zu aktualisieren. – TiMr

+0

JLabel ist keine gute Option, um Spiele mit Animationen zu erstellen. Benutzerdefinierte Bilder werden viel einfacher sein. – user3437460

Antwort

1

ich frage mich, wie ich

Sie benötigen einen speed Eigenschaft für jedes Auto speziell eine Zufallszahl meine Autos bewegen sich mit unterschiedlichen Geschwindigkeiten mit bekommen konnte. Anstatt eine Liste der Geschwindigkeitswerte für jedes Auto zu erstellen. Es wird leichter, wenn die Immobilie selbst innerhalb des Car-Objekt self-contained:

class Car{ 
    private double speed; 
} 

, um die Autos zu bewegen, können Sie eine Bewegung Methode hinzufügen:

class Car{ 
    private int x; 
    private int y; 
    //private JLabel image; //Better to use BufferedImage 
    private double speed; 

    //constructor not shown 
    public void moveForward(){ 
     x += speed; 
    } 

    public void moveBackward(){ 
     x -= speed; 
    } 
} 

Dann können Sie ein Array oder eine Liste der Autos:

ArrayList<Car> cars = new ArrayList<Car>(); 

die Fahrzeuggeschwindigkeit randomisieren, weist nur einen zufälligen Wert zum Auto:

Um alle Autos zu bewegen:

//Example 
for(Car c : cars) 
    c.moveForward(); 

Wenn es die Zeit ist auf Ihrer Seite, es tatsächlich lohnt, zu untersuchen, wie diese ohne JLabels verwenden zu implementieren, aber stattdessen implementieren es mit eigenen Zeichnungen.

0

Wenn Sie Schleife im Hauptverfahren, werden Sie nur das letzte Ergebnis der Bewegung sehen, können Sie etwas tun:

freRace.setVisible(true); 
new Thread(new Runnable() { 
    public void run() { 
     Random rn = new Random(); 
     int s1 = rn.nextInt(5); 
     int s2 = rn.nextInt(5); 
     int s3 = rn.nextInt(5); 
     int s4 = rn.nextInt(5); 
     while (dist1 <= 1890) { 
     dist1 = dist1 + s1; 
     dist2 = dist2 + s2; 
     dist3 = dist3 + s3; 
     dist4 = dist4 + s4; 
     labelCar1.setBounds((dist1), (50), labelCar1.getPreferredSize().width, labelCar1.getPreferredSize().height); 
     labelCar2.setBounds((dist2), (310), labelCar2.getPreferredSize().width, labelCar2.getPreferredSize().height); 
     labelCar3.setBounds((dist3), (580), labelCar3.getPreferredSize().width, labelCar3.getPreferredSize().height); 
     labelCar4.setBounds((dist4), (900), labelCar4.getPreferredSize().width, labelCar4.getPreferredSize().height); 
     freRace.invalidate(); 
     try { Thread.sleep(100); } catch (Exception e) {} 
     } 
    } 
}).start(); 

Bitte beachte, dass ich auch einen Timer hinzugefügt, so dass es immer wieder bewegen kann.

Auch ist es möglich zu lernen, wie dies in der Methode onPaintComponent eines JPanel tun, so dass Sie von Doppel-Pufferung profitieren können.

Verwandte Themen