2016-01-04 46 views
0

所以我做了非常簡單的遊戲。遊戲是關於一些在岩石上跳躍(圈子)的人,有時候岩石會被水覆蓋,當他們不能站在他們身上時,否則你會掉入水中並淹死。我被卡住了,我需要讓這些岩石消失(被水覆蓋)。所以我需要在隨機時間讓他們消失,隨機秒(不要太長)讓他們「看不見」,然後他們需要再次出現。我仍然是初學者,我會很感激任何答案,但如果你能向我解釋,我會很高興。 這裏是我的代碼: 我的主類讓我的圈子隨機消失,隨機秒數再次出現

在那裏我創造我的球員
package com.pitcher654.main; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferStrategy; 
import java.util.Random; 

import com.pitcher654.main.Game.STATE; 

public class Game extends Canvas implements Runnable{ 

private static final long serialVersionUID = -7800496711589684767L; 

public static final int WIDTH = 640, HEIGHT = WIDTH/12 * 9; 

private Thread thread; 
private boolean running = false; 

private Random r; 
private Handler handler; 
//private HUD hud; 
private Menu menu; 

public enum STATE { 
    Menu, 
    Help, 
    Game 
}; 

public STATE gameState = STATE.Menu; 

public Game() { 
    handler = new Handler(); 
    menu = new Menu(this, handler); 
    this.addKeyListener(new KeyInput(handler)); 
    this.addMouseListener(menu); 
    new Window(WIDTH, HEIGHT, "My game", this); 

    //hud = new HUD(); 
    r = new Random(); 

    if(gameState == STATE.Game) { 
     //handler.addObject(new Player(100, 200, ID.Player)); 
    } 

    //handler.addObject(new Player(100, 200, ID.Player)); 
    //handler.addObject(new BasicEnemy(100, 200, ID.BasicEnemy)); 

} 

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

public synchronized void stop() { 
    try { 
     thread.join(); 
     running = false; 
    }catch(Exception ex) { ex.printStackTrace(); } 
} 

public void run() 
{ 
    this.requestFocus(); 
    long lastTime = System.nanoTime(); 
    double amountOfTicks = 60.0; 
    double ns = 1000000000/amountOfTicks; 
    double delta = 0; 
    long timer = System.currentTimeMillis(); 
    int frames = 0; 
    while(running) 
    { 
       long now = System.nanoTime(); 
       delta += (now - lastTime)/ns; 
       lastTime = now; 
       while(delta >=1) 
         { 
          tick(); 
          delta--; 
         } 
         if(running) 
          render(); 
         frames++; 

         if(System.currentTimeMillis() - timer > 1000) 
         { 
          timer += 1000; 
          //System.out.println("FPS: "+ frames); 
          frames = 0; 
         } 
    } 
      stop(); 
} 

private void tick() { 
    handler.tick(); 
    //hud.tick(); 
    if(gameState == STATE.Game) { 

    }else if(gameState == STATE.Menu) { 
     menu.tick(); 
    } 
} 

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

    Graphics g = bs.getDrawGraphics(); 

    g.setColor(new Color(87, 124, 212)); 
    g.fillRect(0, 0, WIDTH, HEIGHT); 
    if(gameState == STATE.Game) { 
     g.setColor(new Color(209, 155, 29)); 
     for(int i = 0; i < 5; i++) { 
      g.fillOval(80 + (100 * i), 325, 70, 20); 
     } 
    }else if(gameState == STATE.Menu || gameState == STATE.Help){ 
     menu.render(g); 
    } 

    handler.render(g); 

    if(gameState == STATE.Game) { 

    } 
    //hud.render(g); 

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

public static int clamp(int var, int min, int max) { 
    if(var >= max) 
     return var = max; 
    else if(var <= max) 
     return var = min; 
    else 
     return var; 
} 

public static void main(String[] args) { 
    new Game(); 
} 
} 

我的播放器類:

package com.pitcher654.main; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Random; 

import com.pitcher654.main.Game.STATE; 

public class Player extends GameObject { 

