2016-04-15 12 views
0

Also, für eine Codierung Zuordnung müssen wir ein Panzerspiel machen. Ich habe diese eine Kugel-Klasse:Machen Sie eine Kugel gegen die gegenüberliegenden Seiten des Bildschirms

package com.MyName.battletanks; 

import com.badlogic.gdx.graphics.g2d.Sprite; 

public class Bullet { 
    public Sprite b; 
public float vx = 0; 
public float vy = 0; 

public Bullet(Sprite temp) { b = temp;} 

public void move() { b.translate(vx*3,vy*3);} 

} 

Meine Variablen sind wie folgt:

Sprite Player1; 
Sprite Player2; 
ArrayList<Bullet> bullets; 

Auf Platz Ein Klick darauf schafft die Kugel mit dieser:

if (Gdx.input.isKeyPressed(Input.Keys.SPACE)) { 
     Bullet bullet = new Bullet(new Sprite(new Texture("Bullet1.png"))); 
     bullet.b.setPosition(Player1.getX() + Player1.getWidth()/2, Player1.getY() + Player1.getHeight()/2); 
     float rotation = (float) Math.toRadians(Player1.getRotation()); 
     bullet.vx = (float) Math.cos(rotation); 
     bullet.vy = (float) Math.sin(rotation); 
     bullets.add(bullet); 
    } 

Nun, hier ist mein Code, um meine Tanks durch eine Seite des Bildschirms zu einem anderen zu gelangen:

if (Player1.getX() > Gdx.graphics.getWidth()){ 
     Player1.setX(-64f); 
    } else if(Player1.getX()<-64f){ 
     Player1.setX(Gdx.graphics.getWidth()); 
    } 
    if (Player1.getY() > Gdx.graphics.getHeight()){ 
     Player1.setY(-64); 
    } else if(Player1.getY() < -64f){ 
     Player1.setY(Gdx.graphics.getHeight()); 
    } 

Jetzt ist Player 1 ein Sprite, aber die Kugeln werden mithilfe einer Arraylist und einer selbst erstellten Bullet-Klasse erstellt. Daher kann ich den Code für Player1, den ich für das Aufzählungszeichen erstellt habe, nicht verwenden. Meine Frage ist also, wie kann ich meine Kugel auf die andere Seite des Bildschirms bringen?

Antwort

1

können Sie den Modulo % Operator verwenden, so etwas zu tun:

bullet.position.x %= Gdx.graphics.getWidth(); 
bullet.position.y %= Gdx.graphics.getHeight(); 

Dies ist nicht getestet, aber es sollte funktionieren. Außerdem habe ich bemerkt, dass du 2 Floats für deine Geschwindigkeit verwendest, und du solltest wirklich Vector2 verwenden, weil du es dann einfach skalieren und normalisieren kannst, was für eine Geschwindigkeit nützlich wäre.

+0

Das x in bullet.x erscheint als rot, egal wo ich es hinstelle, und es gibt mir einen Fehler. Ich bin mir nicht sicher, was ich dagegen tun soll. Der Vektor2 funktionierte jedoch einwandfrei. –

+1

@LucasZ Das liegt daran, dass Sie die Variablen x und y nicht in Ihrer Bullet-Klasse geschrieben haben! Deine Positionen sind in Sprite. Also sollten Sie folgendes tun: bullet.b.setPosition (bullet.b.getX()% Gdx.graphics.getWidth(), bullet.b.getY()% Gdx.graphics.getHeight()); ' – Fish

+0

Wenn das funktioniert Könntest du es als Antwort akzeptieren? :) – Zac

0

Es ist wirklich die gleiche Sache für die Player Klasse und für die Bullet Klasse, da Sie den gleichen Bildschirm-Platz haben, daher können Sie Ihren aktuellen Code wiederverwenden, indem Sie es in eine Funktion, die jedes Sprite nimmt. Diese Funktion würde wie folgt definiert werden:

void fitOnScreen(Sprite sprite) { 
    if (sprite.getX() > Gdx.graphics.getWidth()){ 
     sprite.setX(-64f); 
    } else if(sprite.getX()<-64f){ 
     sprite.setX(Gdx.graphics.getWidth()); 
    } 
    if (sprite.getY() > Gdx.graphics.getHeight()){ 
     sprite.setY(-64); 
    } else if(sprite.getY() < -64f){ 
     sprite.setY(Gdx.graphics.getHeight()); 
    } 
} 

Sie diese Funktion auf der Player sowie Schleife über jede Kugel, wie nennen würde:

fitOnScreen(Player1); 
for (Bullet b: bullets) fitOnScreen(b.b); 
0

Nun, was Sie fragen, ist, wie Sie durchlaufen jede Instanz der Kugeln und ändern ihre Eigenschaften.

Ich muss zustimmen @ Zac Algorithmus würde für eine Kugel gut funktionieren, aber Sie müssen es in eine Schleife setzen, um durch jede einzelne Kugel zu gehen, um effektiv zu sein. Hier

ist ein Beispiel dessen, was Sie in Ihrem render() Methode des Spiels Bildschirm tun könnte:

Iterator<Bullet> it = bullets.iterator(); 
while(it.hasNext()) { 
    Bullet bullet = it.next(); 
    // Now you do the position correction 
    bullet.b.setPosition(bullet.b.getX()%Gdx.graphics.getWidth(), bullet.b.getY()%Gdx.graphics.getHeight()); 
} 

Natürlich gibt es andere Möglichkeiten, dies zu tun, aber das ist wahrscheinlich der einfachste Weg. Sie können den Code, den Sie für Ihren Player verwendet haben, auch in dieser Schleife wiederverwenden.

Beachten Sie auch, dass mit dieser Methode, je mehr Aufzählungszeichen, desto langsamer wird die Anwendung.

Verwandte Themen