我有一个GameLoop类,其中定义了ParticleSystem对象。
ParticleSystem包含一个Particle对象数组 - 我不想为每个单独的粒子加载图像,id就像只能从GameLoop类中的源图像中绘制 - 我该怎么做呢以有效的方式?
SOLUTION:
以下是Dan S帮助我提出的建议:
public class ResourceManager {
Context mContext;
public final HashMap<String, Bitmap> Texture = new HashMap<String, Bitmap>();
//Constructor
public ResourceManager(Context context)
{
mContext = context;
Texture.put("particle1", loadBitmap(R.drawable.particle1));
}
public Bitmap getBitmap(String key)
{
return Texture.get(key);
}
/** Load an image */
protected Bitmap loadBitmap(int id) { return BitmapFactory.decodeResource(mContext.getResources(), id); }
} //End ResourceManager
然后在类中定义它:
rm = new ResourceManager(mContext);
然后传递rm变量:
ParticleSystem.Draw(rm, canvas);
{
Particle.Draw(rm, canvas);
}
并且在Particle类中,我在构造函数中设置了一个String assetKey - 因此我可以通过名称引用Bitmap:
public void doDraw(ResourceManager rm, Canvas canvas) {
canvas.drawBitmap(rm.getBitmap(AssetKey), xpos, ypos, null);
}
我希望这对其他人也有帮助。
答案 0 :(得分:1)
在GameLoop的构造函数中创建您的位图并在那里保留对它们的引用,将它们设置为最终变量,以防止意外分配。无论何时创建新的粒子系统,都将它们传递给构造函数或者在适当的setter方法中设置它们。
示例:强>
// in GameLoop definition
private Bitmap particleA;
private Bitmap particleB;
// somewhere in GameLoop constructor
particleA = BitmapFactor.decodeResource (activity.getResources(), R.drawable.particle_a);
particleB = BitmapFactor.decodeResource (activity.getResources(), R.drawable.particle_b);
// where you build your particle
Particle (GameLoop gl, ...) {
oneLevelDown = new OneLevelDown(GameLoop gl, ...);
}
OneLevelDown (GameLoop gl, ...) {
twoLevelDown = new TwoLevelDown(GameLoop gl, ...);
}
TwoLevelDown (GameLoop gl, ...) {
particleABitmap = gl.getParticleA(); // simple getter
particleBBitmap = gl.getParticleB(); // simple getter
}
只要不断传递GameLoop,直到完成为止。这可能效率不高,但是一旦你掌握了它,你也会看到这篇文章关于Dependency Injection。
Java内存使用示例:
class Car{
public int year;
public int name;
}
// Object variables are references to an object's data.
Car a = new Car(); // first car object and variable.
a.year = 1990;
a.name = "Sam";
Car b = new Car();// second car object and variable
b.year = 2000;
b.name = "Bob";
Car c = a; // third car **variable** but same car object as **a**
// primitives are different
int a = 23; // first variable, 4 bytes used
int b = 45; // second variable, 4 bytes used (and a total of 8)
int c = a; // third variable, 4 bytes used (and a total of 12). c took on the value of a, but does not point to the same memory as a