Tür- Figuren- und anderes Problem

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
Rayman
Logik-Lord
Logik-Lord
Beiträge: 1388
Registriert: 07.01.2006, 20:08

Tür- Figuren- und anderes Problem

Beitrag von Rayman »

Hallo, ich bin's nochmal!

1. Problem:

Wie kann ich was machen, dass der Spielercharakter durch die anderen Charaktere nicht hindurch gehen kann, sondern einen Bogen um sie macht. Ich benutze AGS 2.72.


2. Problem:

Wie muss ich es scripen, wenn ein charakter (nicht der Spielercharakter) bei einer Sequenz die Tür betritt und wenn sie zu ist, dann öffnet der Charakter die Tür und geht rein und die Tür geht zu und wenn sie auf ist, dann geht er einfach rein, ohne die Tür zu öffnen und macht sie zu.

3. Problem:

-Gegenstand 3 ist eine Münze.
-Gegenstand 11 ist ein leeres Glas.
-Gegenstand 12 ist ein volles, aber dreckiges Glas.
-Gegenstand 13 ist sauberes Wasser.

Der Spielercharakter hier ist Achmed.

Code: Alles auswählen

if (UsedAction(A_USE_INV)) {
  if (character[GetPlayerCharacter()].activeinv == 12) {
    if (MovePlayer(240, 85)) {
      FaceLocation(GetPlayerCharacter (), 240, 84);
      PlaySound(95);
      Wait(60);
      LoseInventory(12);
      AddInventory(11);
      DisplaySpeech(GetPlayerCharacter(),"Wasser sein jetzt in Trichter von Maschine reingeschüttet.");
      SetGlobalInt(492, 1);
    }
  }
}

if (UsedAction(A_USE_INV)) {
  if (character[GetPlayerCharacter()].activeinv == 11) {
    if (MovePlayer(240, 85)) {
      FaceLocation(GetPlayerCharacter (), 240, 84);
      PlaySound(4);
      LoseInventory(11);
      ObjectOn(0);
      SetGlobalInt(490, 0);      
      SetGlobalInt(491, 1);
    }
  }
}

if (UsedAction(A_USE_INV)) {
  if (character[GetPlayerCharacter()].activeinv == 3) {
    if (MovePlayer(240, 85)) {
  if (GetGlobalInt(491)==0) {    
      FaceLocation(GetPlayerCharacter (), 240, 84);
    if (GetGlobalInt(492)==0) {
      DisplaySpeech(GetPlayerCharacter(),"Maschine muss erst mit Wasser gefüllt werden."); 
} 
else  DisplaySpeech(GetPlayerCharacter(),"Unter Wasserhahn von Maschine muss noch ein Gefäß hin.");
}
       if (GetGlobalInt(490)==1) {
         LoseInventory(3);
         Wait(10);
         PlaySound(108);
         Wait(10);
         PlaySound(74);
         Wait(10);
         ObjectOn(1);
         PlaySound(95);
         Wait(20);
         ObjectOff(0);
         Wait(7);
         PlaySound(4);
         ObjectOff(1);
         AddInventory(13);
      }
    }
  }
}
Wenn ich jetzt die Reihenfolge umgekehrt mache, also dass ich erst das leere Glas mit der Maschine benutze und dann die Münze, dann wird die Maschine aktiviert und man erhält ein Glas mit vollem sauberen Wasser, aber sie soll erst aktiv werden, nachdem man das volle, dreckige Glas mit ihr benutzt und anschließend das leere Glas und dann die Münze mit ihr benutzt, dass man dann erst sauberes Wasser erhält.
Hab ich da was falsch gemacht?
Benutzeravatar
AlphaBolley
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 53
Registriert: 07.03.2006, 15:52
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von AlphaBolley »

Auch wenn das nichts mit deiner eigentlichen Frage zu tun hat:
Statt

Code: Alles auswählen

character[GetPlayerCharacter()]
kannst du auch einfach

Code: Alles auswählen

player
schreiben.
Das erspart ein bisschen Schreibarbeit und verkürzt solche Ungetüme:

Code: Alles auswählen

