#android #разработка_игр #libgdx
Делаю простенькую игрушку. Логика заключается в том, что у левого края экрана стоит объект, назовем его человеком для удобства. У правого края хаотичным образом спавнятся другие объекты, для удобства, назовем их зомби. Человек убивает их из постоянно стреляющего автомата, "пули" которого при пересечении с "зомби" должны удалять "зомби" с экрана. Проблема заключается в том, что эти "пули" просто пролетают мимо "зомби". То-есть, я не могу отследить пересечения рендеров "пуль" и "зомби". Как я понял, проблема в многочисленном объявлении Rectangle-ов "зомби" и "пуль", что приводит к неразберихе в коде и той проблеме, что у меня, в частности. Есть ли возможность объявить его только 1 раз и потом всюду использовать? Если да, то как? Кстати, просто объявить его на уровне на уровне класса, как тот же Rectangle человека не получается, ибо вылетает NullPointerException, со ссылкой на spawncrowd и spavbullet. Заранее спасибо_) import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.math.Rectangle; import java.util.Iterator; public class MyGdxGame extends ApplicationAdapter { OrthographicCamera camera; SpriteBatch batch; Texture manImage, bulletImage, CrowdImage; Rectangle manRect; Vector3 touchPos; ArraybulletsArray, CrowdElemArray; long lastbultime, lastcrowdeltime; int counter_miss; @Override public void create () { camera = new OrthographicCamera(); camera.setToOrtho(false, 960, 540); touchPos = new Vector3(); batch = new SpriteBatch(); manImage = new Texture("man.jpg"); bulletImage = new Texture("bullet.jpg"); CrowdImage = new Texture("Crowd.jpg"); manRect = new Rectangle(); manRect.x = 0; manRect.y = 540/2; manRect.height = 256; manRect.width = 256; CrowdElemArray = new Array (); spawncrowdel(); bulletsArray = new Array (); spawnbullet(); } public void spawncrowdel() { Rectangle CrowdelementRect = new Rectangle(); CrowdelementRect.y = MathUtils.random(0, 540-256); CrowdelementRect.x = 960; CrowdelementRect.height = 256; CrowdelementRect.width = 64; CrowdElemArray.add(CrowdelementRect); lastcrowdeltime = TimeUtils.nanoTime(); } public void spawnbullet() { Rectangle bulletRect = new Rectangle(); bulletRect.y = manRect.getY() + manRect.height/2; bulletRect.x = manRect.getX(); bulletRect.height = 256; bulletRect.width = 64; bulletsArray.add(bulletRect); lastbultime = TimeUtils.nanoTime(); } @Override public void render () { Gdx.gl.glClearColor(0, 1, 0.5f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); camera.update(); batch.setProjectionMatrix(camera.combined); batch.begin(); batch.draw(manImage, manRect.x, manRect.y); for (Rectangle CrowdelementRect: CrowdElemArray) batch.draw(CrowdImage, CrowdelementRect.x, CrowdelementRect.y); for (Rectangle bulletRect: bulletsArray) batch.draw(bulletImage, bulletRect.x, bulletRect.y); batch.end(); // Сенсорное урправление if (Gdx.input.isTouched()){ touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0); camera.unproject(touchPos); manRect.y = (int) (touchPos.y - 128/2); } if (Gdx.input.isKeyPressed(Input.Keys.UP)) manRect.y += 200 * Gdx.graphics.getDeltaTime(); if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) manRect.y -= 200 * Gdx.graphics.getDeltaTime(); if (manRect.y < 0) manRect.y = 0; if (manRect.y > 540-256) manRect.y = 540-256; //TODO Спавнинг зомби if (TimeUtils.nanoTime() - lastcrowdeltime > 2000000000) spawncrowdel(); //TODO Спавнинг пули if (TimeUtils.nanoTime() - lastbultime > 800000000) spawnbullet(); //TODO Движение зомби Iterator move = CrowdElemArray.iterator(); while (move.hasNext()){ Rectangle CrowdelementRect = new Rectangle(); CrowdelementRect = move.next(); CrowdelementRect.x -= 100 * Gdx.graphics.getDeltaTime(); if (CrowdelementRect.x <= 10) { counter_miss += 1; move.remove(); } if (CrowdelementRect.overlaps(manRect)) move.remove(); } //TODO Движение пули Iterator movebul = bulletsArray.iterator(); Rectangle CrowdelementRect = new Rectangle(); while (movebul.hasNext()){ Rectangle bulletRect = movebul.next(); bulletRect.x += 100 * Gdx.graphics.getDeltaTime(); if (bulletRect.x > 960) { movebul.remove(); } if (bulletRect.overlaps(CrowdelementRect)) movebul.remove(); } } @Override public void dispose() { super.dispose(); CrowdImage.dispose(); manImage.dispose(); bulletImage.dispose(); batch.dispose(); } } ` PS Делал все по шаблону со "стартандроида".
Ответы
Ответ 1
Решение взято отсюда. Человек решает аналогичную задачу через следующий код: private void testCollision() { Iteratorb = ball.iterator(); while(b.hasNext()) { Bullet balls = b.next(); Iterator i = enemy.iterator(); while(i.hasNext()) { Enemy enemies = i.next(); if ((Math.abs(balls.x - enemies.x) <= (balls.width + enemies.width) / 2f) && (Math.abs(balls.y - enemies.y) <= (balls.height + enemies.height) / 2f)) { i.remove(); b.remove(); } } } } когда-то пробовал сам - у меня работало. Ответ 2
В классе Rectangle есть метод overlaps(Rectangle anotherRectangle) У путль есть массив и у "зомби" есть массив. Прогоняем массив пуль, если координата X пули < (screenWidth - zimbieWidth), то проверяем следующую пулю. Если условие не верно то данную пулю гоним по массиву зомби, где выполняем: for (int i = 0; i < zombies.size; i++) { if (bullet.overlaps(zombie.get(rect)[i])) { bullet.destroy(); zombie.destroy(); } }
Комментариев нет:
Отправить комментарий