Najlepszy sposób na wykrycie dotkniętego obiektu (poruszającego się) z kolekcji w libgdx
To moja pierwsza próba stworzenia gry. Właśnie zacząłem eksperymentować z libgdx i rozumieć różne aspekty programowania gier. Przyjrzałem się przykładowym projektom, rozumiem ogólną architekturę gry libgdx. Ale aby zdobyć podstawy dynamiki gry, zacząłem grać z niskimi poziomami, takimi jak rysowanie prostych kształtów, jak je poruszać, jak radzić sobie z kolizjami.
Więc planowałem napisać martwą prostą grę na Androida (to nawet nie jest na pewno gra). To jest pomysł
1. Create random shapes and make it fly (move)
2. When user touches the shape, it ll explode or hide or play simple animation
3. Has to show Hit & Miss count
Początkowo myślałem o wypróbowaniu koncepcji sceny i aktora libgdx, ale wykluczyłem to bez użycia API sceny. Zacząłem to eksperymentować z różnymi aspektami podstawowej gry i lepiej zrozumieć koncepcje libgdx. Więc stworzyłem tę prostą aplikację, jestem w stanie sprawić, że przedmioty będą przypadkowe.
public class A1GameScreen implements Screen {
OrthographicCamera camera;
ShapeRenderer debugRenderer = new ShapeRenderer();
Array<Rectangle> boxes;
long lastFlew;
int fliesCaught;
A1GameScreen(){
camera = new OrthographicCamera();
camera.setToOrtho(false, 800, 480);
boxes=new Array<Rectangle>();
throwboxes();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
debugRenderer.setProjectionMatrix(camera.combined);
debugRenderer.begin(ShapeType.Line);
for (Rectangle fly : boxes) {
debugRenderer.rect(fly.x, fly.y, fly.width, fly.height);
}
debugRenderer.end();
//Handle the user input
if (Gdx.input.isTouched()){
hit(Gdx.input.getX(),Gdx.input.getY());
}
if (TimeUtils.nanoTime() - lastFlew > 1000000000)
throwboxes();
Iterator<Rectangle> iter = boxes.iterator();
while (iter.hasNext()) {
Rectangle fly = iter.next();
fly.x -= 2;
if (fly.x + 32 < 0)
iter.remove();
}
}
//Method to create flies at random interval
private void throwBoxes(){
Rectangle fly = new Rectangle();
fly.y = MathUtils.random(0, 480 - 32);
fly.x = 800;
fly.width = 32;
fly.height = 32;
boxes.add(fly);
lastFlew = TimeUtils.nanoTime();
}
private boolean hit (float x, float y) {
boolean found=false;
for (Rectangle fly : boxes) {
found = fly.contains(x,y);
if (found){
found = true;
fly.width=100;
break;
}
}
return found;
}
}
Ale nie mogłem znaleźć dotkniętego przedmiotu ze spadających przedmiotów. To właśnie robię, aby dowiedzieć się, czy pole jest w zasięgu dotkniętym
Zapętl wszystkie pola w tablicySprawdź, czy współrzędne dotyku należą do współrzędnych polaPodałem współrzędne dotykowecontains
metodaRectangle
(Box), aby to zrozumiećcoś takiego
for (Rectangle fly : boxes) {
found = fly.contains(x,y);
if (found){
found = true;
fly.width=100;
break;
}
}
Ale to nie działa. Myślę, że zrozumiałem problem. Jego
Pudełko przesuwa 2 klatki na osi x każdej klatki, aby uzyskać efekt lataniaAle zakładam, że niektóre klatki minęły od zdarzenia dotyku. Dlatego nie uzyskuję oczekiwanego rezultatuMoje pytania są
Jak rozwiązać ten problem?Jaki jest najlepszy sposób wykrywania kolizji w libgdx?Aktualizacja
Widzę wiele niedopasowań między współrzędnymi dotyku i współrzędnymi pola. Żadne z pól w zasięgu dotyku. Hows that possible. Poniżej ślad próbki
Touch coords: x-651.0 y-362.0
Fly coords: x-384.0 y-277.0
Fly coords: x-504.0 y-34.0
Fly coords: x-624.0 y-103.0
Fly coords: x-744.0 y-238.0
Touch coords: x-441.0 y-193.0
Fly coords: x-52.0 y-34.0
Fly coords: x-172.0 y-103.0
Fly coords: x-292.0 y-238.0
Fly coords: x-414.0 y-261.0
Fly coords: x-534.0 y-109.0
Fly coords: x-656.0 y-283.0
Fly coords: x-776.0 y-323.0
Touch coords: x-568.0 y-162.0
Fly coords: x-42.0 y-267.0
Fly coords: x-162.0 y-166.0
Fly coords: x-282.0 y-266.0
Fly coords: x-404.0 y-52.0
Fly coords: x-526.0 y-296.0
Fly coords: x-646.0 y-64.0
Fly coords: x-766.0 y-16.0