私はオブジェクト "ブロック"のインスタンスをたくさん持っている、私はスプライトがブロックに触れているかどうかを確認するために衝突検出を追加する必要があります。しかし、それぞれのレベルで約200個のブロックがあるので、それぞれのコードをコピーして貼り付けて編集するのにはかなりの時間がかかります...ここでは衝突検出があります。最初のブロックの場合は 'block.bottomry'、2番目のブロックの場合は 'block2.bottomry'、3番目の 'block3.bottomry'の場合などはすべてのブロックが行った。コードの一部は次のとおりです。オブジェクトのインスタンスごとにループを作成できますか?
0
A
答えて
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!!!!!!!!!!!!");
}
}
}
}
EDIT:より具体的な例。
0
私があなたから質問を受けるのは、ブロックが固定されており、スプライトが動いている/浮いていることです。ブロックは固定されているので、それらを配列に配置し、この衝突ロジックをfor-eachループの内側に置くことができます。
もう1つのポイントは、ブロックがスプライトの上、下、前、または後にあり、コリジョンロジックがそれぞれ異なることです。ブロックオブジェクトでは、位置を設定し、for-eachループでもその位置をチェックできます。
私はあなたがしたいパターンをブロックし、「登録」を作成し、「ファクトリメソッド」と呼ばれ
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()
を使用しますメソッド(これは新しいブロックが登録されたことを意味します)
スプライトが衝突したかどうかをチェックしたいときはいつでも使用してくださいif (Block.hasCollided(someSprite))
ブロックを[コレクション](http://docs.oracle.com/ .com/javase/tutorial/collections/intro/index.html) – Richante