DisplaySpeech(GetPlayerCharacter(),"Wasser sein jetzt in Trichter von Maschine reingeschüttet."); 
zu sowas:

Code: Alles auswählen

player.Say ("Wasser sein jetzt in Trichter von Maschine reingeschüttet."); 
100,5% Sinnlos
Benutzeravatar
Rayman
Logik-Lord
Logik-Lord
Beiträge: 1388
Registriert: 07.01.2006, 20:08

Beitrag von Rayman »

AlphaBolley hat geschrieben:Auch wenn das nichts mit deiner eigentlichen Frage zu tun hat
Pardon! Ich will ja nicht unhöflich erscheinen, aber normal sollte man eine Antwort geben, wenn man eine passende Antwort hat.
In der AGS-Hilfe und bei Sinitrenas-Website konnte ich davon leider nichts finden, aber ich will nur hoffen, dass ich da nichts übersehen habe. :shock: :( :shock:

Ich weiß, dass ich die Codes auch kürzer schreiben kann, aber ich war in ziemlicher Hektik, aber trotzdem Danke für den Rat. :wink:

Ich hoffe auch, dass ich noch Antworten auf meine drei Fragen bekomme :cry: .
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

1: Charakter auf Solid stekllen (Checkbox im CharakterMenü)

2. Du kannst zwei Objekte importieren, die du übereinander stellst
(offene Tür, darüber geschlossene Tür), dann machst du eine Region davor.
while character stands on that region:

Code: Alles auswählen

SetObjectTransparency(x, 100); 
(x=die gesclossene Tür)

Code: Alles auswählen

character[Achmed].Changeroom(999,1,1); 
(Ist dann nicht mehr
sichtbar)

Code: Alles auswählen

SetObjectTransparency(x, 0); 
(x=die gesclossene Tür)

3.Probier das mal in eine if-Schleife zu integireren:

if (GetGlobalInt(492) ==1)
{
if (UsedAction(A_USE_INV)) {
if (character[GetPlayerCharacter()].activeinv == 11) {
if (MovePlayer(240, 85)) {
FaceLocation(GetPlayerCharacter (), 240, 84);
PlaySound(4);
LoseInventory(11);
ObjectOn(0);
SetGlobalInt(490, 0);
SetGlobalInt(491, 1);
}
}
}

}
Zuletzt geändert von TheRock am 18.06.2006, 14:28, insgesamt 1-mal geändert.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ich will ja auch nicht unhöflich erscheinen, aber AlphaBolley hat Dir einen sehr nützlichen Tip gegeben, der Dir eine Menge Tipparbeit erspart, gerade wenn Du "in ziemlicher Hektik" bist.
Denk dran, dass Leute, die Dir hier Hilfestellung geben, das kostenlos in ihrer Freizeit machen.

1. Haken rein bei "Solid" (im Charakter-Menü)
Und schau Dir in der Hilfe Character.BlockingWidth/Height an.

2. Wenn ich noch einmal "scrip" oder "scripen" lese, krieg ich echt einen Anfall. Es heisst "Skript" und "skripten"!!!

Eine einfache If-Abfrage, ob die Tür offen ist, genügt.
Den Status der Tür bekommst durch object[x].Visible; x ist die Nummer des offene-Tür-Objekts, wenns true ist, ist die Tür offen, ansonsten zu. Dementsprechend kannst Du auch durch Ändern des Attributes die Tür öffnen/schließen.

Code: Alles auswählen

if (object[x].Visible==true) {  // Tür offen
  cSyd.Walk(x, y);
}
else { // Tür zu
  cSyd.Walk(x, y); // zur Tür laufen
  Wait(10);
  object[x].Visible=true;  // Tür öffnen
  Wait(10);
  cSyd.x=-20;  // Syd "verschwinden" lassen
}
Wait(10);
object[x].Visible=false; // Tür schließen
3. Ich bin gerade viel zu faul, um mich durch deine unkommentierten GlobalInts zu wurschteln; mir ist auch nicht ganz klar, was Du mit "Reihenfolge" meinst, die Reihenfolge der activeinv-Abfragen im Skript ist jedenfalls ganz egal.

Übrigens kannst Du Dir hier nochmal jede Menge Tipparbeit sparen, wenn Du das so umschreibst:

Code: Alles auswählen

int ai=player.activeinv;

if (UsedAction(A_USE_INV)) {
  if (MovePlayer(240, 85)) {
    if (ai == 12) {
      ...blah...
    }
    else if (ai==3) {
      ...blah...
    }
    else if (ai==11) {
      ...blah...
    }
    ...usw.
  }
}
EDIT: TheRock, deine Nr. 2 ist nicht MMM-spezifisch, es geht einfacher.
Zuletzt geändert von KhrisMUC am 18.06.2006, 14:31, insgesamt 1-mal geändert.
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

Hah khrismuc ich war schneller^^ kommentier meinen Beitrag biitte auf Richtigkeit
Benutzeravatar
Rayman
Logik-Lord
Logik-Lord
Beiträge: 1388
Registriert: 07.01.2006, 20:08

Beitrag von Rayman »

Danke für den Tip, aber was wird mit Frage 3? :roll:
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

solltest du nach oben blicke auf meinen Beitrag........
Ich weiß aber nicht obs klappt( auch wenns sollte)
Benutzeravatar
Rayman
Logik-Lord
Logik-Lord
Beiträge: 1388
Registriert: 07.01.2006, 20:08

Beitrag von Rayman »

TheRock hat geschrieben:solltest du nach oben blicke auf meinen Beitrag........
Ich weiß aber nicht obs klappt( auch wenns sollte)
Oh, Sorry! Das hab ich übersehn!
Werd ich gleich mal ausprobieren! :wink:
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

sag obs funzt... Ich muss gleich gehen^^
Benutzeravatar
Rayman
Logik-Lord
Logik-Lord
Beiträge: 1388
Registriert: 07.01.2006, 20:08

Beitrag von Rayman »

Danke, es hat alles wunderbar geklappt!
Benutzeravatar
Rayman
Logik-Lord
Logik-Lord
Beiträge: 1388
Registriert: 07.01.2006, 20:08

Beitrag von Rayman »

Ich habe jetzt eine Frage:

Wie muss man eine Verfolgungsjagd inszinieren wie bei Maniac Mansion, wenn die Edna Edison einen Teenager verfolgt?
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

Weiß leidern nicht genau was du meinst aber es gibt nen FollowCharacter - Befehl!
"Er schaute mich an, als hätte ich auf einer Beerdigung gepupst"-George Stobbart, Philosoph

"Kreativität ist so lange in der Scheiße wühlen, bis man den Nugget findet!"-Peter Schindhelm, Kunstlehrer
Benutzeravatar
Rayman
Logik-Lord
Logik-Lord
Beiträge: 1388
Registriert: 07.01.2006, 20:08

Beitrag von Rayman »

Was ich damit sagen wollte ist,
wie man das machen muss, dass eine Figur den Player Character verfolgt und wenn er den Player Character erreicht hat, das dann z.B.: der Player Character sich dann im Kerker befindet.
(Wie bei Maniac Mansion)
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

Leider (ihr wisst ja, dass ichs nicht mit AGS haben) kann ich dir darauf nur ungenau antworten!

Du nimmst 4 Variabeln die du immer aktualiesieren lässt

-Char1-y-Wert
-Char1-x-Wert
-Char2-y-Wert
-Char2-x-Wert

Du stellst in eine Schleife, dass beide x und y Werte nach der Größe sortiert werden und sich der kleinere Wert jeweils von dem größeren Wert abgezogen wird und wenn der daraus enstandene Wert kleiner als (10,20,30, je nachdem wieviel Abstand du haben willst) blockst du beide charaktere und skriptest dann halt weiter!

Ich nehme an jemand kann das in AGS-Sprache umwandel (braucht man dafür nicht sogar das Kalkulator-Plugin?)
"Er schaute mich an, als hätte ich auf einer Beerdigung gepupst"-George Stobbart, Philosoph

"Kreativität ist so lange in der Scheiße wühlen, bis man den Nugget findet!"-Peter Schindhelm, Kunstlehrer
Antworten