Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I\'m trying to have a movable Mario sprite on a level, and I have I know the key

ID: 3855176 • Letter: I

Question

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?

Explanation / Answer

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());
}
  

  
}