The Night of the Rabbit
Aktuelle Zeit: 20.06.2013, 01:41

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 28.11.2011, 22:15 
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Benutzeravatar

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


Nach oben
 Profil  
 
BeitragVerfasst: 04.12.2011, 22:00 
Adventure-Gott
Adventure-Gott
Benutzeravatar

Registriert: 14.03.2005, 01:55
Beiträge: 4638
Wohnort: München
Object.Move ist nicht-blockend, d.h. der .Visible = false; Befehl wird unmittelbar nach .Move ausgeführt, nicht erst am Ende der Bewegung.

Code:
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.

_________________
Use gopher repellent on funny little man




Zuletzt geändert von KhrisMUC am 07.12.2011, 18:10, insgesamt 2-mal geändert.


Nach oben
 Profil  
 
BeitragVerfasst: 05.12.2011, 16:10 
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Benutzeravatar

Registriert: 13.10.2004, 10:28
Beiträge: 51
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[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);
    }
  }
}


Nach oben
 Profil  
 
BeitragVerfasst: 06.12.2011, 03:17 
Adventure-Gott
Adventure-Gott
Benutzeravatar

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


Nach oben
 Profil  
 
BeitragVerfasst: 06.12.2011, 18:40 
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Benutzeravatar

Registriert: 13.10.2004, 10:28
Beiträge: 51
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:
  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...


Nach oben
 Profil  
 
BeitragVerfasst: 07.12.2011, 13:53 
Adventure-Gott
Adventure-Gott
Benutzeravatar

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


Nach oben
 Profil  
 
BeitragVerfasst: 07.12.2011, 14:03 
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Benutzeravatar

Registriert: 13.10.2004, 10:28
Beiträge: 51
KhrisMUC hat geschrieben:
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.


Nach oben
 Profil  
 
BeitragVerfasst: 07.12.2011, 15:52 
Adventure-Gott
Adventure-Gott
Benutzeravatar

Registriert: 14.03.2005, 01:55
Beiträge: 4638
Wohnort: München
Schon klar, gefährliches Halbwissen halt.

Funktioniert's denn jetzt?

_________________
Use gopher repellent on funny little man


Nach oben
 Profil  
 
BeitragVerfasst: 07.12.2011, 16:50 
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Benutzeravatar

Registriert: 13.10.2004, 10:28
Beiträge: 51
Nein, ich hab nen schwarzen Hintergrund, die Musik startet und weiterhin passiert einfach gar nichts. Keine sichtbaren Objekte...

Code:
// 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);
    }
  }
}


Nach oben
 Profil  
 
BeitragVerfasst: 07.12.2011, 18:10 
Adventure-Gott
Adventure-Gott
Benutzeravatar

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


Nach oben
 Profil  
 
BeitragVerfasst: 07.12.2011, 19:04 
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Benutzeravatar

Registriert: 13.10.2004, 10:28
Beiträge: 51
Ja, großartig, jetzt läuft alles! room_RepExec war nicht vernünftig verlinkt!

Vielen Dank für deine Hilfe :)


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

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.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de