I'm trying to have a movable Mario sprite on a level, and I have I know the keyListener is working, bc I have debug output in the console, but only the LevelComponent() appears:
public class MarioLevel extends JFrame {
MarioComponent mc = new MarioComponent();
JLabel background;
public MarioLevel(){
background = new LevelComponent();
background.setLayout(null);
this.add(background,BorderLayout.CENTER);
this.setSize(868,915);
this.setFocusable(true);
this.setVisible(true);
KeyListener kl = new MoveListener();
this.addKeyListener(kl);
background.add(mc);
mc.setBounds(mc.marioSprite.x, mc.marioSprite.y, mc.marioSprite.sprite.getWidth(), mc.marioSprite.sprite.getHeight());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class MoveListener implements KeyListener{
public void keyPressed(KeyEvent k){
if((k.getKeyCode() == 39)){
mc.moveMario();
System.out.println(mc.marioSprite.getCoordinates());
}
if(k.getKeyCode() == 83){
mc.jumpMario();
System.out.println(mc.marioSprite.getCoordinates());
}
}
public void keyReleased(KeyEvent k){
// if(k.getKeyCode = 83){
// mc.Mario
// }
}
public void keyTyped(KeyEvent k){}
}
public static void main(String[] args){
MarioLevel m = new MarioLevel();
}
}
my MarioComponent:
public class MarioComponent extends JComponent{
protected Mario marioSprite;
public MarioComponent(){
marioSprite = new Mario();
}
public void paintComponent(Graphics g){
//super.paintComponent(g);
marioSprite.draw(g);
}
public void moveMario(){
marioSprite.move();
repaint();
}
public void jumpMario(){
marioSprite.jump();
repaint();
}
public void getCoordinates(){
System.out.println(marioSprite.getCoordinates());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(marioSprite.sprite.getWidth(), marioSprite.sprite.getHeight());
}
}
my Mario class:
public class Mario{
//all numbers multiplied by 2 from OG game
protected MarioState state;
protected int x, y;
protected BufferedImage sprite;
public Mario(){
this.state = MarioState.SMALL;
this.x = 54;
this.y = 806;
URL spriteAtLoc = getClass().getResource("sprites/Mario/SmallStandFaceRight.bmp");
try{
sprite = ImageIO.read(spriteAtLoc);
} catch(IOException e){
System.out.println("sprite not found");
e.printStackTrace();
}
}
public Mario(MarioState s, int x, int y){
this.state = s;
this.x = x;
this.y = y;
}
public void move(){
this.x+=2;
}
public void move(char c, int px){
if(c =='x'){
this.x += px;
}
if(c == 'y'){
this.y += px;
}
}
public void jump(){
this.y -= 46;
}
public String getCoordinates(){
return "Mario coords: " + this.x + ", " + this.y + ".";
}
public void draw(Graphics g){
g.drawImage(sprite, this.x, this.y, null);
}
}
my LevelMap class:
public class LevelMap{
BufferedImage bg;
public LevelMap(){
URL bgAtLoc = getClass().getResource("sprites/Mario/level.bmp");
try{
bg = ImageIO.read(bgAtLoc);
}
catch(IOException e){
System.out.println("invalid level!");
}
}
public void draw(Graphics g){
g.drawImage(bg, 0, 0, null);
}
public static void main(String[] args){}
}
my LevelComponent class:
public class LevelComponent extends JLabel{
protected LevelMap levelSprite;
public LevelComponent(){
levelSprite = new LevelMap();
}
public void paintComponent(Graphics g){
levelSprite.draw(g);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(levelSprite.bg.getWidth(), levelSprite.bg.getHeight());
}
}
Both MarioComponent and LevelComponent show up in their own JFrames. My format of adding a JLabel and then adding components worked in a previous project I did, but is not working here. What could this be?