2016-01-20 15 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