はじめまして。
現在こちらのサイトの龍神録の館を参考に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)
とインスタンス生成時に敵味方のデータをコピーして、後は龍神録の館通りに演算し当たり判定を取っているところで敵味方のデータを取ろうすると処理落ちがひどくなります。
多少マルチスレッド的(背景を別のスレッドで動作)に作っている部分があるのでそこが原因かも知れないと思ったのですが関係なかったようです。
どうかよろしくお願いいたします。
Java(オープンソースGreenfoot)を用いたシューティング
Jadgeのソース
本日いろいろと試した結果、やはり多くの弾が表示されている条件下であたり判定の処理を実装すると重くなるようです。
ですのでJadgeクラスのソースを乗せてみます。よろしくお願いいたします。
<Greenfoot API URL>
http://www.greenfoot.org/doc/javadoc/
<Jadge.class>
ですので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; } }