mit Pfeiltasten steuern

Bitte aktiviere JavaScript!
Ich versuche Java mit einem Buch zu lernen. Ich stehe noch recht am Anfang. Als erstes möchte ich ein kleines Spiel schreiben. Als Spielfigur habe ich einen kleinen Pinguin gezeichnet. Jetzt sollte sich der Pinguin mit den Pfeiltasten bewegen lassen. Leider tut er das nicht. Hier ist mein bisheriger Code:

Java:
package JnR;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import JnR.Var;


import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Color;



public class Spielfeld extends JFrame {
    public static void main(String[] args) {
        
        
        
      
        
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            Spielfeld frame = new Spielfeld();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Spielfeld kann nicht geladen werden!");
        }
        }
    });
    
    
    
    }
    
    

    private JPanel contentPane;

    public Spielfeld() {
        
        
        
        setTitle("Spielfeld");
        setIconImage(Toolkit.getDefaultToolkit().getImage(Spielfeld.class.getResource("/JnR/pingu.png")));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1050, 750);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(224, 255, 255));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.setVisible(true);
        
        
        JLabel label = new JLabel("Pingu");
        label.setVisible(true);
        label.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent label) {
                int x = 203;
                int y = 575;
            
                if(label.getKeyCode()==KeyEvent.VK_UP) {
                    y = y-5;
                    System.out.println("vorwärts");
                }
                if(label.getKeyCode()==KeyEvent.VK_DOWN) {
                    y = y+5;
                    System.out.println("rückwärts");
                }
                if(label.getKeyCode()==KeyEvent.VK_LEFT) {
                    x = x-5;
                    System.out.println("links");
                }
                if(label.getKeyCode()==KeyEvent.VK_RIGHT) {
                    x = x+5;
                    System.out.println("rechts");
                }
                
                repaint();
            }
            
            
        });
        
        label.setFocusable(true);
        label.requestFocusInWindow();   
            
            
            
        label.setBounds(203, 575, 50, 80);
        label.setIcon(new ImageIcon(Spielfeld.class.getResource("/JnR/pingu.png")));
        contentPane.add(label);

    }

}
Vielen Dank für eure Hilfe.
 
Den KeyListener würde ich nicht vom Label sondern vom Spielfeld nehmen.

Nur das Control, das den Fokus hat, bekommt die Events des Keys und das Label dürfte nicht den Focus haben :)

Das wäre zumindest etwas, das mir gerade so aufgefallen ist.
 
x und y sind lokale Variablen in der keyPressed Methode. Diese müssten schon Instanzvariablen sein. Außerdem musst du den Pinguin schon an der Stelle x, y zeichnen und nicht an festen Koordinaten

Noch viel besser wäre es wenn du deinen Spieler als eigene Klasse ansehen würdest
 
Ich habe versucht dem Pinguin eine eigene Klasse zu geben. Das hat leider überhaupt nicht funktioniert. So wie mein Code jetzt aussieht sollte er eigentlich jeweils bei den Koordinaten x und y gezeichnet werden und auf Tastendruck sollte es diese Koordinaten verschieben. Leider bewegt er sich immer noch kein Stück.

Die system.out.println("..."); werden mir angezeigt. Irgendwie bemerkt Java also, dass ich die Tasten drücke. Nur bringt er es leider nicht mit meinem JLabel in Verbindung.
Java:
package JnR;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import JnR.Var;


import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Color;
import javax.swing.JTextField;
import java.awt.Label;
import java.awt.Font;



public class Spielfeld extends JFrame {
    public static void main(String[] args) {
        
        
        
      
        
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            Spielfeld frame = new Spielfeld();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Spielfeld kann nicht geladen werden!");
        }
        }
    });
    
    
    
    }
    
    

    private JPanel contentPane;

    public Spielfeld() {
        
        
        
        setTitle("Spielfeld");
        setIconImage(Toolkit.getDefaultToolkit().getImage(Spielfeld.class.getResource("/JnR/pingu.png")));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1050, 750);
        contentPane = new JPanel();
        contentPane.setBackground(Color.WHITE);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.setVisible(true);
        
        
        JLabel label = new JLabel("");
        label.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                
                
            
                if(e.getKeyCode()==KeyEvent.VK_UP) {
                    int x = +5;                 
                    System.out.println("vorwärts");
                }
                if(e.getKeyCode()==KeyEvent.VK_DOWN) {
                    int x = -5;
                    System.out.println("rückwärts");
                }
                if(e.getKeyCode()==KeyEvent.VK_LEFT) {
                    int y = +5;
                    System.out.println("links");
                }
                if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                    int y = -5;
                    System.out.println("rechts");
                }
                
                repaint();
              
                
            }
            
            
        });
        //
        label.setFocusable(true);
        label.requestFocusInWindow();   
            
            
            
      
        int x=100;
        int y=100;
        label.setBounds(x, y, 50, 80);
        label.setIcon(new ImageIcon(Spielfeld.class.getResource("/JnR/pingu.png")));
        contentPane.add(label);
        
        Label label_1 = new Label("Bitte w\u00E4hle eine T\u00FCr. Mit den Pfeiltasten kannst du den Pinguin steuern.");
        label_1.setAlignment(Label.CENTER);
        label_1.setFont(new Font("Copperplate Gothic Light", Font.BOLD, 18));
        label_1.setBackground(Color.ORANGE);
        label_1.setBounds(12, 12, 1014, 37);
        contentPane.add(label_1);
        
        

    }
}
 
Java:
if (e.getKeyCode() == KeyEvent.VK_UP) {
  int x = +5;            
  System.out.println("vorwärts");
}
Du deklarierst eine neue Variable `x`, weist ihr den Wert 5 zu und das wars. Diese Variable wird sonst nicht weiter verwendet und hat auch nichts mit der Position des Labels zu tun.

Ich könnte mir vorstellen, dass du sowas vorhattest:
Java:
public void keyPressed(KeyEvent e) {
  if (e.getKeyCode() == KeyEvent.VK_UP) {
    label.setLocation(label.getLocation().x, label.getLocation().y - 5);
    System.out.println("vorwärts");
  }
  if (e.getKeyCode() == KeyEvent.VK_DOWN) {
    label.setLocation(label.getLocation().x, label.getLocation().y + 5);
    System.out.println("rückwärts");
  }
  if (e.getKeyCode() == KeyEvent.VK_LEFT) {
    label.setLocation(label.getLocation().x - 5, label.getLocation().y);
    System.out.println("links");
  }
  if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
    label.setLocation(label.getLocation().x + 5, label.getLocation().y);
    System.out.println("rechts");
  }
  repaint();
}
 
Ja genau das hatte ich vor;)Vielen Dank, jetzt funktioniert es:)
Die Variablen-Klasse hatte ich mal angefangen zu schreiben, habe sie aber bisher nicht integriert.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben