Mode
是一个类,用于赋予Particle
行为,例如对其他相邻Particles
的移动,着色和反应。 Particles
用作空间参考点,以在画布上构建对象。我决定尝试将Modes
作为可以根据需要添加到Particle
的类。一方面是因为我想使主Particle
尽可能的苗条,另一方面是因为将来我希望Particles
能够互相传递Modes
。 Particles
是多用途的东西,因此不适合创建Particles
的子类,因为我认为这会限制它们的使用。他们需要能够通过获取Modes
的独特组合来改变自己的行为,变异并变得陌生。
ParticleManager
扩展了Particle
。它还将具有自己的Modes
类型,以便可以将行为应用于孩子Particles
。
ParticleManager
发出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();
}
该解决方案需要尽快运行,因为它将用于实时图像,尽管当然不太可能在每个帧上运行。