Hauptmenü

Neuigkeiten:

Bitte unterstützt uns und bestellt über diese Links bei Amazon  oder HumbleBumble!

Objekte durch den Button "Ziehen" verändern?

Begonnen von Splattermaster, 12. Juli 2007, 13:05:39

Vorheriges Thema - Nächstes Thema

Splattermaster

hi,
bin grad dabei einigen räumen etwas leben einzuhauchen und stoße auf folgendes problem:

ich habe in einem raum ein object gesetzt. nun soll dieses durch den button "Ziehen" seine aussehen (bildfolge)verändern.
habe von diesen object mehrere bilder mit der veränderung erstellt und in den sprite-manager geladen.
habe auch schon die bildreihenfolge in die views gesetzt.
das object habe ich natürlich auch auf "visible" gesetzt, sonst kann man es ja nicht sehen.

muß ich den einen hotspot darauf setzen? es ist ja kein bestandteil des hintergrundes.  ???
ich denke ja, das die lösung im script des objects liegt. da es ja die option gibt "interaction" , "any_click_on_object".

wie muß ich das script gestallten, daß er auf einen bestimmten "view" diese bildreihenfolge abholt?

hab schon einiges ausprobiert, aber er bricht immer mit einer fehlermeldung ab. kann mir jemand
helfen bei diesem kleinen script?

beste grüße
splattermaster


KhrisMUC

#1
Hier ein Beispiel für das any_click_on-Script:

  if (MovePlayer (275, 133)) {   // Koordinaten, zu denen der Spielcharakter läuft
    FaceDirection(player.ID, DIR_RIGHT);     // Blickrichtung
    Wait(5);
   
    if (UsedAction (A_LOOK_AT)) {
      if (verzogen) player.Say("Das hab ich schön verzogen. Huiuiuiui!");
      else player.Say("An diesem Ding kann ich ziehen.");
    }
   
    else if (UsedAction (A_PULL)) {
      if (verzogen) {
        player.Say("Bringt nix, da noch weiter dran zu ziehen.");
      }
      else {
        oObjekt.SetView(VIEWNUMMER);           // hier die Nummer der View eintragen
        oObjekt.Animate(0, 3, eOnce);             // loop 0, delay 3
        Wait(10);
        player.Say("Das hab ich aber sauber verzogen...");
        verzogen=true;
      }
    }

    else Unhandled ();
  }


Wenn Du die beiden Fenster wieder geschlossen hast, drückst du Strg-E. Im sich öffnenden Room script fügst Du ganz am Anfang, vor der ersten Funktion, Folgendes ein:
bool verzogen;

Wichtig: statt oObjekt musst Du den Script-O Name Deines Objektes nehmen.
Name ist die offizielle Bezeichnung, die später der Spieler sieht.
Script Name ist die interne Bezeichnung, sie muss einmalig sein.
Daraus macht AGS den Script-O Name, den du drunter ablesen kannst. Der muss im Skript verwendet werden.

steve-o-mat

#2
Argh so ein Mist, jetzt hab ich mir die Finger wundgetippt, um hier zu helfen und dann war der KhrisMUC einfach schneller...  ;)

btw, sowas ähnliches gabs glaub ich irgendwo schonmal in Mukk's Fragethread.


Aber es würde doch theoretisch noch

object[x].SetView(72);
object[x].Animate(0, 3 ,eRepeat, eNoBlock);


gehen, oder ist das jetzt auch veraltet?

Splattermaster

#3
hi,
danke für die schnelle antwort. das "verzogen" ist, nehme ich an, eine variable oder?

gruß
splattermaster

KhrisMUC

steve:
Nein, aber im room script kann man ja den O Name verwenden, wozu dann Nummern jonglieren? :)

splattermaster:
Genau, vom Typ bool, d.h. entweder true oder false. Anfangs false (so wie ints anfangs 0 sind), nach dem Ziehen wird sie auf true gesetzt.

Splattermaster

hi,
hab grad mal alles eingetipt und die änderungen vorgenommen.
wollte ich grad ausprobieren und er bricht immer
mit dem fehler ab (undefined symbole 'verzogen').

hab im global script "bool verzogen;" aber zugefügt.

was hab ich falsch gemacht?

mfg
splattermaster

KhrisMUC


steve-o-mat

Hmm was mir spontan auffällt, ist, dass KhrisMUC geschrieben hat, dass du es in das RoomScript schreiben musst, nicht ins GlobalScript.  ???   Kann es daran liegen?

Mist, ich war schon wieder zu langsam...  :'(   ;)

Splattermaster

geändert...aber,
folgende frage hab ich noch:

