Gerichtete Schüsse - Android Spieleentwicklung

ui_3k1

ui_3k1

Gesperrt
197
Hallo,
ich habe mich heute mal etwas mit der "Mechanik", die hinter einem Schuss steckt, befasst und möchte hier kurz meine Erfahrungen mitteilen.

Vorweg: dieser Beitrag ist keinesfalls als Anleitung zu verstehen. Wer mit der Spieleprogrammierung ganz am Anfang steht, wird hier keine nützlichen Infos finden. Daher richtet sich der Beitrag eher an Leute, die bereits ein grobes Framework programmiert haben und dieses um eine Funktion erweitern möchten.

In meinem Spiel wird ein Sprite über die Neigung des Geräts gesteuert - besser gesagt: rotiert.
Ziel ist es in die jeweilige "Blickrichtung" des Sprites eine Kugel abzufeuern.

Dazu habe ich den SensorEventListener so implementiert:

Die Activity bekommt als Interface SensorEventListener angehängt und die ersten Variablen werden angelegt:
Code:
public static final int SENSOR_SENSIBILITY = 9; // Genauigkeit des Sensors einstellen (je hoeher, desto empfindlicher)
    private SensorManager sensorManager = null;
    int deviceY_Angular;
Die Methoden werden aufgerufen, sobald es Änderungen am Sensor gibt (in meinem Fall wird nur die Y-Achse ausgelesen)
Code:
@Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    /**Aktualisiert den Neigungswert, den das Geraet erfaehrt.*/
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        synchronized (this) {
            if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                deviceY_Angular = (int) (sensorEvent.values[1] * SENSOR_SENSIBILITY);
            }
        }
    }

    /**Gibt den Neigungswert, den das Geraet erfaehrt, zurueck.*/
    public int getSensorsY() {
        return deviceY_Angular;
    }
Wichtig ist hierbei zuvor den Listener zu aktivieren, bevor man das Spiel beginnt - und ggf. wieder zu deaktivieren, wenn eine Session zu ende ist.
Diese Methoden werden also vor bzw nach dem eigentlichen Spiel aufgerufen.
Code:
/**Initialisiert den Sensor vor einem Spielstart*/
    private void initializeSensor() {
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_NORMAL); // Den SensorManager registrieren
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_NORMAL); // ... hier weiter zur Orientierung
    }

    /**Schaltet den Sensor nach einem Spiel ab*/
    private void disableSensor() {
        sensorManager.unregisterListener(this);
    }
[...]
Hier sollten Datentypen wie "Sprite", "Bullet", und "GameView" oder Vergleichbare implementiert sein.
In meinem Fall bekommt der Sprite die Rotationswerte des Sensors übergeben.
Schließlich muss noch eine Funktion im Programm ablaufen, die den Sprite schießen lässt - zB ein Bullet-Konstruktor). In diese Funktion kann der Rotationswert als Parameter übergeben werden und schließlich wird ein Kugel-Objekt erzeugt (und beispielsweise in einer Liste speichert).

Der eigentliche Kern des Beitrags:

Nun werden die einzelnen Bullet-Objekte mit dieser Funktion "bewegt", (diese Methode sollte in einer update- oder draw-Methode (bzw. Vergleichbares) aktualisiert und auf dem Canvas dargestellt werden):

Code:
/* MOVEMENT */
    /**Versetzt die Kugeln mit Geschwindigkeit*/
    private void letBulltesFly() {    
        // Funktion erlaubt Schuesse in eine beliebige Richtung abzugeben. 
        // [COLOR=Red]Wichtig:[/COLOR] Umrechnung von Grad in Radianten ( * 0.0174532925)
        posBtX += ((float)Math.cos((rotation+90)*0.0174532925)*velocity);
        posBtY += ((float)Math.sin((rotation+90)*0.0174532925)*velocity);    
    }
An dieser Stelle nochmal die Anmerkung, dass die Umrechnung von Grad in Radianten nötig ist um eine saubere Darstellung zu gewährleisten. Die "+90" bewirken bei mir eine Verschiebung der Schussachse um 90 Grad nach rechts, da sich mein Gerät im Landscape-Modus befindet, wenn das Spiel gestartet wird.

Beste Grüße
Martin
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: finnq

Ähnliche Themen

M
  • merlin1234x
Antworten
1
Aufrufe
1.032
wilco
W
CrazyC
Antworten
0
Aufrufe
728
CrazyC
CrazyC
CrazyC
Antworten
0
Aufrufe
1.394
CrazyC
CrazyC
Zurück
Oben Unten