2016-01-20 16 views
1

我想做一个马里奥游戏。现在我正在尝试创建基本框架。我主要的游戏类:玩家扩展抽象类没有得到渲染

package com.arjav.jumper; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 

import javax.swing.JFrame; 

import com.arjav.jumper.creatures.Player; 
import com.arjav.jumper.input.KeyManager; 

public class Game implements Runnable{ 

Thread thread = new Thread(this); 
JFrame frame ; 
Handler handler = new Handler() ; 
int frames = 0; 
Canvas canvas ; 
KeyManager km = new KeyManager(); 
Graphics g ; 
Player player = new Player(50 , 50 , 32 , 32 , this); 
BufferStrategy bs ; 

public KeyManager getKeyManager() { 
    return km; 
} 

public Game(String title , int width , int height) { 
    frame = new JFrame(title); 
    frame.setSize(width , height); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(3); 
    frame.setResizable(false); 

    canvas = new Canvas(); 
    canvas.setMaximumSize(new Dimension(width , height)); 
    canvas.setMinimumSize(new Dimension(width , height)); 
    canvas.setPreferredSize(new Dimension(width , height)); 
    canvas.setFocusable(false); 

    frame.addKeyListener(km); 
    System.out.println("Key Manager added"); 
    handler.addCreature(new Player(50 , 50 , 50 , 50 , this)); 
    frame.add(canvas); 

    frame.pack(); 
} 

public static void main(String[] args) { 
    Game game = new Game("Mario" , 720 , 360); 
    game.thread.start(); 
    System.out.println("Started running"); 
} 

public void run() { 
    while(true) { 
     tick(); 
     render(); 
     frames++ ; 
     if(frames == 60) { 
      System.out.println(frames + " FPS"); 
      frames = 0 ; 
     } 
     try { 
      Thread.sleep(1000/60); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void tick() { 
    handler.tickCreature(); 
    km.tick(); 
} 

public Player getPlayer() { 
    return player; 
} 

public void render() { 
    if(bs == null) canvas.createBufferStrategy(3); 
    bs = canvas.getBufferStrategy(); 
    g = bs.getDrawGraphics(); 

    g.setColor(Color.RED); 
    handler.renderCreature(g); 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, 720, 360); 

    bs.show(); 
    g.dispose(); 
} 

} 

我的怪物等级:

package com.arjav.jumper.creatures; 

import java.awt.Graphics; 

public abstract class Creature { 

public abstract void render(Graphics g); 

public abstract void tick(); 

int x , y , width , height ; 

public Creature(int x , int y , int width , int height) { 
    this.x = x ; 
    this.y = y ; 
    this.width = width ; 
    this.height = height ; 
} 

}

球员:

package com.arjav.jumper.creatures; 

import java.awt.Color; 
import java.awt.Graphics; 

import com.arjav.jumper.Game; 

public class Player extends Creature{ 

int x , y , width , height , velX = 0 , velY = 0 ; 
Game game ; 

public Player(int x , int y , int width , int height , Game game) { 
    super(x , y , width , height); 
    this.game = game ; 
} 

@Override 
public void render(Graphics g) { 
    g.setColor(Color.RED); 
    g.fillRect(x , y , width , height); 
    System.out.println("Player rendered"); 
} 

public void tick() { 

    if(game.getKeyManager().left) x -= 3 ; 
    if(game.getKeyManager().right) x += 3; 
    System.out.println("Player ticked"); 
    System.out.println(x); 

} 

public void setVelX(int velX) { 
    this.velX = velX; 
} 

public void setVelY(int velY) { 
    this.velY = velY; 
} 



} 

它确实呈现和打勾,也很x增加打印的球员,降低。所以唯一错误的是红框不是渲染。

Handler类:

package com.arjav.jumper; 

import java.awt.Graphics; 
import java.util.LinkedList ; 

import com.arjav.jumper.creatures.Creature; 

public class Handler { 

public LinkedList<Creature> creature = new LinkedList<Creature>(); 



public void addCreature(Creature c) { 
    creature.add(c); 
} 

public void removeCreature(Creature c) { 
    creature.remove(c); 
} 

public void tickCreature() { 
    for(int i = 0 ; i < creature.size() ; i ++) { 
     Creature c = creature.get(i); 
     c.tick(); 
    } 
} 

public void renderCreature(Graphics g) { 
    for(int i = 0 ; i < creature.size() ; i ++) { 
     Creature c = creature.get(i); 
     c.render(g); 
    } 
} 

} 
+0

我觉得你首先使您的播放器,然后渲染上交换两个it.Try顶部的黑色大矩形。 –

+0

即使这样做也没有运气 –

+0

您可以尝试绘制一个绿色方块而不是黑色方块,以确保您的绘图代码正在执行? –

回答

1

的这里的问题是,一个子类具有相同的名称作为它的父类变量。即: int x, y, width, height

当玩家创建时,玩家的构造函数将x,y,width,height委托给父生物类。根据需要,这个生物构造函数将这些值保存到类成员中。

然而,玩家类包含名 x, y, width, height 但这些人基本上是不同变量,只是名称相同的变量。所以现在,当你在播放器中引用这些变量名称时,你会得到播放器的变量(未初始化,所以为0),但你打算从该生物中获取变量。

要解决这个问题,只需确保在子类和父类之间没有任何重复的变量名称,因为它们实际上“隐藏”了父变量。 Java不认为这是一个错误,但它可能会引起很多混淆。

欲了解更多信息,请参阅hiding variables