2015-10-28 158 views
0

我在跟着一個java遊戲編程教程,它有不同的狀態來處理。現在我們只是沒有對它們做任何事情,只是在我們的主類中實例化它們。不能實例化一個java類

package com.arjav.tilegame.states; 

import java.awt.Graphics; 

import com.arjav.tilegame.Game; 

public abstract class State { 

protected Game game ; 

private static State currentState = null ; 

public State(Game game) { 
    this.game = game ; 
} 

public static void setState(State state){ 
    currentState = state ; 
} 

public static State getState(){ 
    return currentState ; 
} 

public abstract void tick(); 

public abstract void render(Graphics g); 
} 

主課堂,我遇到一個問題:

package com.arjav.tilegame; 

import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 

import com.arjav.tilegame.display.Display; 
import com.arjav.tilegame.gfx.Assets; 
import com.arjav.tilegame.states.GameState; 
import com.arjav.tilegame.states.MenuState; 
import com.arjav.tilegame.states.State; 

public class Game implements Runnable{ 

private Display display ; 
public int width , height ; 
private BufferStrategy bs ; 

public String title ; 
private Graphics g ; 

private boolean running = false ; 
private Thread thread ; 

//States 

private State gameState ; 
private State menuState ; 

public Game(String title , int width , int height){ 

    this.width = width ; 
    this.height = height ; 
    this.title = title ; 

} 


    private void init() { 

    display = new Display(title , width , height); 
    Assets.init(); 


     gameState = new State(this); 
     gameState = new State(this); 
     State.setState(gameState); 
    } 


private void tick(){ 
    if(State.getState() != null) State.getState().tick(); 
} 

private void render(){ 
    bs = display.getCanvas().getBufferStrategy(); 
    if(bs == null){ 
     display.getCanvas().createBufferStrategy(3); 
     return; 
    } 

    g = bs.getDrawGraphics(); 

    g.clearRect(0, 0, width, height); 

    if(State.getState() != null) State.getState().render(g); 


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

    public void run() { 

    init(); 

    int fps = 60 ; 
    double timePerTick = 1000000000/fps ; 
    double delta = 0 ; 
    long now ; 
    long lastTime = System.nanoTime(); 
    long timer = 0 ; 
    int ticks = 0; 

    while(running){ 
     now = System.nanoTime();; 
     delta += (now - lastTime)/timePerTick ; 
     timer += now - lastTime ; 
     lastTime = now ; 

     if(delta >= 1){ 

     tick(); 
     render(); 
     ticks++ ; 
     delta-- ; 
     } 
     if(timer >= 1000000000){ 
      System.out.println("Ticks and Frame : " + ticks); 
      ticks = 0 ; 
      timer = 0; 
     } 
    } 

    stop(); 
} 

public synchronized void start(){ 
    if(running) return; 
    running = true ; 
    thread = new Thread(this); 
    thread.start(); 
} 

public synchronized void stop(){ 
    if(!running) return ; 
    running = false ; 
    try{ 
     thread.join(); 
    } 
    catch (InterruptedException e){ 
     e.printStackTrace(); 
    } 
    } 
} 

在本教程還不錯,但它給了一些問題,在這裏d:

在下面給出的定義狀態超一流
+2

請指出您遇到的問題。 –

+2

你不能在java中實例化一個抽象類。你必須擴展它並實現抽象方法。 – yogidilip

+0

它只是說在實例化init()方法 –

回答

7

您不能直接創建抽象類的實例。相反,您必須創建一個抽象子類,其中包括每個抽象方法的實現方法

public class MyState extends State { 
    MyState(Game g) { 
    super(g); 
    } 

    public void tick() { 
    System.out.println("tick"); 
    } 

    public void render(Graphics g) { 
    System.out.println("I am rendering!"); 
    //render the MyState 
    } 
} 

State s = new MyState(myGame); 
+0

你能舉一個簡單的例子嗎? –

+0

看看這個:http://stackoverflow.com/questions/4579305/can-we-instantiate-an-abstract-class – yogidilip

+0

@NishiGupta我已經更新了我的答案,例如 – ControlAltDel