Java 我可以为对象的每个实例创建一个循环吗?
我有很多对象“块”的实例,我需要添加一个碰撞检测来查看我的精灵是否碰到了块。但是,必须复制、粘贴和编辑每一个代码将花费很多时间,因为我将有大约200块在每个级别上。。。这里是碰撞检测,是否有任何方法可以进行循环,以便分配所有块,并更改值,因此,对于eg的第一个块,第一个块将为“block.bottomry”,然后第二个块将为“block2.bottomry”,第三个块将为“block3.bottomry”,依此类推,直到所有块都消失。以下是部分代码:Java 我可以为对象的每个实例创建一个循环吗?,java,loops,collision-detection,Java,Loops,Collision Detection,我有很多对象“块”的实例,我需要添加一个碰撞检测来查看我的精灵是否碰到了块。但是,必须复制、粘贴和编辑每一个代码将花费很多时间,因为我将有大约200块在每个级别上。。。这里是碰撞检测,是否有任何方法可以进行循环,以便分配所有块,并更改值,因此,对于eg的第一个块,第一个块将为“block.bottomry”,然后第二个块将为“block2.bottomry”,第三个块将为“block3.bottomry”,依此类推,直到所有块都消失。以下是部分代码: public void iscollided
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");
}
public void iscollided(){
//右下触摸块?
如果(sprite.bottomrxblock.bottomlx&&sprite.bottomryblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!1”);
}
//左下触摸块?
如果(sprite.bottomlxblock.bottomlx&&sprite.bottomlyblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!1”);
}
//右上触摸块?
如果(sprite.toprxblock.bottomlx&&sprite.topryblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!1”);
}
//左上触摸块?
如果(sprite.toprxblock.bottomlx&&sprite.topryblock.topry){
Log.d(标记为“碰撞!!!!!!!!!!!!!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!!!!!!!!!!!!");
}
}
}
}
公共类Foo{
private SpecialSprite sprite=新SpecialSprite();
私有列表块=新的ArrayList();
公共void addBlocks(){
块。添加(新块(…);
块。添加(新块(…);
块。添加(新块(…);
}
公共空间是集合的(){
用于(块:块){
//每个块的碰撞检测。
如果(sprite.bottomrx
编辑:更具体的例子。我从您那里得到的问题是,块是固定的,而sprite是移动/浮动的。由于块是固定的,您可以将它们放入数组中,并将此冲突逻辑放入for each循环中 另一点是,块可以位于精灵的上方、下方、前方或后方,并且碰撞逻辑在每种情况下都会有所不同。在块对象中,您可以设置位置,并在每个循环中检查该位置
我猜块数组将在运行时使用视图中的块进行更新,等等。您想要的模式称为“工厂方法”,它创建块并“注册”它。下面是可以执行此操作的代码(我省略了所有与答案不直接相关的代码,并在您可能需要填写的地方使用了
…
):
公共类块{
私有静态最终列表块=新的ArrayList();
//私有构造函数意味着每个人都必须通过“create()”,
//这就是你想要的,所以他们都注册了
专用块(…){
...
}
公共静态块创建(…){
块=新块(…);
块。添加(块);
}
公共静态布尔值已碰撞(精灵精灵){
用于(块:块){
如果(sprite.bottomlxblock.bottomlx&&sprite.bottomlyblock.topry){
返回true;
}
}
返回false;
}
}
无论何时创建块
,请使用Block.create()
方法(这意味着注册新块)当你想检查一个精灵是否已经发生冲突时,使用<代码>(块.HasBrimeDead(SoSePrITE))看起来你应该考虑把你的块存储在一个
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;
}
}