衝突の計算をJavaに移植しようとしています。
とりあえず設定ダイアログは必要ありません。
Eclipse上ではうまく動いたのですが、なぜかJavaアプレットにするとキーが反応しません。
FireFox6.0.2とIE9で確認しました。
アプレット内のクリックはしました。
原因がわかりましたら教えていただければありがたいです。
よろしくお願いします。
Main.javaのソースコードを貼っておきます。
package main;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JApplet;
public class Main extends JApplet implements Runnable, KeyListener {
Dimension size=new Dimension(640,480);
Buttai obj1=new Buttai();
Buttai obj2=new Buttai();
Boolean l1=false;
Boolean r1=false;
Boolean u1=false;
Boolean d1=false;
Boolean l2=false;
Boolean r2=false;
Boolean u2=false;
Boolean d2=false;
public void init() {
Thread t=new Thread(this);
addKeyListener(this);
t.start();
}
@Override
public void run() {
// TODO 自動生成されたメソッド・スタブ
size=getSize();
Image ura=createImage(size.width,size.height);
Graphics g=ura.getGraphics();
Graphics wg=getGraphics();
//fps制御用
long maetime=getNowMilliSeconds();
int frame=0;
//fps計測用
String fpstext="0.00fps";
long fpskizyuntick=getNowMilliSeconds();
long fpsmaetime=0;
long fpsnowtime=0;;
int fpscount=0;
//物体の初期設定
obj1.setName("A");
obj1.setX(size.width/4);
obj1.setY(size.height/2);
obj1.setM(100);
obj1.setR(25);
obj2.setName("B");
obj2.setX(size.width/4*3);
obj2.setY(size.height/2);
obj2.setM(100);
obj2.setR(25);
while(true) {
//画面をリセット
g.setColor(Color.white);
g.fillRect(0,0,size.width,size.height);
//画面端に線を描画
g.setColor(Color.black);
g.drawLine(0,0,size.width-1,0);
g.drawLine(size.width-1,0,size.width-1,size.height-1);
g.drawLine(0,0,0,size.height-1);
g.drawLine(0,size.height-1,size.width-1,size.height-1);
//物体の計算
obj1.calcForce(upDown(l1,r1,30),upDown(u1,d1,30));
obj1.calcFriction(0.001,9.8);
obj1.calcWallDump(0,0,size.width,size.height,0.8);
obj2.calcForce(upDown(l2,r2,30),upDown(u2,d2,30));
obj2.calcFriction(0.001,9.8);
obj2.calcWallDump(0,0,size.width,size.height,0.8);
obj1.calcDump(obj2,0.7);
obj1.move();
obj2.move();
//物体を描画
obj1.draw(g);
obj2.draw(g);
//説明とfpsを描画
g.drawString("F1でリセット",10,15);
g.drawString("物体AはASDWキーで動かせます",10,30);
g.drawString("物体Bは上下左右キーで動かせます",10,45);
g.drawString(fpstext,10,60);
//裏画面の描画内容を表画面に描画
wg.drawImage(ura,0,0,null);
//fpsの計測
fpsnowtime=getNowMilliSeconds()-fpskizyuntick;
if(fpsnowtime>=1000) {
long seisuu=fpscount+((1000-fpsmaetime)*100/
(fpsnowtime-fpsmaetime))/100;
long syousuu=((1000-fpsmaetime)*100/
(fpsnowtime-fpsmaetime))%100;
fpstext=""+seisuu+"."+(syousuu>=10?"":"0")+syousuu+"fps";
fpskizyuntick=getNowMilliSeconds();
fpsmaetime=0;
fpscount=0;
} else {
fpscount++;
fpsmaetime=fpsnowtime;
}
//60fpsを目指す
frame++;
long sleeptime=(frame<60)?
(maetime+(long)((double)frame*(1000.0/60.0))-getNowMilliSeconds()):
(maetime+1000-getNowMilliSeconds());
if(sleeptime>0) {
try {
Thread.sleep(sleeptime);
} catch(Exception e) {}
}
if(frame>=60) {
frame=0;
maetime=getNowMilliSeconds();
}
}
}
private long getNowMilliSeconds() {
Date d = new Date();
return d.getTime();
}
private double upDown(Boolean up,Boolean down,double num) {
if(up && down)return 0;
if(up)return -num;
if(down)return num;
return 0;
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO 自動生成されたメソッド・スタブ
switch(arg0.getKeyCode()) {
case 112://F1
obj1.setX(size.width/4);
obj1.setY(size.height/2);
obj1.setVx(0);
obj1.setVy(0);
obj2.setX(size.width/4*3);
obj2.setY(size.height/2);
obj2.setVx(0);
obj2.setVy(0);
break;
case 'A':
l1=true;
break;
case 'W':
u1=true;
break;
case 'S':
d1=true;
break;
case 'D':
r1=true;
break;
case 37://左
l2=true;
break;
case 38://上
u2=true;
break;
case 40://下
d2=true;
break;
case 39://右
r2=true;
break;
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO 自動生成されたメソッド・スタブ
switch(arg0.getKeyCode()) {
case 'A':
l1=false;
break;
case 'W':
u1=false;
break;
case 'S':
d1=false;
break;
case 'D':
r1=false;
break;
case 37://左
l2=false;
break;
case 38://上
u2=false;
break;
case 40://下
d2=false;
break;
case 39://右
r2=false;
break;
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO 自動生成されたメソッド・スタブ
}
}