Bewegung funktioniert nicht

Diskutiere Bewegung funktioniert nicht im AWT, Swing, JavaFX & SWT Bereich.
H

HackerBanane

Hallo und schonmal vielen dank für eure mühe!

Ich lerne gerade Java mit einem Buch und Parallel mit YouTube Tutorials und habe mit meinem Vater eine Wette, wer als erstes PacMan programmiert.
Ich nutze die IDE Eclipse und habe folgendes Problem:

In ein JFrame habe ich 2 Images hinzugefügt: eines als Hintergrund und eines mit einer PacManfigur.
Mithilfe von Tutorials, die ich auf mein Ziel (PacMan) angepasst habe,
habe ich probiert meine PacManfigur erstmal von links nach rechts und andersherum mit den Pfeiltasten zu bewegen, aber es funktioniert nicht, egal wie oft ich alles prüfe und neu schreibe, weshalb ich euch um Hilfe bitte.
Ich habe 2 Klassen: die eine für das Spielmenü und die Buttons usw, die frame.java heißt,
und eine Klasse für das, was im Spiel passieren soll, die Gui.java heißt.

Das ist die frame Klasse:
Java:
package de.hackerbanane.pacman;


import javax.swing.*;


import java.awt.*;


import java.awt.event.*;





public class frame extends JFrame implements ActionListener {


    


    private JButton spielen;


    private JButton einstellungen;


    private JButton info;


    private JButton ende;


    


    


    public static void main(String[] args) {


        


        frame frame = new frame("PacMan -Menü-");


        frame.setDefaultCloseOperation(JFrame.[B][I]EXIT_ON_CLOSE[/I][/B]);


        frame.setSize(400, 400);


        frame.getContentPane().setBackground(Color.[B][I]DARK_GRAY[/I][/B]);


        frame.setLayout(null);


        frame.setVisible(true);


        


    }








    public frame(String title) {


        


        super(title);


        


        spielen = new JButton("Spiel starten");


        spielen.setBounds(120, 40, 160, 40);


        spielen.addActionListener(this);


        add(spielen);


        


        einstellungen = new JButton("Einstellungen");


        einstellungen.setBounds(120, 120, 160, 40);


        einstellungen.addActionListener(this);


        add(einstellungen);


        


        info = new JButton("INFO");


        info.setBounds(120, 200, 160, 40);


        info.addActionListener(this);


        add(info);


        


        ende = new JButton("Ende");


        ende.setBounds(120, 280, 160, 40);


        ende.addActionListener(this);


        add(ende);


        


    }


    


    public static void spiel() {


        


        JFrame spiel = new JFrame("PacMan");


        spiel.setDefaultCloseOperation(JFrame.[B][I]EXIT_ON_CLOSE[/I][/B]);


        spiel.setSize(700,700);


        spiel.setVisible(true);


        spiel.add(new Gui());


        


    }


    


    public static void auswahl() {


        


    } 





    public void actionPerformed(ActionEvent e) {





        if (e.getSource() == spielen ) {


            [I]spiel[/I]();


            


        }


        


        if (e.getSource() == info ) {


            Object[] options = { "OK"};


            


            JOptionPane.[I]showOptionDialog[/I](null,"Programmiert von HackerBanane!","Information",JOptionPane.[B][I]DEFAULT_OPTION[/I][/B],JOptionPane.[B][I]PLAIN_MESSAGE[/I][/B],null,options,options[0]);


        }


    


        if (e.getSource() == einstellungen) {


            


            [I]auswahl[/I]();


            


        }


        


        if (e.getSource() == ende) {


            System.[I]exit[/I](0);


        }


        


        


    } 


    


}
Und hier ist die Gui Klasse:

Java:
package de.hackerbanane.pacman;





import java.awt.Graphics;


import java.awt.Graphics2D;


import java.awt.Image;


import java.awt.event.ActionEvent;


import java.awt.event.ActionListener;


import java.awt.event.KeyAdapter;


import java.awt.event.KeyEvent;





import javax.swing.ImageIcon;


import javax.swing.JPanel;


import javax.swing.Timer;





