【Java】Eclipseでの実行とアプレット

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

【Java】Eclipseでの実行とアプレット

#1

投稿記事 by みけCAT » 14年前

Windows Vista SP2 32ビットです。
衝突の計算を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 自動生成されたメソッド・スタブ
	}
}
添付ファイル
syoutotu.zip
プログラムとアプレットです。
(16.07 KiB) ダウンロード数: 113 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 【Java】Eclipseでの実行とアプレット

#2

投稿記事 by ISLe » 14年前

JAppletでキーイベントを取得するためには、コンポーネントを載せて(例えばJPanel)、載せたコンポーネントにリスナーを登録してください。
そうすると、Swingの仕組み上、paintComponentメソッドで描画しないと正しく表示されません。

import javax.swing.JAppletを、java.applet.Appletに変えればこのままでいけますけど。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 【Java】Eclipseでの実行とアプレット

#3

投稿記事 by みけCAT » 14年前

ISLe さんが書きました:import javax.swing.JAppletを、java.applet.Appletに変えればこのままでいけますけど。
この方法でできました。ありがとうございます。
extends JAppletをextends Appletにする必要もありました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る