Objekte im Raum an zufällige Koordinaten bewegen lassen

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Jones
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 51
Registriert: 13.10.2004, 10:28

Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von Jones »

Hey Leute!

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?):

Code: Alles auswählen

 int randx;
     int randy;
     int randspeed;
     
     randx = Random(640);
     randy = Random(460);
     randspeed = Random(4);
     o001.Visible = true;
     o001.Move(randx, randy, randspeed);
     o001.Visible = false;
     randx = Random(640);
     randy = Random(460);
     randspeed = Random(4);
     o002.Visible = true;
     o002.Move(randx, randy, randspeed);
     o002.Visible = false;
etc.
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.

Vielen Dank schonmal für jeden Tipp!
Jones
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von KhrisMUC »

Object.Move ist nicht-blockend, d.h. der .Visible = false; Befehl wird unmittelbar nach .Move ausgeführt, nicht erst am Ende der Bewegung.

Code: Alles auswählen

int i = -1;  //  Diese Zeile über der Funktion, nicht drin!

// room's repeatedly_execute

  if (mouse.IsButtonDown(eMouseLeft) && GetLocationType(mouse.x, mouse.y) == eLocationObject) {
    GiveScore(1);
    object[i].StopMoving();
  }

  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.
Zuletzt geändert von KhrisMUC am 07.12.2011, 17:10, insgesamt 2-mal geändert.
Use gopher repellent on funny little man
Benutzeravatar
Jones
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 51
Registriert: 13.10.2004, 10:28

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von Jones »

Hey,

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 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: Alles auswählen

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);
    }
  }
}
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von KhrisMUC »

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 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
Benutzeravatar
Jones
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 51
Registriert: 13.10.2004, 10:28

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von Jones »

Das ist ja supercool, das mit dem object wusste ich noch gar nicht!!

Jetzt klappt es beinah, es kommt noch die Meldung dass i unbekannt ist, direkt hier beim if im Bereich repeatedly execute:

Code: Alles auswählen

  if (i > -1 && object[i].Moving) return;

  else {
    object[i].Visible = false;
    if (i < 20) {
      i++;
      object[i].Visible = true;
      object[i].Move(Random(640), Random(480), Random(3) + 1, eNoBlock, eAnywhere);
    }
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...
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von KhrisMUC »

Würdest Du bitte mit den eigenmächtigen Änderungen aufhören...?

Wenn ich schreibe,

Code: Alles auswählen

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: Alles auswählen

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
Benutzeravatar
Jones
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 51
Registriert: 13.10.2004, 10:28

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von Jones »

KhrisMUC hat geschrieben:Würdest Du bitte mit den eigenmächtigen Änderungen aufhören...?

Wenn ich schreibe,

Code: Alles auswählen

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.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von KhrisMUC »

Schon klar, gefährliches Halbwissen halt.

Funktioniert's denn jetzt?
Use gopher repellent on funny little man
Benutzeravatar
Jones
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 51
Registriert: 13.10.2004, 10:28

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von Jones »

Nein, ich hab nen schwarzen Hintergrund, die Musik startet und weiterhin passiert einfach gar nichts. Keine sichtbaren Objekte...

Code: Alles auswählen

// room script file
int i = -1;

function room_AfterFadeIn()
{

     aMusik.Play(eAudioPriorityNormal, eRepeat);
     
     if (i == 20){
          cCharakter.ChangeRoom(9);
          cCharakter.Transparency = 0;
     }
     
}

function room_Load()
{
      cCharakter.Transparency = 100;
}

function room_RepExec()
{
if (mouse.IsButtonDown(eMouseLeft) && GetLocationType(mouse.x, mouse.y) == eLocationObject) {
    GivePoints(1);
    object[i].StopMoving();        
  }

  if (i > -1 && object[i].Moving) return;

  else {
    object[i].Visible = false;
    if (i < 20) {
      i++;
      object[i].Visible = true;
      object[i].Move(Random(640), Random(480), Random(3) + 1, eNoBlock, eAnywhere);
    }
  }
}
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von KhrisMUC »

Wie schon ein gutes Stück weiter oben erwähnt, muss die Zeile nach dem else so aussehen:

Code: Alles auswählen

    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
Benutzeravatar
Jones
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 51
Registriert: 13.10.2004, 10:28

Re: Objekte im Raum an zufällige Koordinaten bewegen lassen

Beitrag von Jones »

Ja, großartig, jetzt läuft alles! room_RepExec war nicht vernünftig verlinkt!

Vielen Dank für deine Hilfe :)
Antworten