2016-04-24 13 views
0

ゲームはブロックゲームの単純なスタックです。ゲームはコンパイルされて正常に動作します。私が抱えている問題は、ブロックがプレイヤーが得るトップに近づくほど速く動くはずであるということです。問題は、どこのブロックが雷の速度で動いても問題ではありません。私は単純な間違いを見過ごしていると思う。あらゆる種類の助けが好きです。 forward()draw()は時間依存している何かを持っていない呼び出すdo ... whileループ:私のゲームで何が起こっているのかわからない

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class Stacker 
    extends JFrame 
    implements KeyListener 
{ 
    int iteration = 1; 
    static double time = 200.0D; 
    static int last = 0; 
    static int m = 10; 
    static int n = 20; 
    JLabel[][] b; 
    static int[] length = { 5, 5 }; 
    static int layer = 19; 
    static int[] deltax = new int[2]; 
    static boolean press = false; 
    static boolean forward = true; 
    static boolean start = true; 

    public static void main(String[] args) 
    { 
    System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); 
    new Stacker(); 
    } 

    public Stacker() 
    { 
    setDefaultCloseOperation(3); 
    this.b = new JLabel[m][n]; 
    setLayout(new GridLayout(n, m)); 
    for (int y = 0; y < n; y++) { 
     for (int x = 0; x < m; x++) 
     { 
     this.b[x][y] = new JLabel(" "); 
     this.b[x][y].setBackground(Color.black); 
     add(this.b[x][y]); 
     this.b[x][y].setEnabled(true); 
     this.b[x][y].setOpaque(true); 
     this.b[x][y].setBorder(BorderFactory.createLineBorder(Color.GRAY)); 
     this.b[x][y].setPreferredSize(new Dimension(40, 30)); 
     } 
    } 
    setFocusable(true); 
    addKeyListener(this); 
    pack(); 
    setVisible(true); 
    go(); 
    } 

    public void go() 
    { 
    int tmp = 0; 
    Component temporaryLostComponent = null; 
    do 
    { 
     if (forward) { 
     forward(); 
     } else { 
     back(); 
     } 
     if (deltax[1] == 10 - length[1]) { 
     forward = false; 
     } else if (deltax[1] == 0) { 
     forward = true; 
     } 
     draw(); 

    } while (! 

     press); 
    if (layer > 12) { 
     time = 150 - (this.iteration * this.iteration * 2 - this.iteration); 
    } else { 
     time -= 2.2D; 
    } 
    this.iteration += 1; 
    layer -= 1; 
    press = false; 
    tmp = check(); 
    length[0] = length[1]; 
    length[1] = tmp; 
    if ((layer == -1) && (length[1] > 0)) 
    { 
     JOptionPane.showMessageDialog(temporaryLostComponent, "Congratulations! You beat the game!"); 
     System.exit(0); 
    } 
    if (length[1] <= 0) 
    { 
     JOptionPane.showMessageDialog(temporaryLostComponent, "Game over! You reached line " + (18 - layer) + "!"); 
     System.exit(0); 
    } 
    last = deltax[1]; 
    start = false; 
    go(); 
    } 

    public int check() 
    { 
    if (start) { 
     return length[1]; 
    } 
    if (last < deltax[1]) 
    { 
     if (deltax[1] + length[1] - 1 <= last + length[0] - 1) { 
     return length[1]; 
     } 
     return length[1] - Math.abs(deltax[1] + length[1] - (last + length[0])); 
    } 
    if (last > deltax[1]) { 
     return length[1] - Math.abs(deltax[1] - last); 
    } 
    return length[1]; 
    } 

    public void forward() 
    { 
    deltax[0] = deltax[1]; 
    deltax[1] += 1; 
    } 

    public void back() 
    { 
    deltax[0] = deltax[1]; 
    deltax[1] -= 1; 
    } 

    public void draw() 
    { 
    for (int x = 0; x < length[1]; x++) { 
     this.b[(x + deltax[0])][layer].setBackground(Color.black); 
    } 
    for (int x = 0; x < length[1]; x++) { 
     this.b[(x + deltax[1])][layer].setBackground(Color.BLUE); 
    } 
    } 

    public void keyPressed(KeyEvent e) 
    { 
    if (e.getKeyCode() == 32) { 
     press = true; 
    } 
    } 

    public void keyReleased(KeyEvent arg0) {} 

    public void keyTyped(KeyEvent arg0) {} 
} 
+1

「時間」を浪費していますか? :-)私は使用法を見ることができません。 – Turo

答えて

0

は、あなたは法go()内にあるように見え、あなたのメインのゲームループ、ノータイミング制御ロジックを持っていません。最後のゲームの反復更新を実行するのにかかった時間(ミリ秒単位)を把握し、ゲーム速度を設定する事前定義された時間間隔より短い場合は待機する必要があります。

go()メソッドへの再帰呼び出しの問題もあり、最終的にスタックメモリが不足する可能性があります。ゲームを再開する方法として、あなたがそれを実装した方法は、再起動の数を可能にし、おそらくそれに気づくことはありませんが、それは良い設計ではありません。ゲームオーバー時に終了するか、プレイヤーがスタートボタンのようなものを押したときにGUIによって再起動されるメインゲームループが必要です。

関連する問題