ページ 1 / 1
Java(オープンソースGreenfoot)を用いたシューティング
Posted: 2009年6月02日(火) 23:51
by hitugi
はじめまして。
現在こちらのサイトの龍神録の館を参考にJavaでシューティングゲームを作っています。
Javaでの質問ですので場違いでしたら削除いたします。
現在Boss実装まで構築できたのですがかなり重い状況です(Pen4 2.6G メモリ1.5GでFPS30以下)
Javaでシューティングを作るにあたり高速化するコツ等はありますでしょうか?
Bullet[/url] bu=new Bullet[1000];
としてShotクラス内で動作させているところとJadgeで
Jadge(shot sh,pshot ps,Player pl,enemy en)
とインスタンス生成時に敵味方のデータをコピーして、後は龍神録の館通りに演算し当たり判定を取っているところで敵味方のデータを取ろうすると処理落ちがひどくなります。
多少マルチスレッド的(背景を別のスレッドで動作)に作っている部分があるのでそこが原因かも知れないと思ったのですが関係なかったようです。
どうかよろしくお願いいたします。
Re:無題
Posted: 2009年6月03日(水) 00:21
by Mikan
タイトルが無題なのは避けたほうが良い回答を得られると思います^^
んで、本題なのですが処理落ちの原因としてクラス内で画像ファイルなどのデータロードなどはしていないでしょうか?
あとは、プレイヤークラスを渡すときにコンストラクタなどで読み込みや重い処理などをしているとか・・・
CとJAVAは似ているので、ソースの提示があればもう少し明確なことを言えると思いますが、提示してみてはいかがでしょうか?
hitugiさんの書いてるスペックではここまで処理落ちするのは、高速化以前にどこかに無駄な処理があるものだとおもわれます。
Re:無題
Posted: 2009年6月03日(水) 00:31
by hitugi
Mikanさんありがとうございます。
ソースの提示ですね…今ソースが学校用PCにありますので本日中に上げてみたいと思います。
あと開発環境がちょっと特殊でして…最近オープンソースになったGreenfootという環境で行っています。
理由はアルバイトで学部生に教える環境がこちらなので私がデモ用に利用してみた形です。
上げるときにGreenfootのAPIのURLも上げたいと思います。
Jadgeのソース
Posted: 2009年6月03日(水) 16:14
by hitugi
本日いろいろと試した結果、やはり多くの弾が表示されている条件下であたり判定の処理を実装すると重くなるようです。
ですのでJadgeクラスのソースを乗せてみます。よろしくお願いいたします。
<Greenfoot API URL>
http://www.greenfoot.org/doc/javadoc/
<Jadge.class>
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Judge here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Judge extends Actor
{
player pl;
enemy[/url] en;
pShot Ps;
shot[/url] sh;
int[/url] enemy_renge={16,30,16,50};//敵当たり判定
double[/url] eshot_renge={17,4,2.5,2,2,3.5,2,2.5,1.5,2};//敵弾の当たり判定
int Player_renge=3;//プレイヤー当たり判定
int m_baffer,cnt;//無敵、点滅用カウンター
int[/url] pShot_renge={6,0};//プレイヤーショット当たり判定
boolean muteki=false;//無敵判定
/**
* Act - do whatever the Judge wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
}
// Add your action code here.
Judge(player pl,enemy[/url] en,pShot Ps,shot [/url] sh){
this.pl=pl;
this.en=en;
this.Ps=Ps;
this.sh=sh;
}
boolean out_Judge_pShot(int psNum,int eNum){
if(Ps.pbu[psNum].cnt>0){
double x=Ps.pbu[psNum].x-en[eNum].x;
double y=Ps.pbu[psNum].y-en[eNum].y;
double r=pShot_renge[Ps.pbu[psNum].knd]+enemy_renge[en[eNum].knd];
if(x*x+y*y<r*r) return true;
}
return false;
}
boolean out_Judge_eShot(int shNum,int buNum){
if(sh[shNum].ba[buNum].cnt>0){
double x=pl.x-sh[shNum].ba[buNum].x;
double y=pl.y-sh[shNum].ba[buNum].y;
double r=eshot_renge[sh[shNum].knd2]+Player_renge;
if(x*x+y*y<r*r) return true;
}
return false;
}
boolean out_of_ep(int eNum){
if(en[eNum].cnt>0){
double x=pl.x-en[eNum].x;
double y=pl.y-en[eNum].y;
double r=enemy_renge[en[eNum].knd]+Player_renge;
if(x*x+y*y<r*r) return true;
}
return false;
}
void enemy_death_Judge(int eNum){
if(en[eNum].hp<0){
en[eNum].flag=false;
for(int i=0;i<sh.length;i++){
if(eNum==sh.num){
sh.sflag=true;
System.gc();
break;
}
}
}
}
void Judge_main(){
Ten();//点滅&無敵処理
for(int i=0;i<Ps.pbu.length;i++){
if(Ps.pbu.flag){
for(int j=0;j<en.length;j++){
if(en[j].flag){
if(out_Judge_pShot(i,j)){
Ps.pbu.flag=false;
Ps.pbu.setImage(new GreenfootImage(1,1));
en[j].hp-=Ps.pbu.pow;
enemy_death_Judge(j);
}
}
}
}
}
for(int i=0;i<sh.length;i++){
if(sh.flag){
for(int j=0;j<sh.ba.length;j++){
if(sh.ba[j].flag){
if(out_Judge_eShot(i,j)&&!muteki){
cnt=pl.cnt;
m_baffer=pl.cnt;
if(pl.hp>0){
pl.hp-=1;
muteki=true;
}
if(pl.hp==0){
pl.hp=0;
pl.setImage(new GreenfootImage(1,1));//プレイヤーイメージを1;1ピクセル画像に変換
Greenfoot.stop();//ゲーム終了
}
}
}
}
}
}
for(int i=0;i<en.length;i++){
if(en.flag){
if(out_of_ep(i)&&!muteki){
cnt=pl.cnt;
m_baffer=pl.cnt;
if(pl.hp>0){
pl.hp-=1;
muteki=true;
}
if(pl.hp==0){
pl.hp=0;
pl.setImage(new GreenfootImage(1,1));//プレイヤーイメージを1;1ピクセル画像に変換
Greenfoot.stop();//ゲーム終了
}
}
}
}
void Ten(){
if(muteki){
pl.flag=!pl.flag;
if(m_baffer!=0) m_baffer++;
if(m_baffer-cnt>100){
muteki=false;
m_baffer=0;
cnt=0;
}
}
else pl.flag=true;
}
}