我有很多对象“Block”的实例,我需要添加一个碰撞检测来查看我的sprite是否触及了一个块。但是必须复制,粘贴和编辑每个代码需要花费很多时间,因为我将在每个级别上有大约200个块...在这里它是碰撞检测,是否有可能做出循环所以所有块得到分配和值改变,所以对于第一个,例如将是第一个'block.bottomry',然后是第二个'block2.bottomry'和第三个'block3.bottomry',依此类推,直到所有的块都是不见了。这是代码的一部分:
public void iscollided() {
// bottom right touching block?
if (sprite.bottomrx < block.bottomrx && sprite.bottomrx > block.bottomlx && sprite.bottomry < block.bottommy && sprite.bottomry > block.topry ){
Log.d(TAG, "Collided!!!!!!!!!!!!1");
}
// bottom left touching block?
if (sprite.bottomlx < block.bottomrx && sprite.bottomlx > block.bottomlx && sprite.bottomly < block.bottommy && sprite.bottomly > block.topry ){
Log.d(TAG, "Collided!!!!!!!!!!!!1");
}
// top right touching block?
if (sprite.toprx < block.bottomrx && sprite.toprx > block.bottomlx && sprite.topry < block.bottommy && sprite.topry > block.topry ){
Log.d(TAG, "Collided!!!!!!!!!!!!1");
}
//top left touching block?
if (sprite.toprx < block.bottomrx && sprite.toprx > block.bottomlx && sprite.topry < block.bottommy && sprite.topry > block.topry ){
Log.d(TAG, "Collided!!!!!!!!!!!!1");
}
答案 0 :(得分:1)
当然:)您可以将块添加到列表数据结构中,并循环检查每个块。
public class Foo {
private SpecialSprite sprite = new SpecialSprite();
private List<Block> blocks = new ArrayList<Block>();
public void addBlocks() {
blocks.add(new Block(...));
blocks.add(new Block(...));
blocks.add(new Block(...));
}
public void isCollided() {
for(Block block : blocks) {
// collision detection for each block.
if(sprite.bottomrx < block.bottomrx ... ) {
Log.d(TAG, "Collided!!!!!!!!!!!!");
}
}
}
}
编辑:更具体的例子。
答案 1 :(得分:0)
我从你那里得到的问题是块是固定的,精灵正在移动/浮动。由于块是固定的,你可以将它们放在一个数组中,并将这个碰撞逻辑放在for-each循环中。
另一点是,块可以在精灵的上方,下方,前方或后方,并且碰撞逻辑在每种情况下都是不同的。在块对象中,您可以设置位置并在for-each循环中检查它。
我想块的数组将在运行时使用Block进行更新,等等。
答案 2 :(得分:0)
您想要的模式称为“工厂方法”,它创建块并“注册”它。以下是将要执行此操作的代码(我遗漏了与答案无直接关系的所有代码,并使用了...
,您可能需要填写内容):
public class Block {
private static final List<Block> BLOCKS = new ArrayList<Block>();
// A private constructor means everyone has to go through `create()`,
// which is what you want so they all get registered
private Block(...) {
...
}
public static Block create(...) {
Block block = new Block(...);
BLOCKS.add(block);
}
public static boolean hasCollided(Sprite sprite) {
for (Block block : BLOCKS) {
if (sprite.bottomlx < block.bottomrx && sprite.bottomlx > block.bottomlx && sprite.bottomly < block.bottommy && sprite.bottomly > block.topry ) {
return true;
}
}
return false;
}
}
每当您创建Block
时,请使用Block.create()
方法(这意味着新的Block会被注册)
每当您想要检查精灵是否发生碰撞时,请使用if (Block.hasCollided(someSprite))