2D-Grafik Feld automatisch bewegen, in zeitabständen

KilledByCheese

Mitglied
ich habe ein kleines Fenster mit einem Gridlayout, darin ist ein Feld rot und die anderen grau, das rote Feld kann man mit wasd bewegen wenn man über den rand hinausgeht kommt Gameover in der Konsole(später soll dann auch die Eingabe blockiert werden)

wie kann ich es machen, dass sich das rote Feld von alleine in die Richtung(direction) bewegt? und dass in bestimmten Zeitabständen.

hier mein bisheriger Code:
Java:
public class testGrid extends JFrame implements KeyListener
{

    private JPanel contentPane;
   
    private int hight = 10;
    private int width = 10;
   
    private JLabel[][] map = new JLabel[hight][width];
   
    private int aktH = 0;
    private int aktW = 0;
   
    private String direction = "down";
   
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    testGrid frame = new testGrid();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
   
    public testGrid()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 300, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(hight,width));
       
        createGrid();
        addKeyListener(this);
    }
   
    public void createGrid()
    {
        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map[i].length; j++)
            {
                Border border = BorderFactory.createLineBorder(Color.BLUE, 1);
               
                map[i][j] = new JLabel();
               
                map[i][j].setBorder(border);
                map[i][j].setBackground(Color.GRAY);
                map[i][j].setOpaque(true);
               
                contentPane.add(map[i][j]);
            }
        }
        map[0][0].setBackground(Color.RED);
    }

    @Override
    public void keyTyped(KeyEvent e)
    {
       
    }

    @Override
    public void keyPressed(KeyEvent e)
    {
        char input = e.getKeyChar();
       
        switch(input)
        {
            case 'w' : direction="up";     Move();
            break;
           
            case 's' : direction="down"; Move();
            break;
           
            case 'a' : direction="left"; Move();
            break;
           
            case 'd' : direction="right"; Move();
            break;
           
            default : System.out.println("False Eingabe"); ;
        }
    }

    @Override
    public void keyReleased(KeyEvent e)
    {
       
    }

   
    public void goDown()
    {
        if(aktH != 9)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktH += 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktH == 9)
        {
            System.out.println("GAME OVER");
        }
    }
    public void goUp()
    {
        if(aktH != 0)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktH -= 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktH == 0)
        {
            System.out.println("GAME OVER");;
        }
    }
    public void goLeft()
    {
        if(aktW != 0)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktW -= 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktW == 0)
        {
            System.out.println("GAME OVER");
        }
    }
    public void goRight()
    {
        if(aktW != 9)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktW += 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktW == 9)
        {
            System.out.println("GAME OVER");
        }
    }
   
    public void Move()
    {
        if(direction.equalsIgnoreCase("down"))
        {
            goDown();
        }else
            if(direction.equalsIgnoreCase("up"))
            {
                goUp();
            }else
                if(direction.equalsIgnoreCase("right"))
                {
                    goRight();
                }else
                    if(direction.equalsIgnoreCase("left"))
                    {
                        goLeft();
                    }
    }
}

kann mir jemand hier im Bezug auf mein Problem Timer oder Thread.sleep erklären hab bisher für mich nur unverständliches im I-Net gefunden
 

KilledByCheese

Mitglied
Und was genau hast du gefunden? Es bringt dir und uns gar nichts, wenn wir es dir so erklären wie im inet.
ich hab eigentlich immer nur unkommentierten Code gefunden und nirgendswo ne genauere Beschreibung, wie der Timer funktioniert
Thread.sleep im try/catch hilft mir nachdem ich rumprobiert habe auch nicht weiter, da dann das ganze Programm wartet bzw. so wie ich es gemacht habe ist dann erst sag ich mal 10 mal die schleife durchlaufen worden dann kam game over und erst dann wurde der Frame angezeigt

