如何通过我的粒子发射器传递模式?

时间:2018-12-30 16:53:49

标签: java processing

Mode是一个类,用于赋予Particle行为,例如对其他相邻Particles的移动,着色和反应。 Particles用作空间参考点,以在画布上构建对象。我决定尝试将Modes作为可以根据需要添加到Particle的类。一方面是因为我想使主Particle尽可能的苗条,另一方面是因为将来我希望Particles能够互相传递ModesParticles是多用途的东西,因此不适合创建Particles的子类,因为我认为这会限制它们的使用。他们需要能够通过获取Modes的独特组合来改变自己的行为,变异并变得陌生。

ParticleManager扩展了Particle。它还将具有自己的Modes类型,以便可以将行为应用于孩子ParticlesParticleManager发出Particles。执行此操作时,它应该在Particle中传递自己的Modes modes

也许需要克隆/复制的是粒子类本身?但是:如果我制作了Particle的副本构造函数,那么Modes仍然会遇到同样的问题。

我有个想法,应该避免使用clone()。关于以下一个以上子类的实现,我还没有看到关于SO的任何问题:

class Particle
{
  ArrayList<Mode>modes;
  Particle()
  {
    modes = new ArrayList<Mode>();
  }

  void update()
  {
    for (Mode m : modes)
    {
      m.apply();
    }
  }
}

class Mode 
{
  Mode(Particle p)
  {
    p.modes.add(this);
  }
  void apply()
  {
    //do something
  }

  Mode copy(Particle p)
  {

 ///of course this is wrong!
    return this;
  }
}


class ModeA extends Mode
{
  float transparency;
  ModeA(Particle p)
  {
    super(p);
  }
  void apply()
  {
    ///example
    transparency = random(1);
  }
}

class ModeB extends Mode
{
  int count;
  ModeB(Particle p)
  {
    super(p);
  }
  void apply()
  {
    ///example, but each mode is unique
    count++;
  }
}

class ParticleManager extends Particle
{
  ArrayList<Particle> particles;
  ArrayList<Mode> manager_modes;

  ParticleManager()
  {
    super();
    particles = new ArrayList<Particle>();
    manager_modes = new ArrayList<Mode>();
  }

  void emit()
  {
    ///make new particles that share the same
    ///modes as the parent
    Particle p = new Particle();

    for (Mode m : modes)
    {
      ////code here that duplicates the modes from
      ////the ParticleManagers modes into p.modes
      Mode m2 = m.copy(p);///obviously this doesn’t work!


    }
    particles.add(p);
  }

  void update()
  {

    for (Particle p : particles)
    {
      p.update();
    }
  }
}

ParticleManager pm; 

void setup()
{
  pm = new ParticleManager(); 
  ///adds the modes to the manager
  ModeA mA = new ModeA(pm); 
  ModeB mB = new ModeB(pm); 

  for (int i=0; i<100; i++)
  {
    pm.emit();
  }
}

void draw()
{
  pm.update();
}

该解决方案需要尽快运行,因为它将用于实时图像,尽管当然不太可能在每个帧上运行。

0 个答案:

没有答案