現在、javaで音楽ゲームを作成しています。
まずは譜面を降らしてみようと思い、ランダムで生成された譜面が流れるプログラムを作成したのですが、同時押しを描画する際に
譜面のズレが生じます。
repaintの位置を変えたりしてもズレてしまい、自分では解決出来ない状況です。
原因になりそうなものがあればご指摘いただきたいです。
よろしくお願いします。
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FallingLove {
public static void main(String[] args){ new vimani(); }
}
class vimani extends JPanel{
private JFrame frame; private FallObj[] fobj = new FallObj[5];//4つ落ちるレーンを用意 public vimani(){ window();//ウィンドウを生成 Timer addObj = new Timer(); addObj.schedule(new AddObj(), 0,220);//好きなタイミングでobj落下 long error = 0; int fps = 30; long idealSleep = (1000 << 16) / fps; long oldTime; long newTime = System.currentTimeMillis() << 16; while (true) { oldTime = newTime; for(int i = 0; i < 5 ; i++){//5ノーツ分 fobj[i].fall(i);//fallを呼び出す。 } newTime = System.currentTimeMillis() << 16; long sleepTime = idealSleep - (newTime - oldTime) - error; // 休止できる時間 if (sleepTime < 0x20000){ sleepTime = 0x20000; // 最低でも2msは休止 }else{ try{ oldTime = newTime; Thread.sleep(sleepTime >> 16); // 休止 newTime = System.currentTimeMillis() << 16; error = newTime - oldTime - sleepTime; // 休止時間の誤差 }catch(Exception eee){ System.err.println(eee.getMessage()); } } } } //全てのノーツを同時に同じだけ下降させる class Fall{ public void run(){ for(int i = 0; i < 5 ; i++){//4ノーツ分 fobj[i].fall(i);//fallを呼び出す。 } } } //仮としてノーツをランダム配置する class AddObj extends TimerTask{ Random rand = new Random(); int dCheck = 0; int taihi = 0; public void run(){ taihi = rand.nextInt(5);//ランダムで5レーンから1レーン選択 fobj[taihi].addObj();//そこにノーツ生成 if(dCheck == 0){ dCheck = rand.nextInt(12);//0~11の乱数生成 if(dCheck == 7 || dCheck == 11){//7か11であれば do{ dCheck = rand.nextInt(5);//被らない場所に同じタイミングでもう一つノーツ配置 }while(taihi == dCheck); fobj[dCheck].addObj();//2つ目のノーツ配置 } taihi = 0; dCheck = 0;//初期化。 } } } //譜面を降らすウィンドウ、レーンの作成 private void window(){ frame = new JFrame(); frame.setTitle("譜面フラスマン"); frame.setBounds(600,10,600,1000);//x=600,y=10,横600,縦1000のフレームを準備 frame.setLayout(null);//レイアウトマネージャ使用しない frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//一緒に消す for(int i=0;i<5;i++){ fobj[i] = new FallObj(); fobj[i].setSize(30,600);//レーンは横30、縦600 fobj[i].setLocation(220 + 35 * i,10);//レーンの位置 frame.add(fobj[i]); } frame.setVisible(true); }
}//class vimani close
//JPanelとしてGraphic描画するクラス
class FallObj extends JPanel{
private static final long serialVersionUID = 1L;
private int[] obj = new int[0];
public FallObj(){
setBackground(new Color(153,51,51,255));//レーンの色。 R,G,B,V
}
/Obj配列を新しく追加/
public void addObj(){
int[] o = new int[obj.length +1];
for(int i = 0; i < obj.length ;i++){
o[i] = obj[i];
}
obj = o;
}
/Obj配列の先頭を削除/
private void delObj(int cnt){
int[] o = new int[obj.length -1];
for(int i = 0; i < o.length ;i++){
o[i] = obj[i +1];
}
obj = o;
}
/呼び出すごとにObj配列の値を+1する/
public void fall(int fallCount){
for(int i = 0; i < obj.length ; i++){
obj[i] += 15;//落下するスピード
if(600 < obj[i]){//消す位置。今はy=600で消してる。 delObj(i);//この位置に来た先頭のObj配列を削除。 } } repaint(); }
/実際に描画するメソッド/
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(new Color(102,255,204,255));//ノーツの色 for(int i : obj){ g.fillRect(0, i, 180, 20);//オブジェクトの位置と大きさ } }
}//class FallObj close
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/05 00:16
2015/12/05 07:36
2015/12/05 08:09
2015/12/05 10:49
2015/12/06 06:34
2015/12/06 06:52
2015/12/06 08:53
2015/12/06 09:04
2015/12/06 09:45
2015/12/06 11:44
2015/12/06 11:53
2015/12/06 12:33
2016/01/03 14:35
2016/01/04 05:35