ich möchte es ja irgendwie so schaffen, dass beim erzeugen des Frames eine Methode timer aufgerufen wird, die move() ausführt
 

KilledByCheese

Mitglied
Genau die Seite habe ich vorhin auch gefunden mithilfe eines Freundes bin ich auch zu einer Lösung gekommen, ich hab erstmal nen boolean gemacht, der sagt ob es weiter gehen soll oder nicht, wenn gameover kommt dann wird dieser wert auf false gesetzt.

ich hab dann ne methode timerx() gemacht, die ich aufrufe nachdem ich mein Grid erstellt habe:

allerdings habe ich timer.schduleAtFixedRate(TimerTask(){}, begin,intervall) genommen

und darin ne if abfrage, wenn der boolean auf false, dann tiemr.cancel(); code poste ich morgen wenn ich es nicht vergesse :p
 

KilledByCheese

Mitglied
Hier der komplette Code:
Java:
public class testGrid extends JFrame implements KeyListener
{
    private JPanel contentPane;
   
    private int hight = 10;                            //Höhe und breite des Spielfeldes
    private int width = 10;
   
    private Timer timer = new Timer();               //für den Timer
    private int begin = 5000;
    private int timeinterval = 350;
    private int zaehler = 0;
   
    private JLabel[][] map = new JLabel[hight][width]; //2D-Array um einzeln auf die labels zuzugreifen
   
    private int aktH = 0;                            //das aktuelle feld - das rote
    private int aktW = 0;
   
    private boolean weiter = true;                    //abfrage ob gameover oder nicht
    private boolean pause = false;                    // mit p kann man pausieren
   
    private String direction = "down";                //die aktuelle richtung
   
    public static void main(String[] args)             //aufruf des programms
    {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    testGrid frame = new testGrid();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
   
    public testGrid()                                 //erstellung des Gitters / grids
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 300, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(hight,width));
       
        createGrid();                                // hier wird eigentlich das gitter erstellt
        addKeyListener(this);                        //damit wasd & p auch was machen
       
    }
   
    public void createGrid()                        //hintergrundfarben / blaue ränder und ein rotes feld erzeugen
    {
        for (int i = 0; i < map.length; i++)
        {
            for (int j = 0; j < map[i].length; j++)
            {
                Border border = BorderFactory.createLineBorder(Color.BLUE, 1);
               
                map[i][j] = new JLabel();
               
                map[i][j].setBorder(border);
                map[i][j].setBackground(Color.GRAY);
                map[i][j].setOpaque(true);
               
                contentPane.add(map[i][j]);
            }
        }
        map[0][0].setBackground(Color.RED);
       
        timerx();                                    // aufruf des timers - damit sich das rote feld alleine bewegt
    }

    @Override
    public void keyTyped(KeyEvent e)
    {
       
    }

    @Override
    public void keyPressed(KeyEvent e)                 //input für die jeweiligen tasten erkennen
    {
        char input = e.getKeyChar();
       
        switch(input)
        {
            case 'w' : direction="up";
            break;
           
            case 's' : direction="down";
            break;
           
            case 'a' : direction="left";
            break;
           
            case 'd' : direction="right";
            break;
           
            case 'p' : pause();
            break;
           
            default : System.out.println("False Eingabe"); ;
        }
    }

    @Override
    public void keyReleased(KeyEvent e)
    {
       
    }

    public void goDown()                                        //in die jeweilige richtung bewegen
    {                                                            //weiter auf flase wenn rand berürt
        if(aktH != 9)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktH += 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktH == 9)
        {
            System.out.println("GAME OVER");
            weiter = false;
        }
    }
    public void goUp()
    {
        if(aktH != 0)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktH -= 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktH == 0)
        {
            System.out.println("GAME OVER");;
            weiter = false;
        }
    }
    public void goLeft()
    {
        if(aktW != 0)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktW -= 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktW == 0)
        {
            System.out.println("GAME OVER");
            weiter = false;
        }
    }
    public void goRight()
    {
        if(aktW != 9)
        {
            map[aktH][aktW].setBackground(Color.GRAY);
            aktW += 1;
            map[aktH][aktW].setBackground(Color.RED);
           
        }else if(aktW == 9)
        {
            System.out.println("GAME OVER");
            weiter = false;           
        }
    }
   
    public void timerx()                                    //im jeweiligen timeinterval wird nach begin move aufgerufen
    {       
        timer.scheduleAtFixedRate(new TimerTask() {           
            @Override
            public void run() {
                if(pause == false)
                {
                    Move();
                    zaehler = zaehler + 1;
                   
                    if(weiter == false)                        //wenn rand berürt wird der timer zerstört
                    {
                        timer.cancel();
                    }   
                }
            }
        },begin, timeinterval);
    }
       
    public void Move()                                        // je nach richtung wird das feld in die nächste position bewegt
    {
        if(direction.equalsIgnoreCase("down"))
        {
            goDown();
        }else
            if(direction.equalsIgnoreCase("up"))
            {
                goUp();
            }else
                if(direction.equalsIgnoreCase("right"))
                {
                    goRight();
                }else
                    if(direction.equalsIgnoreCase("left"))
                    {
                        goLeft();
                    }
    }
   
    public void pause()                                        // wenn p dann wird der timer indirekt angehalten, durch die if abfrage im timer ob pause ja/nein ist
    {
        if(pause == false)
        {
            pause = true;
        }
        else if(pause == true)
        {
            pause = false;
        }
    }
}

