2D-Grafik Spielfigur bewegt sich nicht

memuench

Mitglied
Hallo, ich arbeite gerade an einem sporadischen Frogger Code, stoße jedoch im Moment auf das Problem, dass ich die Figur so gut wie nicht bewegen kann. Wenn ich nach links tippe, bewegt er sich zwar 1 nach links aber danach will er sich nicht mehr bewegen. Dasselbe gilt für alle Richtungen.
Das ist der Code mit dem KeyListener und den Panels:
Java:
public class FroggerFrame extends JFrame {

    GameInstance gi;
    FroggerStartPanel fstp;
    MoveListener ml = new MoveListener();
   
    public FroggerFrame() {
        this.setLayout(new BorderLayout());
        this.setTitle("Frogger");
        gi = new GameInstance();
        FroggerGamePanel fgp = new FroggerGamePanel();
        FroggerScorePanel fsp = new FroggerScorePanel();
        fstp = new FroggerStartPanel();
        this.add(fgp, BorderLayout.CENTER);
        this.add(fsp, BorderLayout.PAGE_START);
        this.add(fstp, BorderLayout.PAGE_END);
        this.addKeyListener(ml);

        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.repaint();
        pack();
        super.setVisible(true);
       
   
       
    }
   
   
    public static void main(String[] args) {
        FroggerFrame p = new FroggerFrame();
       
    }
   
   
   
    class FroggerGamePanel extends JPanel{
       
        public FroggerGamePanel() {
            setPreferredSize(new Dimension(600,300));
            setOpaque(true);
        }
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(io.ImageLoader.getActor("froggerstreet"),0,0,null);
        }
    }
   
    class FroggerScorePanel extends JPanel{
        private TitledBorder t3 = BorderFactory.createTitledBorder("Menu");
       
        private Border etched = BorderFactory.createEtchedBorder(Color.WHITE, Color.white);

       
        public FroggerScorePanel() {
            setLayout(new FlowLayout());
            setPreferredSize(new Dimension(600,100));
            setBackground(Color.DARK_GRAY);
            t3.setBorder(etched);
            t3.setTitleColor(Color.white);
            setBorder(t3);
           
            setVisible(true);
            setOpaque(true);
           

        }
       
        public void paintComponent(Graphics g) {
            int potraithelp=334;
            Graphics2D g2 = (Graphics2D)g;
            super.paintComponent(g2);
            g2.setColor(Color.white);
            g2.drawString("Score: "+gi.getScore(), 5, 50);
            g2.drawString("Lifes:", 300, 50);
           
            for(int i=0;i< gi.getLifes();i++) {
                g2.drawImage(io.ImageLoader.getActor("froggerpotrait"),potraithelp,50-17,null); //Position vorgeben, rest student?
                potraithelp+=34;
            }
       
        }
    }
   
    class FroggerStartPanel extends JPanel{
        Frogger help = gi.getCurr();
       
        public FroggerStartPanel() {
            setPreferredSize(new Dimension(600,100));
            setBackground(Color.GREEN);
            setOpaque(true);
           
        }
       
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setBackground(Color.green);
            help.paint(g2);
        }
    }
   
    class MoveListener implements KeyListener{

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
           
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode()==KeyEvent.VK_DOWN) {
                gi.getCurr().moveDown();
               
            }
           
            if(e.getKeyCode()==KeyEvent.VK_UP) {
                gi.getCurr().moveUp();
            }
           
            if(e.getKeyCode()==KeyEvent.VK_LEFT) {
                gi.getCurr().moveLeft();
            }
           
            if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                gi.getCurr().moveRight();
            }
           
            fstp.repaint();
           
           
        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
           
        }
       
    }
   

   
}

GameInstance:

Java:
public class GameInstance {
   
    private int lifes;
    private boolean gameActive;
    private boolean paused;
    private int score;
    private Frogger curr;
   
    public GameInstance() {
        this.lifes =3;
        this.score=0;
        this.curr = new Frogger(ActorType.FROGGER);
        //curr.setLocation(0, 50);
    }
   
    public void addScore(int n) {
        this.score+=n;
    }
   
    public int getScore() {
        return this.score;
    }
   
    public int getLifes() {
        return this.lifes;
    }
   
    public void loseLife() {
        this.lifes--;
    }
   
    public Frogger getCurr() {
        return this.curr;
    }

}


Spielerklasse:

Java:
public class Frogger extends GameObject {

    public Frogger(ActorType type) {
        super(type);
    }

   
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(this.getImg(), this.getX(),this.getY(), 50, 50, null); //Testwerte
       
    }
   
    public void moveDown() {
        this.move(0, 1);
    }
   
    public void moveUp() {
        this.move(0, -1);
    }
   
    public void moveRight() {
        this.move(1, 0);
    }
   
    public void moveLeft() {
        this.move(-1, 0);
    }
   
   
   
    public void move(int x,int y) {

            this.setLocation(x, y);
           
   
    }
   

   
}

