2016-03-23 5 views
0

私はパーティクルシステムに入れましたが、プログラムを実行するときにパーティクルを生成するとレンダリングされません。 ArrayListを見て、パーティクルを追加してもその値は常に0になります。 HERESにメインクラスのコード:レンダリングされていないパーティクル

package Main; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.ArrayList; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

import me.mango.rendering.Particle; 

//do double buffering 

public class Game extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public static final int height = 400; 
    public static final int width = height * 16/9; 

    JPanel p; 
    Game game; 
    Graphics g; 

    JFrame frame; 
    KeyListener kl; 
    MouseListener ml; 

    public boolean running = true; 

    private ArrayList<Particle> particles = new ArrayList<Particle>(500); 

    public Game(){ 
     kl = new KeyListener(){ 

      public void keyPressed(KeyEvent e) { 

      } 

      public void keyReleased(KeyEvent e) { 

      } 

      public void keyTyped(KeyEvent e) { 

      } 
     }; 

     ml = new MouseListener(){ 

      public void mousePressed(MouseEvent e) { 
       addParticle(true);addParticle(false);addParticle(true); 
       addParticle(false);addParticle(true);addParticle(false); 
      } 

      public void mouseReleased(MouseEvent e) { 

      } 
      public void mouseClicked(MouseEvent e) { 

      } 

      public void mouseEntered(MouseEvent e) { 

      } 

      public void mouseExited(MouseEvent e) { 

      } 
     }; 
    } 

    public void addParticle(boolean b){ 
     int dx,dy; 
     int x = 100; 
     int y = 100; 
     if(b){ 
      dx = (int) (Math.random()*5); 
      dy = (int) (Math.random()*5); 
     }else{ 
      dx = (int) (Math.random()*-5); 
      dy = (int) (Math.random()*-5); 
     } 
     int size = (int) (Math.random()*12); 
     int life = (int) Math.random()*(120)+380; 
     particles.add(new Particle(x,y,dx,dy,size,life,Color.blue)); 
    } 

    public void update(double delta){ 
     for(int i = 0; i<= particles.size() - 1;i++){ 
      if(particles.get(i).update()) particles.remove(i); 
     } 
     System.out.println(particles.size()); 
    } 

    @Override 
    public void paint(Graphics g){ 
     g.clearRect(0, 0, getWidth(), getHeight()); 

     //render here 
     renderParticles(g); 

     g.dispose(); 
    } 

    public void renderParticles(Graphics g){ 
     for(int i =0;i <= particles.size() - 1;i++){ 
      particles.get(i).render(g); 
      System.out.println("spawned"); 
     } 
    } 

    public void run(){ 

     //initialize time loop variables 
     long lastLoopTime = System.nanoTime(); 
     final int TARGET_FPS = 60; 
     final long OPTIMAL_TIME = 1000000000/TARGET_FPS; 
     double lastFpsTime = 0; 

     //Main game loop 
     while(running) 
     { 
      //Calculate since last update 
      long now = System.nanoTime(); 
      long updateLength = now - lastLoopTime; 
      lastLoopTime = now; 
      double delta = updateLength/((double)OPTIMAL_TIME); 

      //update frame counter 
      lastFpsTime += updateLength; 

      //update FPS counter 
      if(lastFpsTime >= 1000000000) 
      { 
       lastFpsTime = 0; 
      } 

      //game updates 
      game.update(delta); 

      //graphics (gameState) 
      game.repaint(); 

      try{ 
       Thread.sleep((Math.abs(lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000)); 
      }catch(Exception e){ 
       System.out.println("Error in sleep"); 
      } 
     } 
    } 

    public void start(){ 
     frame = new JFrame("Game"); 

     game = new Game(); 

     frame.add(game); 
     frame.pack(); 

     frame.setSize(width, height); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     frame.addKeyListener(kl); 
     frame.addMouseListener(ml); 

     frame.setVisible(true); 

     run(); 
    } 

    public static void main(String[] args){ 
     new Game().start(); 
    } 
} 

と粒子クラスについて:

package me.mango.rendering; 

import java.awt.Color; 
import java.awt.Graphics; 

public class Particle { 

    private int x; 
    private int y; 
    private int dx; 
    private int dy; 
    private int size; 
    private int life; 
    private Color color; 

    public Particle(int x, int y, int dx, int dy, int size, int life, Color c){ 
     this.x = x; 
     this.y = y; 
     this.dx = dx; 
     this.dy = dy; 
     this.size = size; 
     this.life = life; 
     this.color = c; 
    } 

    public boolean update(){ 
     x += dx; 
     y += dy; 
     life--; 
     if(life <= 0){ 
      return true; 
     } 
     return false; 
    } 

    public void render(Graphics g){ 
     g.setColor(color); 
     g.fillRect(x-(size/2), y-(size/2), size, size); 

     g.dispose(); 
    } 

} 

ありがとう!

答えて

0

あなたはクラスGameの中にゲームというものがあります。それはまったく良いデザインではありません。どうやら、オブジェクトを作成する意味を理解していないようです。

main()では、オブジェクトゲームを作成しました。これで十分です。あなたが操作しなければならないこと。

したがって、クラスゲーム内でgame.something()を呼び出すことは、畳み込みです。それを取り除く。

game = new Game(); 

Game game; 

これらのことは行わなければなりません。あなたがゲーム内にあるかどうかを

そしてgame.someMethodへの参照()

は、ただのsomeMethod()に置き換えてください。

さらに、run()やstart()などのようなものがあります。スレッドを作成していると思いますか?あなたのメソッドにそれらの名前を使用するだけで?

+0

非常に生意気今日は私たちではありません – mangodragon

+0

、これでも問題が解決しません – mangodragon

関連する問題