ich hab versucht ihn so verständlich wie möglich zu kommentieren und zu schreiben, ist vom Prinziep her eigentlich ganz simpel, wenn man nur weiß wie XD
 

Harry Kane

Top Contributor
Ich habs zwar nicht probiert, aber schaut soweit gut aus.
Ein HInweis: deine if else Logik ist durchweg zu kompliziert.
Z. B. bei
Java:
if(aktW != 9){
  map[aktH][aktW].setBackground(Color.GRAY);
  aktW += 1;
   map[aktH][aktW].setBackground(Color.RED);
}
else if(aktW == 9){
   System.out.println("GAME OVER");
  weiter = false;   
}
kannst du dir das if nach dem else sparen, weil das 2. if sowieso true ist.
Ganz schlimm ist
Java:
public void pause(){
  if(pause == false){
      pause = true;
  }
  else if(pause == true){
      pause = false;
  }
}
1. if(pause == true) ist equivalent zu if(pause), if(pause == false) ist if(!pause)
2. Überflüssiges if nach dem, else (dasselbe Mister wie oben beschrieben)
3. Die ganze Methode geht viel kürzer: pause = !pause;
 

MaDDin-94

Mitglied
Noch etwas kürzer wäre:

Code:
public void pause(){
  pause = !pause;
}