Sieht hier irgendwer den Fehler, den ich einfach nicht sehe??
 
Wie sieht die Klasse GameObject aus?
Hi Robat, kaum gepostet hatte ich das Problem selbst. Ich habe bei moveDown z.B. die Position mit (0,1) ersetzt und nicht oben drauf addiert. So nun hätte ich aber noch eine Frage:
Ist es möglich eine Figur über zwei Panel zu bewegen?
Denn ein Panel war bei mir der Startbereich von Frogger und direkt oben drüber ist die Straße als Panel. Aber mir ist eben aufgefallen, dass sich die Figur nicht in die Straße bewegen lässt, sondern nur panel-intern fortbewegt
 
Warum teilst du es denn auf verschiedene Panel auf und nimmst nicht eins auf dem du alles zeichnest?
Weil ich den Straßenteil dann leicht durch 4 Teilen kann um die Position der Autos zu ermitteln (also der x - Punkt, an dem die Autos einfahren). Wenn es nicht anders geht, muss ich das dann wohl dazu packen. Dann kann ich ja dennoch einfach die Höhe von dem Starting Point abziehen, um die Fläche der Straße zu erhalten
 
Hallo.

Sobald er den ersten Panel verlässt muss du im anderen Panel zeichen. Also die zweite paintComponent(...) verwenden.
Ich würde aber nicht mehrere Panels verwenden und nur eins. Das ist simpler zu implementieren.
Ich würde auch vermuten das die Position im zweiten auch dann von 0 bis x hoch ist und im ersten Panel auch.
Schon das ist nicht so sauber. Weil der Frosch dann mehrmals die Position 0 bis x haben kann aber sich in unterschiedlichen Panels befindet.

Grüße
 
Hallo.

Sobald er den ersten Panel verlässt muss du im anderen Panel zeichen. Also die zweite paintComponent(...) verwenden.
Ich würde aber nicht mehrere Panels verwenden und nur eins. Das ist simpler zu implementieren.
Ich würde auch vermuten das die Position im zweiten auch dann von 0 bis x hoch ist und im ersten Panel auch.
Schon das ist nicht so sauber. Weil der Frosch dann mehrmals die Position 0 bis x haben kann aber sich in unterschiedlichen Panels befindet.

Grüße
Hallo, du hast Recht, ich habe es jetzt so geändert, funktioniert perfekt. Ich habe jedoch noch eine Frage: Wie spawne ich nun am besten per Thread die Autos die einfahren?

Java:
package objects;

public class Car extends GameObject {
   

    public Car(ActorType type) {
        super(type);
        this.setSpeed(30);

    }
   
    public void moveLeft() {
        this.setLocation(-this.getSpeed(), 0);
    }
   
    public void moveRight() {
        this.setLocation(this.getSpeed(), 0);
    }
   
   
    class CarMovementThread extends Thread{
        public void run() {
           
        }
    }

}

Java:
package objects;

import java.awt.Image;

public class GameObject {

    private int x,y;
    private int width,height;
    private int speed;
    private ActorType type;
    private Image sprite;
   
    public GameObject(ActorType type) {
        this.type = type;
    }
   
    public int getX() {
        return this.x;
    }
   
    public int getY() {
        return this.y;
    }
   
    public int getWidth() {
        return this.width;
    }
   
    public int getHeight() {
        return this.height;
    }
   
    public int getSpeed() {
        return this.speed;
    }
   
    public void setSpeed(int speed) {
        this.speed = speed;
    }
   
    public void setLocation(int x,int y) {
        this.x = this.x+x;
        this.y = this.y+y;
    }
   
    public Image getImg() {
        if(this.sprite==null) {
            switch(this.type) {
            case CAR_RED: this.sprite = io.ImageLoader.getActor("carred");
            case CAR_BLUE: this.sprite = io.ImageLoader.getActor("carblue");
            case CAR_GREEN: this.sprite = io.ImageLoader.getActor("cargreen");
            case CAR_PURPLE: this.sprite = io.ImageLoader.getActor("carpurple");
            case FROGGER: this.sprite = io.ImageLoader.getActor("froggercharacter");
            }
        }
       
        return this.sprite;
    }
}

Ich muss nun im Thread wahrscheinlich je nach Richtung moveLeft() / moveRight() ausführen aber wie zeichne ich die Autos dann? Der Thread beinhaltet ja keine möglich auf eine paint Methode oder??
 

Zurück
Oben