player.ID   (welcher name wird anstell von 1.) "player" und 2.) "ID" gesetzt?
1.) im Charakter Editor "Full name", "Script name" oder "Script-o name" ?
2.) etwa die ID im Charakter Editor (1,2,3...usw.)

player.Say (wird alles durch den charakternamen ersetzt?)


mfg
splattermaster

p.s.:haltet ich nicht für blöd, aber das verstehe ich noch nicht.

steve-o-mat

#9
Wenn du player.Say nimmst, meinst du damit automatisch die gerade handelnde Figur.
Falls du wenn anders nehmen willst, musst du meines Wissens cDave.Say nehmen zum Beispiel.

player.Say ("Cool!");   //aktuelle Spielfigur spricht
cDave.Say ("Cool!");    //Dave spricht


Genauso bei player.ID bzw. cDave.ID.

Als Beispiel:

FaceDirection (player.ID, DIR_LEFT);    //lässt die die aktuelle Spielfigur na links schauen
FaceDirection (cDave.ID, DIR_LEFT);    //lässt Dave nach links schauen


Edit: Hab zum besseren Verständnis Beispiele zugefügt, mach ich das nächste mal gleich, sorry.

Splattermaster

hier mal das script wie ich es momentan drin hab:

#sectionstart object0_a  // DO NOT EDIT OR REMOVE THIS LINE
function object0_a() {
  // script for Object 0 (Gemälde): Any click on object
if (MovePlayer (121,54))
{ 
FaceDirection (player.ID, DIR_LEFT);
Wait (5);
if (UsedAction (A_LOOK_AT))
{
if (verzogen) cFredd.Say ("Das hab ich schön verzogen.");
else cFredd.Say (An diesem Ding kann ich ziehen.");
}
else if (UsedAction (A_PULL))
{
if (verzogen)
{
cFredd.Say("Bringt nix, da noch weiter dran zu ziehen.");
}
else
{
BILD1.SetView (1);
BILD1.Animate (0, 3, eOnce);
Wait (10)
cFredd.Say ("Das hab ich aber sauber verzogen...");
verzogen=true;
}
}
else Unhandled ();
}
}
#sectionend object0_a  // DO NOT EDIT OR REMOVE THIS LINE


wenn ich das drin habe bricht er mir
mitdem fehler : RUNTIME error : unexpectd eof
ab.



Splattermaster

hinbekommen.
waren einige fehler drin die ich korrigiert habe.
danke für eure mühe...jetzt funktioniert es.

habt nochmal vielen dank

beste grüße
splattermaster

steve-o-mat

Ich mache das immer ein wenig anders...


if (any_click_move (121, 54, DIR_LEFT))    // jetzt läuft er erst mal generell, egal was für ne Handlung kommt dahin.

if (UsedAction (A_LOOK_AT))
  {
  if (verzogen)
   {
    cFRED.Say ("...");
    }
  else
    {
     cFRED.Say ("...");
    }
  }
else .....


Ansonsten fällt mir aber nichts schwerwiegendes auf bis auf das das eigentlich cFRED heissen müsste. Ich weiß jetzt nicht, ob du da nen Schreibfehler bei diesem
BILD1.SetView (1);   drin hast. Ich mach es halt immer so:

object[x].SetView(72);
object[x].Animate(0, 3 ,eRepeat, eNoBlock);

Vielleicht probierst du mal, ob das so klappen tut, weil dann hättest du da den Fehler drin.
Also wirklich weiterhelfen kann ich grad net so recht... :-\
Ich probiers gleich mal bei mal bei mir.

Und nutze beim nächsten mal lieber die Code-Funktion ({code}{/code} musst bloß eckige Klammern verwenden) beim Posten, wegen der Übersicht.  ;)

Na dann hat es sich ja schon wieder erledigt... vielleicht sollte ich doch mal nen 10-Finger-Schreibkurs mitmachen.  ;)

Splattermaster

hi,
hat alles geklappt wie ich es wollte. ist zwar nur ein kleiner teil in einem großen raum, aber mit viel witz wie ich denke. wirst es ja bald zu sehen bekommen.  :-*

nochmals danke an alle

splattermaster  ;)

KhrisMUC

splattermaster:
Der eof-Fehler bedeutet immer, dass Du irgendwo bei einem Text ein Anführungszeichen vergessen hast.
In diesem Fall hier:
else cFredd.Say (An diesem Ding kann ich ziehen.");Copy&Paste nächstes Mal? ;)

steve:
Deine Einrückungen sind ja vogelwild... :o Und auch nicht einheitlich...
Mein Schema wird von AGS automatisch so eingerückt ;D
Wenn nach if/else if/else nur ein Befehl kommt, braucht man übrigens keine {}, das erhöht die Übersicht.
Und:
Zitatim room script kann man ja den O-Name verwenden, wozu dann Nummern jonglieren? :)