EDIT: Ups hatte Harry Kane schon erwähnt :oops:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jose05 einfache GUI mit schwarzem Feld AWT, Swing, JavaFX & SWT 12
J vom Dialogfenster ein Feld des Hauptfenster einlesen AWT, Swing, JavaFX & SWT 2
D JavaFX Leuchtendes großes Feld? AWT, Swing, JavaFX & SWT 2
N Swing microba - DatePicker: Feld-Hintergrund anpassen AWT, Swing, JavaFX & SWT 2
N Custom JButton Feld aus Parent lesen lassen AWT, Swing, JavaFX & SWT 11
R Swing JComboBox - Null-Feld AWT, Swing, JavaFX & SWT 7
D SWT StyledText-Feld Validieren??? AWT, Swing, JavaFX & SWT 3
B in jList feld aus einem objekt anzeigen AWT, Swing, JavaFX & SWT 2
N Minesweeper: 2D Feld von JButtons anlegen AWT, Swing, JavaFX & SWT 19
E Feld aktualisieren AWT, Swing, JavaFX & SWT 8
M Feld breiter, als mit setColumns() angegeben AWT, Swing, JavaFX & SWT 3
B Graues Feld unter JComboBox AWT, Swing, JavaFX & SWT 2
N Feld wird nicht gezeichnet. Probleme mit Swing AWT, Swing, JavaFX & SWT 7
Paule Popup oder Dialog-Feld mit eigenem Inhalt AWT, Swing, JavaFX & SWT 9
M JTextField kontrollieren, sobald das Feld verlassen wird AWT, Swing, JavaFX & SWT 3
D Textumbruch in einem TextArea Feld AWT, Swing, JavaFX & SWT 5
J Einzelnes Feld in JTable färben AWT, Swing, JavaFX & SWT 2
R Name von Feld nicht ereichbar AWT, Swing, JavaFX & SWT 7
O JFileChooser - Zugriff auf Dateiname-Feld und Save-Button? AWT, Swing, JavaFX & SWT 6
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
B JavaFX TableView-Zellen sollen automatisch so groß wie der größte Inhalt sein AWT, Swing, JavaFX & SWT 6
F JavaFX textField Ausgabe automatisch kopieren AWT, Swing, JavaFX & SWT 7
J Gridpane Breite in Scrollpane automatisch anpassen AWT, Swing, JavaFX & SWT 2
L ComboBox Wert automatisch auswählen AWT, Swing, JavaFX & SWT 6
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
I CSS - backgroundImage - Größe automatisch an den Container anpassen AWT, Swing, JavaFX & SWT 1
P TreeView automatisch an große von Inhalt anpassen AWT, Swing, JavaFX & SWT 3
L Java FX Scrollpane automatisch resizen AWT, Swing, JavaFX & SWT 3
S Swing Bedienelemente ordnen sich automatisch neu an AWT, Swing, JavaFX & SWT 2
J JTextfield automatisch aus zweiter Klasse aktualisieren AWT, Swing, JavaFX & SWT 5
S Buttons und TextField automatisch vergrößern AWT, Swing, JavaFX & SWT 8
C AWT Textfelder werden nicht automatisch angezeigt AWT, Swing, JavaFX & SWT 2
G Properties automatisch laden AWT, Swing, JavaFX & SWT 10
W Bei Programmstart jRadioButton automatisch auswählen AWT, Swing, JavaFX & SWT 2
S JavaFX Fenstergrösse automatisch Speichern und Laden AWT, Swing, JavaFX & SWT 4
2 Zeit Differenz automatisch aktualisieren AWT, Swing, JavaFX & SWT 1
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
S Swing Automatisch 2px Rahmen in Windows 8 AWT, Swing, JavaFX & SWT 0
G Swing ComboBoxItem automatisch wählen AWT, Swing, JavaFX & SWT 4
B Swing Form undecorated: Beim Bewegen geht die Maus immer automatisch zur linken Seite. AWT, Swing, JavaFX & SWT 7
I JTable Spalten automatisch dem Inhalt anpassen! AWT, Swing, JavaFX & SWT 6
0 JTable Spaltenbreite automatisch an Inhalt anpassne geht nicht AWT, Swing, JavaFX & SWT 3
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
D JTable width automatisch anpassen AWT, Swing, JavaFX & SWT 4
R Swing Wie kann man Internal Frames automatisch ausrichten lassen? AWT, Swing, JavaFX & SWT 3
E JToggleButton automatisch nach drücken loslassen AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
B JScrollPane scrollt nicht immer automatisch AWT, Swing, JavaFX & SWT 2
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
B Fenstergröße automatisch skalieren AWT, Swing, JavaFX & SWT 7
C Textfeld automatisch befüllen AWT, Swing, JavaFX & SWT 6
R JTable: Spaltenbreite automatisch anpassen AWT, Swing, JavaFX & SWT 3
J SWT Dialog in Dialog automatisch öffnen AWT, Swing, JavaFX & SWT 19
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
X JEditorPane Größe in JDialog automatisch anpassen AWT, Swing, JavaFX & SWT 2
U JComboBox automatisch zuklappen AWT, Swing, JavaFX & SWT 7
Y JCheckBoxen automatisch anlegen AWT, Swing, JavaFX & SWT 6
M Swing Eingabe auf JTextField automatisch ausgeben auf JLabel AWT, Swing, JavaFX & SWT 2
J Swing JList: Neue Zeilen mit fireIntervalAdded sind automatisch selektiert AWT, Swing, JavaFX & SWT 2
M LayoutManager JTextfield vergrößern sich automatisch AWT, Swing, JavaFX & SWT 4
T Swing Dialoginhalt automatisch anpassen während Größenänderung AWT, Swing, JavaFX & SWT 2
N ActionListener automatisch selektieren AWT, Swing, JavaFX & SWT 6
N JFrame mit Elementen an die Bildschirmgröße automatisch anpassen AWT, Swing, JavaFX & SWT 3
aze JTable automatisch vergrößern wenn das zugehörige JFrame vergrößert wird AWT, Swing, JavaFX & SWT 13
F Button soll automatisch geklickt werden AWT, Swing, JavaFX & SWT 3
R JSplitPane automatisch ausblenden AWT, Swing, JavaFX & SWT 13
H Schriftgröße automatisch an JLabel anpassen AWT, Swing, JavaFX & SWT 6
S JTable Float Column fuegt automatisch Punkt hinzu wenn man Zahlen eingibt. AWT, Swing, JavaFX & SWT 21
G SWT - TextFeld automatisch aktualisieren AWT, Swing, JavaFX & SWT 15
G JSplitPane unf JTable automatisch anpassen AWT, Swing, JavaFX & SWT 2
K JFrame + 2 Bildschirme -> automatisch auf einem Bildschir AWT, Swing, JavaFX & SWT 5
A Programm automatisch in den Vordergrund AWT, Swing, JavaFX & SWT 5
G jTable, spezille Zelle automatisch füllen AWT, Swing, JavaFX & SWT 13
S JList automatisch scrollen AWT, Swing, JavaFX & SWT 8
J JScrollPane soll automatisch zu einem punkt scrollen AWT, Swing, JavaFX & SWT 4
G Textarea soll automatisch mitrollen AWT, Swing, JavaFX & SWT 2
Z JTable automatisch zu einer Zeile scrollen AWT, Swing, JavaFX & SWT 4
S Frame grösse automatisch anpassen? AWT, Swing, JavaFX & SWT 1
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
J resize eines Bildes automatisch berechnen lassen? AWT, Swing, JavaFX & SWT 2
G Größe von SWT-Label automatisch anpassen AWT, Swing, JavaFX & SWT 5
D JTree - Knoten einfügen und automatisch in den Editiermodus AWT, Swing, JavaFX & SWT 2
S JScrollPane > JPanel - automatisch scrollen AWT, Swing, JavaFX & SWT 2
Z Java Applet Fenster automatisch an Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 4
T Datum in Textfeld automatisch formatieren AWT, Swing, JavaFX & SWT 8
R Tree automatisch öffnen AWT, Swing, JavaFX & SWT 7
N Tree automatisch öffnen AWT, Swing, JavaFX & SWT 2
G Wie schließen Fenster automatisch? AWT, Swing, JavaFX & SWT 12
S JCOntentPane ist automatisch groß? AWT, Swing, JavaFX & SWT 6
R JTable zu einem bestimmten Eintrag automatisch scrollen? AWT, Swing, JavaFX & SWT 2
S Namen von automatisch erzeugten JTextFields herausfinden… AWT, Swing, JavaFX & SWT 4
Z Column Breite in JTable automatisch an Inhalt anpassen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben