Java Spiel Spielfigur bewegt sich nicht

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Kannst Du auch noch den Code der Klasse Player posten?

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Player implements KeyListener{  
    //Attribute für Anzeigebild, Geschwindigkeit und X-Position des Spielers
    int playerSpeed, playerXPos;
    Image playerSprite;


public Player(){
    playerSpeed = 5;
    playerXPos = 350;
    playerSprite = Toolkit.getDefaultToolkit().getImage("Images/player.png");
}

@Override
public void keyTyped(KeyEvent e) {}

@Override
public void keyPressed(KeyEvent e) {
    //Spieler nach links
    if(e.getKeyCode() == 37){           
        playerXPos -= playerSpeed;          
    }   
    //Spieler nach rechts
    if(e.getKeyCode() == 39){
        playerXPos += playerSpeed;
    }
}

@Override
public void keyReleased(KeyEvent e) {}

}
0
@MaXXi1502

Du änderst zwar die Variable playerXPos bei jedem Tastendruck, aber das GUI zeichnest Du dadurch nicht erneut. Also müsstest Du nach jedem verändern der Variable playerXPos das GUI neu zeichnen. Um dies ansprechen zu können, musst Du es aber aus der Instanz von Player ansprechen können. Dazu kannst Du den Konstruktor von Player dahingehend ändern, als dass, wenn ein neuer Player instanziert wird, ihm das aktuelle Game übergeben wird. Bitte beachte auch den Hinweis von caigie. Unten findest Du den Code, der zumindest bei mir funktioniert. 

Game:

import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Image;
public class Game extends JFrame{
Player player = new Player(this);
//Attributefür Doublebuffering gegen Bildschirmflackern
privateImage db_image;
privateGraphics dbg;
/** Methode,die das Fenster erstellt,
 * wird beim Klicken des Startbuttons im Menüaufgerufen  */
public void setGui(){
   setSize(700, 500);
   setLocationRelativeTo(null);
   setResizable(false);
   setVisible(true);
   setLayout(null);
   addKeyListener(player);
}

/** DieseMethode ist teil des Doublebuffering. 
 * Sie verhindert ein Flackern des Bildes */
public void paint(Graphics g){
   db_image = createImage(getWidth(), getHeight());
   dbg = db_image.getGraphics();
   paintComponent(dbg);
   g.drawImage(db_image,0,0,this);
}

public void paintComponent(Graphicsg){
   g.drawImage(player.playerSprite, player.playerXPos, 430, this);
}
}

Player:

importjava.awt.Image;
importjava.awt.Rectangle;
importjava.awt.Toolkit;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;

publicclass Player implements KeyListener{  
    //Attribute für Anzeigebild,Geschwindigkeit und X-Position des Spielers

    int playerSpeed, playerXPos;
    Image playerSprite;

Game game;

publicPlayer(Game game){
    playerSpeed = 5;
    playerXPos = 350;
    playerSprite =Toolkit.getDefaultToolkit().getImage("Images\\player.png");
    this.game = game;
}

@Override
public voidkeyTyped(KeyEvent e) {}

@Override
public voidkeyPressed(KeyEvent e) {
    //Spieler nach links
    if(e.getKeyCode()== 37){       
      playerXPos -= playerSpeed;  
        game.repaint();
    }   
    //Spieler nach rechts
    if(e.getKeyCode() == 39){
        playerXPos += playerSpeed;
        game.repaint();
    }
}

@Override
public voidkeyReleased(KeyEvent e) {}

}
0

Für den Keylistener wird ein neuer Player erzeugt, du zeichnest aber den Player den du oben als Variable von Game erzeugt hast.

Versuch mal addKeyListener(new Player()); durch addKeyListener(player); zu ersetzen

Was möchtest Du wissen?