    Random r = new Random(); 

public Player(int x, int y, ID id) { 
    super(x, y, id); 
    //velX = r.nextInt(5) + 1; 
    //velY = r.nextInt(5); 
} 

public void tick() { 
    x += velX; 
    y += velY; 
    //System.out.println(x); 
    if(x == 500) x = 500; 
} 

public void render(Graphics g) { 
    if(id == ID.Player) g.setColor(Color.white); 
    if(id == ID.Player2) g.setColor(Color.blue); 
    g.fillRect(x, y, 32, 32); 
    g.drawLine(x + 15, y, x + 15, y + 100); 
    g.drawLine(x + 15, y + 100, x, y + 135); 
    g.drawLine(x + 15, y + 100, x + 33, y + 135); 
    g.drawLine(x + 15, y + 70, x - 35, y + 30); 
    g.drawLine(x + 15, y + 70, x + 65, y + 30); 
    /*if(game.gameState == STATE.Menu) { 
     g.setColor(new Color(87, 124, 212)); 
     g.fillRect(0, 0, Game.WIDTH, Game.HEIGHT); 
    }*/ 
} 


} 

而且我的遊戲對象類:

package com.pitcher654.main; 

import java.awt.Graphics; 

public abstract class GameObject { 

protected static int x, y; 
protected ID id; 
protected int velX, velY; 

public GameObject(int x, int y, ID id) { 
    this.x = x; 
    this.y = y; 
    this.id = id; 
} 

public abstract void tick(); 
public abstract void render(Graphics g); 

public void setX(int x) { 
    this.x = x; 
} 
public void setY(int y) { 
    this.y = y; 
} 
public int getX() { 
    return x; 
} 
public int getY() { 
    return y; 
} 
public void setID(ID id) { 
    this.id = id; 
} 
public ID getID() { 
    return id; 
} 
public void setVelX(int velX) { 
    this.velX = velX; 
} 
public void setVelY(int velY) { 
    this.velY = velY; 
} 
public int getVelX() { 
    return velX; 
} 
public int getVelY() { 
    return velY; 
} 
} 

如果您需要任何其他班級,只是告訴我,我會發布它。

回答

1

你應該在遊戲中存儲每一塊石頭的狀態。

所以,如果你已經給出了數量的寶石(5),用這個數字創建一個常量字段。然後創建一個###布爾值數組,您將在其中保存每塊石頭的狀態。 然後創建一個「時間」數組,當石頭會改變他們的知名度。

private static final int NUM_STONES = 5; // you can change the # of the stones here 
private boolean[] visible = new int[NUM_STONES]; 
private long[] changeTimes = new long[NUM_STONES]; 

在您的遊戲的init方法中初始化值。

for(int i=0; i<NUM_STONES; i++){ 
    visible[i] = true; // each stone will be visible 
    changeTimes[i] = System.currentTimeMillis() + r.nextInt(10000); // every stone will disappear in less than 10 seconds 
} 

在你的更新方法(我想tick())更新可見性狀態。

long now = System.currentTimeMillis(); 
for(int i=0; i<NUM_STONES; i++){ 
    if(now < changeTimes[i]){ // if the time has come 
     if(visible[i]) changeTimes[i] = now + r.nextInt(5000); // every stone will be invisible up to five seconds 
     else changeTimes[i] = now + r.nextInt(10000); // every stone will be visible again up to 10 seconds 
     visible[i] = !visible[i]; // switch the visibility state 
    } 
} 

最後加條件的渲染方法:

if(gameState == STATE.Game) { 

    for(int i = 0; i < NUM_STONES; i++) { 
     if(visible[i] g.setColor(new Color(209, 155, 29)); 
     else g.setColor(new Color(107, 155, 170)); 
     g.fillOval(80 + (100 * i), 325, 70, 20); 
    } 
} 

這應該是它。 接下來你應該做的是將魔術數字提取到常量中,就像我向你展示的NUM_STONES一樣。而且,每次渲染一塊石頭並創建顏色實例時,請不要創建一個Color類的新實例,就像我以前寫過的那樣。

還要注意,有些寶石會在很短的時間內消失(並再次出現) - 您可以在更新方法中添加幾秒到changeTimes [i],以確保每塊寶石至少可見(至少)這段時間。

+0

非常感謝我正在嘗試它! –

+0

Sory打擾你,但看起來像我的寶石一直「隱形」。你有沒有留下未完成的東西? –

+0

我在代碼中看不到任何問題。 只需在代碼中添加一些'System.out.println(...)'來發現問題所在。 –