Der beste Weg, um das berührte Objekt (das sich bewegt) aus der Sammlung in libgdx zu erkennen
Dies ist mein erster Versuch in der Spieleentwicklung. Ich habe gerade angefangen, mit libgdx zu experimentieren und die verschiedenen Aspekte der Spielprogrammierung zu verstehen. Ich habe mir die Beispielprojekte angesehen und kann die Gesamtarchitektur des libgdx-Spiels verstehen. Aber um die Grundlagen der Spieldynamik zu erlernen, begann ich mit einfachen Dingen zu spielen, wie man einfache Formen zeichnet, wie man sie bewegt, wie man mit Kollisionen umgeht.
Also plante ich, ein einfaches Android-Spiel zu schreiben (es ist nicht einmal ein Spiel, das sicher ist). Das ist die Idee
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
Anfangs dachte ich daran, libgdx stage & actor concept auszuprobieren, schloss dies jedoch aus, um auf die Szenen-API zu verzichten. Und ich habe damit begonnen, mit verschiedenen Aspekten des grundlegenden Spielens zu experimentieren und die Konzepte hinter libgdx besser zu verstehen. Also habe ich diese einfache App gemacht, mit der ich Objekte zufällig fallen lassen kann.
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;
}
}
Aber ich konnte den berührten Gegenstand nicht an den herabfallenden Gegenständen erkennen. Dies ist, was ich mache, um herauszufinden, ob die Box in Reichweite berührt wird
Durchlaufen Sie alle Felder im ArrayÜberprüfen Sie, ob die Berührungskoordinaten innerhalb der Boxkoordinaten liegenIch habe Berührungskoordinaten an übergebencontains
Methode derRectangle
(Box), um das herauszufindenetwas wie das
for (Rectangle fly : boxes) {
found = fly.contains(x,y);
if (found){
found = true;
fly.width=100;
break;
}
}
Aber es funktioniert nicht. Ich denke, ich habe das Problem herausgefunden. Es ist
Die Box bewegt sich in jedem Frame um 2 Pixel in der x-Achse, um einen fliegenden Effekt zu erzielenAber ich gehe davon aus, dass einige Frames seit dem Berührungsereignis vergangen sind. Deshalb erhalte ich nicht das erwartete ErgebnisMeine Fragen sind
Wie kann man dieses Problem lösen?Was ist der beste Weg, um Kollisionen in libgdx zu erkennen?Aktualisieren
Ich sehe viele Unstimmigkeiten zwischen den Berührungskoordinaten und den Boxkoordinaten. Keine der Boxen im Touch-Bereich. Wie ist das möglich? Unterhalb der Probenspur
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