2D-Grafik Mit Pause drawen

Diskutiere Mit Pause drawen im AWT, Swing, JavaFX & SWT Forum; Hallo, Ich habe bei meinem Frogger-Clon nun ein Thread implementiert, der nun die Autos spawnt und jedes Mal neu generiert, wenn diese das Bild...

  1. memuench
    memuench Neues Mitglied
    Hallo,
    Ich habe bei meinem Frogger-Clon nun ein Thread implementiert, der nun die Autos spawnt und jedes Mal neu generiert, wenn diese das Bild verlassen. So weit so gut. Um den Schwierigkeitsgrad nun zu erhöhen will ich es so machen, dass eine zufällige Anzahl an Autos reinfährt. Aber wie zeichne ich da den Abstand zwischen den Autos? Denn wenn ich einfach car[0].setLocation mache, aktualisiert sich ja die vollständige Location, auch vom ersten Auto.
     
  2. Vielleicht hilft dir dieser Kurs hier weiter.
  3. Harry Kane
    Harry Kane Bekanntes Mitglied
    Zuwenig Info für eine sinnvolle Analyse.
    Brauchst du eine Kollisionserkennung, die verhindert, dass zwei Autos dieselbe Position haben?
    Wenn car ein Array von Autos ist, ist es doch logisch, dass mit car[0].setLocation die Location vom ersten Auto geändert wird, und zwar nur vom ersten Auto und nicht "auch vom ersten Auto".
     
  4. memuench
    memuench Neues Mitglied
    Hi, sorry ich habe mich sehr ungenau ausgedrückt. Und zwar folgendes:
    - cars[0] bis cars[3] sind jeweils Farbvariationen und stellen jeweils eine Straße dar. Heißt cars[0] ist ein blaues Auto was auf der 1. Straße von oben spawnt. cars[1] spawnt auf der 2.Straße in roter Farbe etc. Ich will jetzt, dass je nachdem was ich bei Math.random() *3 +1 bekomme, 1 - 3 Autos hintereinander reinfahren.
    Bsp.: Ich habe ein Array randoms mit 4 Zufallszahlen. Das erste Element spiegelt die erste Straße mit blauen Autos wieder, wie oben erwähnt usw. Wenn nun randoms[0] 3 ist, sollen also auf der ersten Straße 3 blauen Autos einfahren.

    Code (Java):
    class FroggerGamePanel extends JPanel{
              Frogger help=gi.getCurr();
       
            public FroggerGamePanel() {
                cars = gi.getEnemies();
                setPreferredSize(new Dimension(600,400));
                setOpaque(true);
               
            }
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(io.ImageLoader.getActor("froggerstreet"),0,0,null);
                g.drawImage(io.ImageLoader.getActor("froggerstart"), 0, 300, null);  
                help.paint(g);
                int[] spawnNo = new int[4];
                for(int j=0;j<spawnNo.length;j++) { //Die Zufallszahlen generiert
                    spawnNo[j] = (int)(Math.random()*3)+1;
                }
                for(int i=0;i<cars.length;i++) { //Zeichnen der 4 Autos (eins pro Straße)
         
                            cars[i].paint(g);
                        }
                       

                       
                    }
                   
                }
            }
        }
    Das ist die interne Klasse, wo ich das Frogger Spielfeld zeichne. Und das der Bewegungsthread für die Autos und die autonome Bewegung:
    Code (Java):
        class CarMovementThread extends Thread{
            public void run() {
                while(true) {
               
                        for(int i=0;i<cars.length;i++) {
                            //Zeichnen
                           

                            if(i==0||i==2) {
                                cars[i].moveLeft();
                       
                                fgp.repaint();
                            }
                           
                            else {
                                cars[i].moveRight();
                                fgp.repaint();
                            }
                           
                            if(cars[0].getX()<0&&cars[2].getX()<0) {
                                //Wenn Autos an Ziel angekommen, zurücksetzen der Pos
                                int streetLength = game.GameSettings.getStreetHeight() / 5;
                                int help = 0;
                                for(int j=0;j<cars.length;j++) {
                                    if(j==0 || j==2 ) {
                                        cars[j].setLocation(game.GameSettings.getScreenWidth(), help);
                                        help += streetLength;
                                    }
                                   
                                    else {
                                        cars[j].setLocation(0, help);
                                        help += streetLength;
                                    }
                               
                                }
                               
                            }
                           
                               
                        }
                       
                        try {  //Pause
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
               
                   
                   
                }
               
               
       
               
            }
        }
    Und wie gesagt, ich möchte nun, dass nicht nur pro Straße ein Auto reinfährt, sondern je nach Zufallszahl auch mal 2. Wie mache ich das nun am geschicktesten?
     
  5. JCODA
    JCODA Bekanntes Mitglied
    Mache keine Logik innerhalb der paint-Methode.
    Die Logik sollte innerhalb des Threads stattfinden. (Bei einem Spiel ist es üblich die Logik jeden Frame laufen zu lassen, d.h. eine Pause von 30ms liefert eine FPS von etwa 1000/30 = 33)
    Zudem sollte das repaint nur einmal am Ende der Spielschleife auf dem Panel aufgerufen werden, falls du Swing mit passivem zeichnen benutzt.
    Man kann auf aktives Zeichnen wechseln, aber für den Anfang könnte das auch ein wenig verwirrend sein.
     
  6. memuench
    memuench Neues Mitglied
    Ok vielen Dank für die Tipps, ändere ich morgen ab. Hast du vielleicht eine Idee wie ich o.g. implementieren könnte?
     
  7. JCODA
    JCODA Bekanntes Mitglied
    Meist zählt man die vergangene Zeit mit. Damit kann man mit nur einer Variable einen "Timer" bauen. Da die Autos eine gewisse Zeit benötigen um vom Fleck zu kommen, kann man diesen Timer auf einen bestimmten wert legen. Die "wartenden" Autos kann man in einer Liste speichern. (Diese könnte man nur durch einen Integer abbilden etwa: auf welcher Straße diese auftauchen können.)
     
  8. memuench
    memuench Neues Mitglied
    Ok wie wäre es so:

    ArrayList<Car> waitingList = new ArrayList<Car>();
    Nun befüllen mit allen Autos, die noch fehlen. Also z.B. Straße 1 hat einen Wert 3 also müssen 2 wartende Autos rein. Wenn der von dir genannte Timer rum ist ( wie sehe denn hier ein Konstruktor aus? ) kommt die zweite Welle an Autos und im obigen Beispiel wäre nun noch 1 wartendes Auto drin. Versteh ich das richtig?
     
  9. JCODA
    JCODA Bekanntes Mitglied
    Etwa so:
    Code (Text):

    lastTime = getTime()
    spawnTimer = 3000 // alle 3 Sekunden erscheint ein Auto
    while true:
       delta = getTime()-lastTime // Berechne Zeit seit dem letzten Frame
       lastTime = getTime() //Speichere letzten Zeitpunkt
       if spawnTimer >0: //Falls der spawnTimer läuft
          spawnTimer-=delta // Verringere spawnTimer um die vergangene Zeit delta
          if spawnTimer<0: // Timer abgelaufen?
             spawnCar()     //Auto hinzufügen
             if isThereAnotherCar(): // gibt es weitere wartende Autos?
                 spawnTimer = 3000 // setze Timer auf gewünschten Wert
       panel.paint() // falls passives Zeichnen verwendet
       sleep(30) // pause für Logik
     
     
  10. memuench
    memuench Neues Mitglied
    Ok danke, ich les mich da mal ein! Könnte man jedoch theoretisch auch Wait() von einem Thread als "Timer" verwenden? Es erfüllt doch letztendlich den selben Zweck, oder?
     
  11. JCODA
    JCODA Bekanntes Mitglied
    solche "Timer" benötigt man meist sehr sehr oft. Und oft hat man nur einen Thread. Ich weiß nicht wie aufwendig bei dir alles wird. Ich hab' bisher immer versucht solche Dinge möglichst LightWeight zu halten.
     
  12. Wenn du Java lernen möchtest, empfehlen wir dir diesen Kurs hier
Passende Stellenanzeigen aus deiner Region:





Die Seite wird geladen...

Mit Pause drawen - Ähnliche Themen

Event bei gedrückter Maus immer wieder mit Pause ausführen
Event bei gedrückter Maus immer wieder mit Pause ausführen im Forum Java Basics - Anfänger-Themen
Pausen
Pausen im Forum Java Basics - Anfänger-Themen
Pause zwischen zwei Schleifen
Pause zwischen zwei Schleifen im Forum Java Basics - Anfänger-Themen
Nanosekunden-Pause innerhalb einen Thread-Loops
Nanosekunden-Pause innerhalb einen Thread-Loops im Forum Allgemeine Java-Themen
Sound stoppen und nach Pause wieder abspielen
Sound stoppen und nach Pause wieder abspielen im Forum Java Basics - Anfänger-Themen
Thema: Mit Pause drawen