Beste Lösung "Behältniss öffnen und etwas rausnehmen&qu

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
DernetteEddy
Süßwasserpirat
Süßwasserpirat
Beiträge: 298
Registriert: 30.06.2004, 00:31

Beste Lösung "Behältniss öffnen und etwas rausnehmen&qu

Beitrag von DernetteEddy »

Hi,

mich würde mal interessieren wie ihr das so macht. Ich habe ein Behältniss (X). Wenn es geöffnet wird, soll ein Gegenstand (Y) erscheinen. Y soll man nehmen können. Ebenfalls soll Y 'sichtbar' verschwinden. Danach soll man X wieder öffnen und schließen können ohne das Y irgendwie wieder auftaucht.
Meine Variante ist mit 3 Objekten und 2 Hotspots und wie ich finde sehr kompliziert. Zusätzlich funktionierts noch nicht mal :-)
Mir raucht langsam der Kopf und bevor ich alles mögliche ausprobiere, wäre es hilfreich, wenn ihr mir hier einen Vorschlag machen könntet.

Gruß

Eddy
Mit * markierte Felder sind erforderlich
Benutzeravatar
Rocco
Adventure-Treff
Adventure-Treff
Beiträge: 1019
Registriert: 25.11.2003, 16:20
Wohnort: Ronville
Kontaktdaten:

Beitrag von Rocco »

hier der code für den kühlschrank in meiner episode:

Code: Alles auswählen

if (MovePlayer (250, 130))
{
  FaceDirection (GetPlayerCharacter (), DIR_UP);
  
  if (UsedAction (A_PICK_UP))
  {
      Wait (5);
      UseView(DIR_UP);
      DisplaySpeech(GetPlayerCharacter(),"Also dafür schlucke ich zuwenig Stereoide!");
  }
else if (UsedAction (A_OPEN))
  {
      Wait (5);
      UseView(DIR_UP);
      
      if((character[GetPlayerCharacter()].inv[15] == 0) && (character[GetPlayerCharacter()].inv[16] == 0) && (character[GetPlayerCharacter()].inv[23] == 0) && (character[GetPlayerCharacter()].inv[25] == 0) && (character[GetPlayerCharacter()].inv[26] == 0)) 
      ObjectOn(4);
      
      ObjectOn(1);
      PlaySound(66);
      DisplaySpeech(GetPlayerCharacter(),"Mann der geht schwer auf, letztens musste ich gar das Brecheisen verwenden, um das Kühlfach aufzukriegen.");
  }
else if (UsedAction (A_LOOK_AT))
  {
      Wait (5);
      DisplaySpeech (GetPlayerCharacter (), "Das alte Mistding klemmt die meiste Zeit.");
        
  }
else Unhandled ();
}
beim öffnen wird überprüft ob sich das object, oder irgendeine
spätere mutation, davon im inventar befindet, dann ist es nicht mehr drin und wird nicht mehr angezeigt.
ansonsten wird es angezeigt.(objecton 4)
objecton1 ist für die grafik des geöffeneten kühlschranks

objekte: der offene kühlschrank, das object das genommen werden kann -> red bull dose.
hotspot -> kühlschrank

das haarigste ist die positionierung der base line, ansonsten sollts so funktionieren.


hoffe das hilft

EDIT:
hier noch der code fürs object4 wenns genommen wird,

Code: Alles auswählen

if (UsedAction (A_PICK_UP))
  {
    if (MovePlayer (250, 130))
    {
      FaceDirection (GetPlayerCharacter (), DIR_UP);
      Wait (5);
      UseView(DIR_UP);
      ObjectOff(4);
      PlaySound(4);
      AddInventory(15);
      DisplaySpeech(GetPlayerCharacter(),"Die Dose Sad Bull nehm ich mit, wenn ich mal einen Energieschub brauche.");
      
    }
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Mein Vorschlag:

Der Hintergrund enthält das Behältnis ohne Tür. (Hotspot 1, Name "Schrank")
Davor ist der Gegenstand. (Objekt 1, baseline auf Höhe des Gegenstands.)
Davor ist die geschlossene Tür. (Objekt 2, baseline unterhalb des Gegenstands, Name "Schranktür")
Zusätzlich ist im SpriteManager ein Bild der offenen Tür.

Skript für die Tür:

Code: Alles auswählen

int tuer_zu=301;      // Spritenummer aus dem Spritemanager
int tuer_offen=302;

...  // MovePlayer etc.

if (UsedAction (A_OPEN)) {
  if (oTuer.Graphic==301) {      // oder object[2].Graphic
    PlaySound(x);
    oTuer.Graphic=302;
  }
  else
    player.Say("Das ist schon offen.");
}
else if (UsedAction (A_CLOSE)) {
  if (oTuer.Graphic==302) {
    PlaySound(y);
    oTuer.Graphic=301;
  }
  else
    player.Say("Das ist schon zu.");
}

...   // der Rest bzw. Unhandled_Event();
Das Skript für den Gegenstand im Behältnis schreibst Du wie immer.
(Player nimmt es -> Objekt ausschalten, zum Inventar hinzufügen)

Was noch fehlt, ist der Hotspot.
Hier schreibst Du bei A_OPEN und A_CLOSE einfach genau das gleiche wie bei der Tür.
Du könntest auch versuchen, die entsprechende Funktion aufzurufen, um dir Arbeit zu sparen. Wenn Du Dir das komplette room script anschaust, siehst Du ja, dass die Any click on Tuer-funktion eine Funktion wie jede andere ist, mit Namen object2_a() beispielsweise.
Im Skript des Hotspots schreibst Du:

Code: Alles auswählen

...

else if (UsedAction(A_OPEN) || UsedAction(A_CLOSE)) {
  object2_a();
}

...
Meine Methode basiert einfach darauf, dass das Objekt im Schrank nicht zu sehen und somit nicht anklickbar ist, solange die Tür zu ist. Und das ganze ohne irgendwelche Zustandsvariablen.
Sag Bescheid, ob es funktioniert hat.

EDIT:
Nachtrag: Man sollte NIE das Inventar abfragen, um rauszufinden, ob ein Gegenstand schon genommen wurde. Das ist einfach eine zu große Fehlerquelle.
Vor allem muss man dann nicht den Code ändern, wenn man an anderer Stelle was umschreibt.

Die beiden Bilder von der offenen und geschlossenen Tür müssen natürlich so in AGS importiert worden sein, dass es reicht, das Sprite zu verändern. Außerdem muss bei den General settings "Pixel-perfect click detection" aktiviert sein, damit man bei klick auf den transparenten Teil des offene-Tür-Sprites den Gegenstand anklickt.
Use gopher repellent on funny little man
Benutzeravatar
DernetteEddy
Süßwasserpirat
Süßwasserpirat
Beiträge: 298
Registriert: 30.06.2004, 00:31

Beitrag von DernetteEddy »

Hat funktioniert. Die geöffnete Tür muss allerdings an der Stelle wo der Gegenstand liegt ein Loch haben. Sonst wird der Gegenstand trotz der Baselines verdeckt
Mit * markierte Felder sind erforderlich
Antworten