2016-06-11 11 views
1

Ich habe dieses Sprite: spr_meteoriteLv3, die zwei Teilbilder mit Index image_index 0 und 1 hat.Game Maker - Maus Klicken Sie auf image_index Überprüfung

Ich habe diese Objekte: obj_meteoriteLv3, obj_tempMeteoriteLv3 und obj_score. Objekt obj_meteoriteLv3 erscheint von oben mit zufälliger Position, zufälliger Menge und zufälligem Unterbild. Objekt obj_tempMeteoriteLv3 macht obj_meteoriteLv3 s spawn. Wenn der Spieler auf einen Meteoriten klickt, überprüft das Programm den Wert image_index für dieses Objekt.

obj_meteoriteLv3 hat diese Ereignisse:

Event erstellen: Änderung sprite_index in spr_meteoriteLv3 und beginnen nach unten zu bewegen.

Links gedrückt Mausereignis: zerstören die self Instanz und überprüfen image_index: wenn image_index == 0 dann score += 5; sonst score -= 5).

obj_tempMeteoriteLv3 hat diese Ereignisse:

Event erstellen: set Alarm 0-3600, Variable exist auf 1 und variable add bis 1.

Alarm 0 gesetzt: Variable add zu 0, und zerstöre die obj_meteoriteLv3 Instanz.

Alarm 1: Setvariable exist auf 1

Schritt Ereignis: wenn (exist == 1) dann, wenn (add == 1) dann Instanz obj_meteoriteLv3 erstellen, setzen variable exist auf 0 und eingestellt Alarm 1 bis 10.

obj_score hat diese Ereignisse:

Ereignis erstellen: set score zu 0.

Zeichnen Ereignis: Zeichnen Sie den Wert score.

Das Problem ist, egal welches Teilbild der Meteorit image_index hat, wenn er angeklickt wird, wird der Punktestand immer um 5 Punkte erhöht. Es ist wie die else Bedingung funktioniert nicht. Wie kann ich das beheben? Bitte erläutern Sie Ihre Antwort. Vielen Dank.

Ich füge ein paar Bilder zum besseren Verständnis. Link 1. Link 2

Antwort

2

In obj_meteoriteLv3 ist es vor zerstört es den Rest der Codeblöcke ausführen kann. Verschiebe "Instanz zerstören" nach unten.

In obj_tempMeteoriteLv3 beide Variablen "add" und "existieren" nicht notwendig sind, statt

ereignis-

Alarm erstellen haben- [0] = 3600

Alarm [1] = 10

Alarm [0] Event-

destroy_instance

Alarm [1] Ereignis

Create_instance von obj_meteoriteLv3

Alarm [1] = 10

+0

Zuerst möchte ich sicherstellen Ich mache es richtig. Ich verschiebe alle 'image_index'-Prüfbedingungen auf' Destroy Event'. Also, ich habe nur "Destroy-Instanz" -Aktion in "Links-gedrücktes Mausereignis". Meinst Du das? Das Programm funktioniert nicht richtig. Ich habe den Meteoriten nicht angeklickt, aber der Punktestand ist inkrementiert. Auch wenn der Cursor nicht über dem Meteoriten schwebt, wird die Punktzahl erhöht. –

+0

Es erzielte, wenn sie out-of-bounds sind, missverstanden. Verschiebe alles im Destroyer Event zurück zum Linksklick Event und verschiebe "Destroy instance" ganz nach unten – William

+0

Ich habe das ausprobiert und es hat keinen Unterschied. Wenn ich das Alarmereignis nach 2 Minuten benutze, hören die Meteoriten nicht auf zu laichen. Also habe ich var 'add' und' exist' verwendet –

0

Potenziell, wenn Sie klicken, wird jeder einzelne Meteoriten ausgelöst . Auf der linken Maustaste Ereignis des Meteoriten, Sie haben nicht überprüft, ob der Cursor auf dem Sprite war. Sie müssen die Funktion position_meeting verwenden, an die Sie die Mausposition und die Instanz zum Klicken übergeben. es würde so aussehen:

if (position_meeting(mouse_x, mouse_y, id)) 
{ 
    //your destroy code 
} 

Wenn darüber hinaus die instance_destroy(); Zeile wird gelesen, der folgende Code wird ignoriert und das Programm springt zum destroy_event. William erklärte es gut und schlug vor, die Reihenfolge der Codezeilen zu ändern, aber Sie können auch die Punktzahl im Destroyer-Event direkt ändern.

Ich möchte hinzufügen, dass die Überprüfung auf Klicks in jedem Fall der Meteoriten nicht optimal für Leistungen ist.

Meine Empfehlung wäre, ein einzelnes Objekt zu verwenden, um auf Klicks zu prüfen (zum Beispiel Ihren Player oder Ihren Meteoriten-Spawner), in dem Sie nach Klicks suchen würden, und wenn Sie einen Meteoriten berühren würden . Und in diesem Fall würden Sie die Punktzahl erhöhen und das Sprite überprüfen.

Ihr Click-Ereignis würde wie folgt aussehen:

with (instance_position(mouse_x, mouse_y, obj_meteoriteLv3)) 
{ 
    instance_destroy(); 
} 

und in dem Meteoriten zerstört Ereignis, Sie würden die image_index überprüfen und die Partitur entsprechend ändern.

EDIT: warum die Partitur nicht

ändert Ich glaube, Sie nicht die Partitur als globale Variable deklariert haben, aber als Instanzvariable. Wenn Sie also "score = ..." in ein anderes Objekt schreiben, wird eine neue Bewertungsvariable erstellt, die nichts mit dem Präzedenzfall zu tun hat.

Sie haben 2 Möglichkeiten:

1 - Erklären Sie die Partitur eine globale Variable im schaffen Fall obj_score:

globalVar Partitur;
score = // Ihre Ausgangsnote

Beachten Sie, dass eine globale Variable nicht gesetzt werden kann, auf sie Initialisierung Linie ist.

2 - Ändern Sie die Punktzahl durch die Partitur Objekt:

, wenn die Punktzahl ändern muss:

obj_score.score = ...

+0

Ich habe versucht, die Methode in diesem [link] zu verwenden (http://gamedev.stackexchange.com/questions/121723/game-maker-studio-check-collision- mit Unterbildern). Die Methode ist fast gleich wie das, was Sie gesagt haben. Aber es funktioniert nicht. –

+0

Könnten Sie bitte erklären, auf welche Weise es nicht funktioniert, beschreiben Sie, was passiert, das sollte nicht? –

+0

Sowohl in meiner Frage oben als auch in dem Link, den ich gab, hatte ich mein Problem erklärt. Im Link können Sie meinen ersten Kommentar sehen. –

Verwandte Themen