public class Gui extends JPanel implements ActionListener {





    Timer time;


    Image img;


    Image img2;


    int key;


    int x_bild;


    int lauf;


    int links;


    


    public Gui() {


        


        key = 0;


        lauf = 0;


        


        setFocusable(true);


        ImageIcon b = new ImageIcon((getClass().getResource("background.jpg")));


        img = b.getImage();


        


        ImageIcon c = new ImageIcon((getClass()).getResource("c-pacman.jpg"));


        img2 = c.getImage();


        


        addKeyListener(new AL());


        


        time = new Timer(5,this);


        time.start();


    }


    


    public void ActionPerformed(ActionEvent e) {


        bewegen();


        repaint();


    }


    


    public void paint(Graphics g) {


        


        super.paint(g);


        Graphics2D f2 =(Graphics2D)g;


        


        f2.drawImage(img,0,0,null);


        


        f2.drawImage(img2,x_bild,550,null);


    } 





    public void bewegen() {


        


        x_bild += lauf;


    }


    


    private class AL extends KeyAdapter {


        


        public AL() {


        


        }


        


        public void keyPressed(KeyEvent e) {


            


            key = e.getKeyCode();


            


            if(key == KeyEvent.[B][I]VK_LEFT[/I][/B]) {


                


                lauf = -2;


                


            }


            if(key == KeyEvent.[B][I]VK_RIGHT[/I][/B]) {


                


                lauf = 2;


                


            }


            


        }


        


        public void keyReleased(KeyEvent e) {


            


            key = e.getKeyCode();


            


            if(key == KeyEvent.[B][I]VK_LEFT[/I][/B] || key == KeyEvent.[B][I]VK_RIGHT[/I][/B]) {


                


                lauf = 0;


                


            }


        }


    }





    public void actionPerformed(ActionEvent e) {


    


    }


    public int getXBild( ) {


        return x_bild;


    }


}
Vielen Dank schonmal ;)
 
J

JustNobody

In Deiner Klasse Gui hast Du zwei Methoden:

actionPerformed und ActionPerformed

Du hast den Code in ActionPerformed, welche nie aufgerufen wird. Durch den Timer wird nur actionPerformed aufgerufen, aber die Methode ist leer.
 
J

JustNobody

Evtl. noch ein kleiner Hinweis zum Coding:

Klassen sollten mit einem großen Buchstaben starten in PascalCase (also statt frame dann Frame).
Variablen alle klein in camelCase (Also auch kein _ wie in x_bild sondern xBild wobei das ja eine Koordinate ist also xKoordinateBild)
Generell noch etwas mehr auf die Namen achten. Besagt die Methode genau, was sie macht? Und eine Variable beschreibt, was in ihr ist?

Evtl. ist es auch übersichtlicher, in den Klassen nicht ActionListener und so zu implementieren und statt dessen Lambdas nutzt. Aber das kannst Du Dir überlegen.

Das sähe dann ggf. so aus:
Java:
        time = new Timer(5, e -> {
            bewegen();
            repaint();
        });
Oder wenn der repaint Aufruf in bewegen erfolgen sollte und bewegen den ActionEvent Parameter bekommen sollte, dann wäre es so möglich:
Code:
time = new Timer(5, this::bewegen);

    public void bewegen(ActionEvent e) {
        x_bild += lauf;
        repaint();
    }
Dann könnte man Dinge, die Du in main machst, in den Konstruktor verschieben (Vorschlag, da es spezifisch für Dein Frame ist):
Code:
    public static void main(String[] args) {
        Frame frame = new Frame("PacMan -Menü-");
        frame.setVisible(true);
    }

    public Frame(String title) {
        super(title);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        getContentPane().setBackground(Color.DARK_GRAY);
        setLayout(null);

        spielen = new JButton("Spiel starten");
        . . .
Deine Methode spiel() benötigt kein static und hier kannst Du natürlich auch überall die Methodik von oben anwenden.

Das aber nur als einfache Hinweise, wie es evtl. lesbarer werden könnte.
 
Thema: 

Bewegung funktioniert nicht

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben