いまシューティングゲームみたいなものを作っています。
上から降ってくる桜の花びらをプレイヤーが弾で攻撃する感じです。
下のものがプログラムの一部になります。
コード public class Part01 extends JApplet{ /** * 初期メソッド */ public void init(){ setSize(1000, 700); //画面サイズ設定 MyPanel mp = new MyPanel(); //MyPanelインスタンス化 getContentPane().add(mp); //MyPanel追加 } }
コード public class MyPanel extends JPanel implements Runnable{ Player player; int gunCount = 0; Gun gun; ArrayList<Gun> gunList = new ArrayList<Gun>(); Sakura sakura; ArrayList<Sakura> sakuraList = new ArrayList<Sakura>(); Random rnd = new Random(); /** * MyPanelのコンストラクタ */ public MyPanel(){ setBackground(Color.BLACK); //背景色設定 /*再描画ループスレッド*/ Thread loopPaint = new Thread(this); loopPaint.start(); /*画像読み込み、切り取り*/ try{ player = new Player("jiki.gif", 0, 0, 32, 32); } catch(IOException ioe){ System.out.println("画像がありません"); } CreateThread ct = new CreateThread(); /*弾ループスレッド*/ ct.loopGunThread(this); /*桜作成ループスレッド*/ ct.loopCreateSakuraThread(this); /*桜ループスレッド*/ ct.loopSakuraThread(this); } /** * キー入力処理 */ @Override protected void processKeyEvent(KeyEvent ke){ /*何かキーが押された場合*/ if(ke.getID() == KeyEvent.KEY_PRESSED){ System.out.println("キー" + ke.getKeyCode() + "が押された"); /*押されたキーが左右だった場合*/ player.updata(ke.getKeyCode()); /*押されたキーがENTERだった場合*/ if(ke.getKeyCode() == KeyEvent.VK_ENTER){ gun = new Gun(10000, 10000); //Enter押されたらインスタンス生成 gunList.add(gun); //配列に追加 gunList.get(gunCount).startLine(player.m_x + 16, player.m_y); gunCount++; } } } /** * 描画メソッド */ @Override protected void paintComponent(Graphics g){ super.paintComponent(g); requestFocusInWindow(); //キー入力有効化 player.draw(g); if(gun != null){ //gunがインスタンス化されている場合(Enter押された場合) for(int i = 0; i < gunList.size(); i++){ //弾の数だけ繰り返し gunList.get(i).draw(g); } } if(sakura != null){ for(int i = 0; i < sakuraList.size(); i++){ sakuraList.get(i).draw(g); } } if(gun != null && sakura != null){ for(int i = 0; i < gunList.size(); i++){ for(int k = 0; k < sakuraList.size(); k++){ double x1 = (sakuraList.get(k).Screen_vData[0][0] + sakuraList.get(k).Screen_vData[1][0]) / 2; double y1 = (sakuraList.get(k).Screen_vData[0][1] + sakuraList.get(k).Screen_vData[1][1]) / 2; double x2 = gunList.get(i).m_x + 1; double y2 = gunList.get(i).m_y + 1; double length = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); if(length < sakuraList.get(k).scale){ System.out.println("-----衝突-----"); } } } } } /** * runメソッド(loopPaintスレッド) */ public void run(){ while(true){ repaint(); } } }
コード public class CreateThread{ Random rnd = new Random(); /** * 弾ループスレッド作成 */ public void loopGunThread(MyPanel mp){ Thread loopGun = new Thread(new Runnable(){ public void run(){ while(true){ try{ Thread.sleep(50); } catch(InterruptedException e){ } if(mp.gun != null){ //gunがインスタンス化されている場合(Enter押された場合) for(int i = 0; i < mp.gunList.size(); i++){ //弾の数だけ繰り返し if(mp.gunList.get(i).m_y > -10){ //画面内の場合(画面外になると終了) mp.gunList.get(i).updata(); } } } } } }); loopGun.start(); } /** * 桜作成ループスレッド作成 */ public void loopCreateSakuraThread(MyPanel mp){ Thread createSakura = new Thread(new Runnable(){ public void run(){ while(true){ try{ Thread.sleep((long)(Math.random() * 1000)); } catch(InterruptedException e){ } createSakura(mp); mp.sakuraList.add(mp.sakura); } } }); createSakura.start(); } /** * 桜ループスレッド作成 */ public void loopSakuraThread(MyPanel mp){ Thread loopSakura = new Thread(new Runnable(){ public void run(){ while(true){ try{ Thread.sleep(20); } catch(InterruptedException e){ } if(mp.sakura != null){ for(int i = 0; i < mp.sakuraList.size(); i++){ mp.sakuraList.get(i).updata(); } } } } }); loopSakura.start(); } /** * 桜インスタンス作成 */ public void createSakura(MyPanel mp){ mp.sakura = new Sakura( 1, 1, 0, -1, -1, 0, 1, 1, 0, 1, -1, 0, (Math.random() * 1000) - 200, -100, rnd.nextInt(6) + 5); } }
Sakura,Gun,Playerクラスは省略しています。
弾はEnterキーが押されるたびにインスタンスが生成され、gunListに格納されていきます
この弾を描画するときgunListに入っているだけ(弾の数だけ)繰り返して弾を全て描画しています。
if(ke.getKeyCode() == KeyEvent.VK_ENTER){
gun = new Gun(10000, 10000);//Enter押されたらインスタンス生成
gunList.add(gun);//配列に追加
}
このままだとEnterを押すたびにgunListが増えていき、描画するときにgunListの数だけ繰り返すので処理が重たくなると思います。
弾が画面外になったらgunListから取り除くような処理をしたいのですが、どのように記述すればいいのでしょうか?
よろしくお願いします。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/11 00:29