Die hoffentlich letzte Frage meinerseits, bei der ich auch trotz Suchen in der Hilfe und rumprobieren noch keine Lösung gefunden habe... In einem Raum mit schwarzem Hintergrund hab ich 20 Objekte platziert und default visible auf false gesetzt. Nun möchte ich gern, dass sie nach und nach erscheinen und sich dann jeweils an per Zufall generierte Koordinaten bewegen. So wie ich es bislang probiert habe, erscheinen sie nicht mal (außer ich setze noch ein wait(100) oder so dahinter bevor ich sie invisible mache, also scheint das ganze move nicht zu funktionieren?):
obwohl ich sie in einem sichtbaren Bereich eingefügt habe und das ganze Zimmer als walkable area markiert habe. Irgendeine Idee was ich hier falsch mache? Ach ja, meine Idee dahinter ist, dass man die Objekte mit der Maus anklicken kann und es dann für jeden Klick einen Punkt gibt, daher hab ich noch bei jedem Objekte als AnyClick Aktion GivePoint(1) hinterlegt.
if (i > -1 && object[i].Moving) return; else { if (i > -1) object[i].Visible = false; if (i < 20) { i++; object[i].Visible = true; object[i].Move(Random(640), Random(480), Random(3) + 1, eNoBlock, eAnywhere); } }
Das sollte alles sein, die AnyClickOns werden nicht benötigt. Wenn man denkt, man muss ca. 20x das Gleiche machen, um einen Effekt zu erzielen, muss man es in der Regel nicht 20x machen.
Edit: Fehler im Code korrigiert.
_________________ Use gopher repellent on funny little man
Zuletzt geändert von KhrisMUC am 07.12.2011, 18:10, insgesamt 2-mal geändert.
erstmal vielen Dank für die Antwort! Ja, das dachte ich auch, hab aber immer eine Fehlermeldung bekommen wegen unbekanntem Objektnamen (undefined token). Ich schätze mal das an der ersten Stelle wo ich teste of Objekt o00[i] geklickt ist, i ja noch nicht bekannt ist bzw. auf -1 steht... und ein Objekt o00-1 gibt es ja nicht, nur o001 bis o019 .... (es ist übrigens ein kleines Oh, gefolgt von einer bzw. zwei nullen)
Noch nen Tipp? Danke danke!!
Code:
function room_AfterFadeIn() { //blabla einleitungstext } function room_Load() { int i = -1; }
function room_RepExec() { if (mouse.IsButtonDown(eMouseLeft) && GetLocationType(mouse.x, mouse.y) == eLocationObject) { GiveScore(1); o00[i].StopMoving(); // -> hier kommt die Fehlermeldung undefined Token! }
if (i > -1 && o00[i].Moving) return; else { object[i].Visible = false; if (i < 20) { i++; o00[i].Visible = true; o00[i].Move(Random(640), Random(480), Random(3) + 1, eNoBlock, eAnywhere); } } }
Registriert: 14.03.2005, 01:55 Beiträge: 4638 Wohnort: München
In der Zeile nach dem else hat noch "if (i > -1)" gefehlt.
Ansonsten sollte es jetzt funktionieren, aber nur mit "object", nicht mit o0XX.
Es ist egal, ob Du Deine Objekte o1, o2, usw. oder o001, o002 usw. nennst; diese Namen können nicht durchgezählt werden. o1 oder o001 ist nicht dasselbe wie o00[1]. o001 ist ein eigenständiger Name, wie oSchrank, während o00[1] das zweite Element des Arrays o00 ist (den es nicht gibt).
Genau deswegen habe ich auch object[i] verwendet, den internen Array von AGS, der auf die Objekte des momentan geladenen Raumes zeigt. Somit kann ich die Objekte ansprechen (und vor allem durchgehen), ohne ihre Namen zu kennen. Der index fängt übrigens bei Null an, das erste Objekt wird über object[0] angesprochen. Wenn Du also insgesamt 19 Objekte hast, muss die "20" in meinen Code noch durch eine "19" ersetzt werden.
Ich hab den Code in meinem vorherigen Beitrag korrigiert; probier es nochmal damit, ohne sonstige Änderungen(!).
_________________ Use gopher repellent on funny little man
Gut, ich kann dann i einfach in dem Bereich neu auf -1 setzen...
Eigentlich war die Idee dass das Spiel erst zu Ende ist wenn alle 20 Objekte einmal durchs Bild gelaufen sind und wieder unsichtbar geworden sind. Hab nur keine Ahnung wie ich dann wieder zum Hauptroomscript zurückkommen kann? Hmm doch alles komplizierter als ich dachte leider...
Registriert: 14.03.2005, 01:55 Beiträge: 4638 Wohnort: München
Würdest Du bitte mit den eigenmächtigen Änderungen aufhören...?
Wenn ich schreibe,
Code:
int i = -1; // Diese Zeile über der Funktion, nicht drin!
wieso setzt Du das dann in room_Load!? Das hätte ich doch erwähnt und die Zeile eingerückt, genau wie beim restlichen Code.
Wenn ich i innerhalb einer Funktion deklariere, verliert es seinen Wert, sobald die Funktion einmal durchgelaufen ist. Deswegen muss es außerhalb aller Funktionen deklariert werden; dann behält es seinen Wert, sogar nach einem Raumwechsel.
Sinnvoll wäre also höchstens:
Code:
int i;
function room_Load() { i = -1; }
...
Dann würde bei jedem Betreten das Bewegen der Objekte von vorne losgehen.
_________________ Use gopher repellent on funny little man
Würdest Du bitte mit den eigenmächtigen Änderungen aufhören...?
Wenn ich schreibe,
Code:
int i = -1; // Diese Zeile über der Funktion, nicht drin!
wieso setzt Du das dann in room_Load!? Das hätte ich doch erwähnt und die Zeile eingerückt, genau wie beim restlichen Code.
Oh okay... ich hatte das so verstanden "über der Funktion, nicht drin", dass es halt nicht in die Funktion repeatly execute muss sondern am Beginn, also wenn man in den Raum reinkommt, geladen werden muss. Daher hatte ich das dann fälschlicherweise in room_Load gesetzt und nicht bedacht, dass es ja dann einfach nur in einer anderen Funktion steht.
Registriert: 14.03.2005, 01:55 Beiträge: 4638 Wohnort: München
Wie schon ein gutes Stück weiter oben erwähnt, muss die Zeile nach dem else so aussehen:
Code:
if (i > -1) object[i].Visible = false;
Die Bedingungen beider ifs am Anfang von RepExec sind nämlich false, deswegen wird direkt zu Anfang der else-Block ausgeführt. Da aber i noch -1 ist, sollte es eigentlich einen Fehler geben, wenn versucht wird, object[-1].Visible anzusprechen. Da Du diesen Fehler nicht bekommst, liegt es nahe, dass die room_RepExec überhaupt nicht ausgeführt wird.
Ich hatte genug vom Blindflug und hab den code mal in ein Default game eingefügt. Der einzige Fehler war mouse.IsButtonPressed statt IsButtonDown, der Rest lief allerdings einwandfrei.
Ist die room_RepExec ordnungsgemäß in den room events verlinkt?
_________________ Use gopher repellent on funny little man
Mitglieder in diesem Forum: Exabot [Bot] und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.