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
Beste Lösung "Behältniss öffnen und etwas rausnehmen&qu
- DernetteEddy
- Süßwasserpirat
- Beiträge: 298
- Registriert: 30.06.2004, 00:31
Beste Lösung "Behältniss öffnen und etwas rausnehmen&qu
Mit * markierte Felder sind erforderlich
- Rocco
- Adventure-Treff
- Beiträge: 1019
- Registriert: 25.11.2003, 16:20
- Wohnort: Ronville
- Kontaktdaten:
hier der code für den kühlschrank in meiner episode:
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 (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 ();
}
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.");
}
- KhrisMUC
- Adventure-Gott
- Beiträge: 4674
- Registriert: 14.03.2005, 00:55
- Wohnort: München
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:
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:
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.
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();
(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();
}
...
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
- DernetteEddy
- Süßwasserpirat
- Beiträge: 298
- Registriert: 30.06.2004, 00:31