Maniac Mansion Mania Forum
MMM-Werkzeugkiste => Technik => Newbies => Thema gestartet von: Shoben am 05. Dezember 2010, 23:31:29
-
Ich weiß ich bin schlimm!
Und damit ich nicht Threadersteller Nummer 1 werde,
mache ich einen allgemeinen Thread zu meinen Fragen auf!
Frage:
Wie kann man einen Hotspot löschen??
-
Soweit ich weiß musst du beim "malen" statt der linken die rechte maustatse gedrückt halten und dann übern hostspot "malen"
-
Nee, ich mein im Skript, sobald der Hotspot eben nicht mehr da sein soll, soll man ihn nicht mehr sehen etc.
-
hotspot[x].enabled = false;
-
oder hotspotname.enabled=false;
ein bsp:
hBild.enabled=false;
-
Ahh, Danke :D
-
An dieser Stelle möchte ich anmerken, dass ich es für eine sehr fragwürdige Design-Praxis halte, Hotspots einfach zu löschen, wenn sie ihren Zweck im Spiel erfüllt haben.
Da spart man vielleicht eine Variable und ein paar ifs, aber ich als Spieler denke mir jedesmal "so ein fauler Sack, deaktiviert einfach den Hotspot".
Es ist nicht ganz so schlimm wie "halbstumme" Hotspots, die auf nicht weiterführende Aktionen einfach gar nicht reagieren, hat aber meiner Ansicht nach außerhalb von z.B. kurzen Trash-Episoden in Spielen nichts verloren.
Weiß jetzt nicht, wie genau Du das verwenden willst, Shoben, ich würde es aber nochmal überdenken, falls es zum genannten Zweck eingesetzt werden soll.
-
Du glaub mir! Ich bin der erste, der protestierend aufsteht, wenn etwas so gemacht wird, oder die Liebe zum Detail weggelassen wird.
Ist nur dazu da, dass man etwas (Hotspot) nimmt und wenn man es hat, dann soll es ja nicht mehr rumliegen! Klar, ich hätte auch einfach ein
Objekt draus machen können, aber egal! ;D
-
Äh, genau!
Warum dann einen Hotspot verwenden...?
-
Klar, ich hätte auch einfach ein Objekt draus machen können, aber egal! ;D
Da im Normalfall der mitgenommene Gegenstand auch nicht mehr zu sehen sein darf, wäre es auch deutlich einfacher ein Objekt daraus zu machen statt das Hintergrundbild auszutauschen.
-
Äh, genau!
Warum dann einen Hotspot verwenden...?
wird wahrscheinlich daran liegen, dass in den starterpacks alle möglichen objekte in die hintergrundgrafik eingearbeitet wurden und per hotspot bereits vorhanden sind
in diesem fall ist es für den entwickler weit weniger aufwändig, wenn er einfach zB ein "das buch ist weg"-objekt an dieser stelle macht und den hotspot ausschaltet, als wenn er das vorhandene zeug aus dem starterpack löscht und alles von vorne als objekt erstellt :-\
diese lösung ist zwar nicht unbedingt elegant, macht aber für den spieler überhaupt keinen unterschied ;)
-
Ich machs mir halt gern mal umständlich ^^.
Ich weiss. Aber wie gesagt, im Endeffekt macht
es keinen Unterschied mehr und so lerne ich
auch ein bischen mehr Funktionen und Möglichkeiten
kennen. :-\
-
Neue Frage:
Wie kann ich ein Objekt, dass auf Transparenz = 100 gestellt ist, langsam auf 0 % faden?
Ich hab mit der Erklärung im Handbuch nichts anfangen können :(
-
ja kannst du
mit einer schleife wo du die transparenz verringerst und ein Wait drin ist (ohne das Wait macht AGS alles in einem schritt)
while (oGhost.Transparency > 0) {
oGhost.Transparency -= 1;
Wait(1);
}
-
Ah danke! :)
-
Ähhm, leider funktioniert Boogieman´s Code bei mir nicht.
Es passiert überhaupt nichts. Könnte man mir die Funktionen
der Befehle vllt mal erläutern, damit ich den Fehler in der Sache
verstehen kann?
-
ok, der vorige code war nicht getestet sondern ausm gedächtnis
hier der code, den ich für teds fade-in in TMMCMFH (AGS3.1.2SP1) verwendet hab
ist zwar kein objekt sondern ein char, aber der funktioniert mit sicherheit
ted fängt dabei mit Transparency=100 (unsichtbar) an und macht einen fade-in in 2er-schritten bis er nur noch leicht durchsichtig ist
int iTrans = 100;
while (iTrans > 26) {
iTrans -= 2;
cGhost.Transparency = iTrans;
Wait(1);
}
bin mir nicht mehr sicher, aber ich glaube ich hatte da probleme beim direkten verwenden der Transparency-eigenschaft und hab das dann durch die iTrans variable umgangen :-\
der code sollte natürlich in ein script für zB "schau an geist" eingebaut werden
kurze erklärung:
"while" ist eine schleife die die befehle in den { } solange wiederholt, bis die angegebene bedingung nicht mehr erfüllt ist (in diesem fall bis die variable iTrans nicht mehr größer als 26 ist)
"cGhost.Transparency" cGhost ist in diesem fall ein character, und Transparency ist dessen durchsichtigkeit (100=unsichtbar, 0=undurchsichtig)
"Wait(1)" ist notwendig, damit ags zeit bekommt, die änderungen an der transparenz auch darzustellen
würde hier kein Wait sein, würde ags die schleife so schnell abarbeiten, dass der spieler die animation nicht sehen würde sondern nur den endzustand nach der schleife
-
ich machet ja immer so:
player.Transperency=10;
player.Transperency=20;
player.Transperency=30;
player.Transperency=40;
player.Transperency=50;
player.Transperency=60;
USW. bis 100 und dann wenns wuieder sichtbar sein soll einfach 100
90
80...
Hoffe ich konnte helfen ;)
(achja .Transperency geht mit jedem object player gui usw... )
-
Soweit hat Boogiemans Lösung geklappt, aber wenn ich das gleichzeitig mit mehreren Objekten machen will,
dann klappt es nicht, dann geht nur das erste. :(
-
die müssen natürlich auch alle in der selben schleife sein
aber poste einfach mal dein script, damit wir den fehler suchen können ;)
-
Also, ich habe hier den Ausschnitt des Scripts.
Zuerst möchte ich nur, dass der Spieler ausgeblendet wird.
Aber das geht schon nicht :( :
if (character [GetPlayerCharacter ()].activeinv == 11) {
Wait (5);
DisplaySpeech(GetPlayerCharacter(),"Und los gehts...");
Wait (15);
PlaySound (4);
LoseInventory (11);
Wait (80);
int iTrans = 0;
while (iTrans > 100) {
iTrans -= 2;
cBernardV.Transparency = iTrans;
Wait(1);
}
}
-
if(player.activeinv == 11) {
Wait(5);
player.Say("Und los gehts...");
Wait(15);
PlaySound(4);
LoseInventory(11);
Wait(80);
while (player.Transparency < 100) {
player.Transparency += 2;
Wait(1);
}
}
Was soll durch eine Variable besser werden?
-
Ok, so klappt es, aber wenn ich gleichzeitig auch noch 3 Objekte sichtbar machen lassen will, passiert dies nicht, es bleibt beim ausblenden des Spielers:
if (character [GetPlayerCharacter ()].activeinv == 11) {
Wait (5);
DisplaySpeech(GetPlayerCharacter(),"Und los gehts...");
Wait (15);
PlaySound (4);
LoseInventory (11);
Wait (80);
while (player.Transparency < 100) {
player.Transparency += 2;
Wait(1);
}
while (oObject2.Transparency < 0) {
oObject2.Transparency -= 2;
Wait(1);
}
while (oObject3.Transparency < 0) {
oObject3.Transparency -= 2;
Wait(1);
}
while (oObject4.Transparency < 0) {
oObject4.Transparency -= 2;
Wait(1);
}
}
Was mache ich hier falsch?
-
oObject2.Transparency < 0 :cl
solange object2.transparency kleiner 0
kann nicht stimmen
-
Ahh! Ich Deppschef! Dankeschön 8)
-
ich machet ja immer so:
player.Transperency=10;
player.Transperency=20;
player.Transperency=30;
...
Urg. Bitte nur Lösungsvorschläge posten, die etwas kompetenter sind.
if (character [GetPlayerCharacter ()].activeinv == 11) {
Wait (5);
DisplaySpeech(GetPlayerCharacter(),"Und los gehts...");
Wo bitte ist das Tutorial, in dem Du diese Art zu coden gelernt hast, damit ich es mit Stumpf und Stiel ausrotten kann?
So wird das aktuell geschrieben:
if (player.activeinv == 11) {
Wait (5);
player.Say("Und los gehts...");
Und bitte keinen dummen Schlaumeierspruch; Du fängst gerade erst an mit AGS, also ist es sinnlos und idiotisch, diese uralten Befehle zu lernen.
Zu deinem Code (gleichzeitiges Blenden war gefragt, oder?):
int t = 0;
while (t < 100) {
t += 2;
player.Transparency = t;
oObject2.Transparency = 100-t;
oObject3.Transparency = 100-t;
oObject4.Transparency = 100-t;
Wait(1);
}
-
Problem war inzwischen schon gelöst, hmm ich versuche mir zur Zeit immer weider die neuen Codes anzgewöhnen, hab mir halt immer alles vom Starterpack abzuschauen.
Was ist an den Codes den eig. so schlimm?
>> Und los gehts: Du kannst ja nicht wissen, in welchem Zusammenhang das gesagt wird.
-
So, jetzt habe ich wohl ein Problem damit, 2 Inventargegenstände zu verbinden. :(
Nämlich, funktioniert das super, bei Hotspots oder Objekten:
if (UsedAction (A_USE_INV)) {
if (character [GetPlayerCharacter ()].activeinv == 15) {
Wait (5);
etc;
etc;
...
Aber wenn ich das geauso auch bei Inventargegenständen mache funktioniert nichts.
Will heißen, ich bekommen nur "Besser Nicht" zu hören. Muss man bei INV-Gegen-
ständen irgendwas anders machen???
-
>> Und los gehts: Du kannst ja nicht wissen, in welchem Zusammenhang das gesagt wird.
Häh? Muss ich das wissen? Ich hab die Zeile nur hergenommen, und Dein "DisplaySpeech(GetPlayerCharacter()" durch "player.Say" zu ersetzen.
Was ist an den Codes den eig. so schlimm?
Sie sind umständlich und veraltet. Um mein Beispiel nochmal zu verwenden: Du würdest doch Windows95 auch nicht mehr hernehmen.
Außerdem wird mit ziemlicher Sicherheit der Tag kommen, an dem die alten Befehle nicht mehr verwendet werden können; warum also nicht gleich die neuen, zeitgemäßen, kürzeren und eleganteren Befehle lernen?
Wenn man erst vor Kurzem in MMM und AGS eingestiegen ist, ist es einfach schwachsinnig, sich jetzt noch in AGS 2.X und uralte Befehle einzulernen.
Dass man nicht sofort umsteigt, wenn man seit Jahren an den alten Kram gewöhnt ist, ist ein anderes Thema, aber als Frischling ist das wirklich Käse.
-
Achso, ich dachte:
Und bitte keinen dummen Schlaumeierspruch;
wäre auf den Spruch des Spielers "Und los gehts...", bezogen ^^.
BTW: Habe ich bezüglich der alten Codes etwa einen Schlaumeierspruch losgelassen?
-
Nein.
Ein weiteres Argument gegen die alten Codes ist übrigens, dass sie natürlich nicht automatisch vervollständigt werden, wenn man AGS 3.X benutzt.
Coden geht viel schneller, wenn ich mir von AGS immer schön das Wort einsetzten lassen, nachdem ich die ersten drei Buchstaben getippt habe.
Zu Deiner Frage:
Wähl das InventarItem aus und füge die Eventfunktion "Use inventory on this item" hinzu.
Dort drin dann:
if (player.ActiveInventory == iDingens) {
Wait (5);
...
Ein weiterer Vorteil vom neuen Code: man muss nicht die Zahlen sondern kann die Scriptnamen verwenden; das macht den Code viel lesbarer.
-
Ah Danke :)
Und ich versuch mir die neue Skriptsprache anzugewöhnen :)
-
Wie geht noch gleich der Befehl um in AGS3.X eine Dialogoption auszuschalten?
Die in der Hilfedatei hab ich wohl nicht kapiert, so wie ich sie benutze funktioniert sie
jedenfalls nicht! ???
-
dDialog1.SetOptionState(*nummer*, eOptionOff);
oder
dDialog1.SetOptionState(*nummer*, eOptionOffForever);
-
Dialog 1(13): Unknown command: dbreakfast.setoptionstate(1, eoptionoff). The command may require parameters which you have not supplied.
Dialog 1(43): Unknown command: dbreakfast.setoptionstate(*3*, eoptionoff). The command may require parameters which you have not supplied.
??? ??? ???
-
nun das Dialogskript funktioniert ein bisschen anders, sag das doch gleich...
Also dabei musst du "option-off-forever *nummer*" oder "option-off *nummer*" schreiben. (natürlich immer ohne sternchen, dachte das wär klar)
Das "forever" gilt hierbei selbst dann noch wenn der Dialog vorbei ist und du nochmal mit der person redest...
Steht aber alles auch in der Hilfe, wenn du im Dialog bist und F1 drückst.
-
Danke, in der Hilfedatei wirds immer ein bischen anders erklärt, als mans im Grunde macht, so kommts mir jedenfalls manchmal vor ^^ ???
-
Ich finde die machen das genauso wie man es auch braucht... :-\
-
Danke, in der Hilfedatei wirds immer ein bischen anders erklärt, als mans im Grunde macht, so kommts mir jedenfalls manchmal vor ^^ ???
Bub, ganz einfach, wenn Du es so machst, wie's in der Hilfedatei steht, funktionierts auch.
Wenn Du's "bischen anders" macht, dann nicht.
Dein Satz macht überhaupt keinen Sinn.
Und bitte POSTE DOCH DIREKT DEN CODE, den Du verwendest, wenn damit was nicht funktioniert.
Du bist nicht der Einzige, aber ich sitz jedesmal wieder kopfschüttelnd vorm Rechner, wenn Die Leute von Fehlermeldungen und "geht nicht" schwafeln, aber verdammt nochmal ihren Code nicht mit in den Beitrag schreiben. >:D
-
Tschuldigung :-[
-
Und wie kann man im Dialog einstellen, dass eine Option erst auftaucht, wenn 2 bestimmte Dialogoptionen gewählt wurden, nicht nur eine?
-
nun, das dürfte mit ints / anderen Variablen gehen.
In der Hilfedatei ist ein Beispiel für Dialog-Skripte mit "Inline-AGS-Scripting-Funktionen".
Ich glaube du musst einfach nur ein paar Leerzeichen am anfang schreiben und dann ein stinknormales AGS-Skript, wie zum Beispiel:
(1. Option)
bOption1 = true; if(bOption2) ...
(2. Option)
bOption2 = true; if(bOption1) ...
-
Also es gibt ja einen Befehl, um ein Objekt direkt ohne Zwischenweg auf eine Stelle zu bringen. BSP:
object[2].SetPosition(50, 100);
Gibt es sowas auch für Chars???
Denn im Hilfebuch habe ich nichts gefunden.
-
player.PlaceCharacter(160, 100, eDirDown);
-
Hat leider nicht funktioniert. Ist das ein AGS3.x-Befehl??? Egal, ich habe es jetzt schon alleine gelöst :D
-
Nun, der ist in der PlayerExtends Skriptdatei. Wenn du die nicht hast musst du es manuell mit player.x =...; player.y =...; machen...
-
So hab ichs jetzt auch gelöst, den Befehl hab ich durch Zufall grade gefunden :D
-
Hi, wieder mal eine Frage :) :
Wenn ein Hotspot jetzt zb. heißen soll "um die Ecke", wie stelle ich dann ein,
dass der Aktionstext nicht lautet "Gehe zu um die Ecke", sondern "Gehe um die Ecke"?
*Edit: OK, habs mehr oder weniger selber gelöst. Dankeschön trotzdem! :D
-
Hi Leute, ich will, dass man bei Klick auf einen Hotspot direkt ins Laden-Menü kommt, ich werde da allein einfach nicht schlau. Außerdem brauche ich den Befehl, um das Spiel zu schließen.
-
Um ins Laden Menü zu kommen:
GetLucasSavegameListBox (RESTORE, 1);
gui[6].Visible=1;
und um das Spiel zu Beenden:
QuitGame(0);
-
Ok, Dankeschön :D
-
GetLucasSavegameListBox (RESTORE, 1);
Sorry, der Code funktioniert bei mir blöderweise nicht. ???
Auch, wenn ich ihn direkt aus dem GS kopiere, wo er funktioniert! :o
Um genau zu sein, er sagt:
Undefined token 'GetLucasSavegameListBox'
Falls das hilft: Es wird im Anfangsraum, also im StartScreen benutzt.
-
Achte darauf, dass die Funktion im Header vom GlobalScript "import"iert wird, damit du sie auch außerhalb des Globalscriptes verwenden kannst. Sollte es denn nicht reichen, das entsprechende GUI zu aktivieren / ein neues GUI zu erstellen?
-
die Funktion im Header vom GlobalScript "import"iert wird, damit du sie auch außerhalb des Globalscriptes verwenden kannst.
Das geht über mein Latein... Was ist das und wie mach ich das? ;D
-
Schreibe einfach in den Script Header (also "GlobalScript.ash") diese Zeile:
import function GetLucasSavegameListBox(this GUI*, ListBox *box);
(also praktisch die Funktionszeile des Globalscripts mit einem "import" davor)
Damit kannst du die Funktion nun im gesamten Spiel nutzen, nicht mehr nur im Globalscript. :)
-
Hab ich gemacht, hat nichts gebracht, muss ich es an eine bestimmte Stelle anfügen??
-
Die Fehlermeldung "Undefined Token" dürfte nicht mehr kommen, höchstens eine Andere. Was genau klappt nicht?
"Hat nichts gebracht" hilft uns kein Stück, beschreib bitte so genau wie möglich, was passiert und was nicht klappt usw. ( ::))
-
Also, im Startbildschirm soll es eine Option "Laden" geben, und wenn man drauf klickt kommt folgendes Skript:
(http://imgmi.net/6/6640ca30.png)
Leider kommt aber dieser Fehler:
(http://imgmi.net/9/9cbe91a2.png)
Wenn ich den Befehl "import function GetLucasSavegameListBox(this GUI*, ListBox *box);" in den Header (Also GlobalScript.ash) einfüge (ich hab ihn einfach mal irgendwo zwischen alle anderen kopiert) ändert sich nichts. ???
-
Kein Wunder, dass es nicht funktioniert; Kaktus hat wahrscheinlich in einem alten Pack nach dem Befehl geschaut.
Hier ist der Code, der bei Klick auf den "Laden"-Button ausgeführt wird:
function gOptLoad_OnClick(GUIControl *control, MouseButton button)
{
gOptions.Visible = false;
gRestore.GetLucasSavegameListBox(lstRestore);
gRestore.Visible = true;
}
Die letzten beiden Zeilen musst Du übernehmen (gOptions muss nicht ausgeschaltet werden, es ist ja nicht sichtbar).
-
Kein Wunder, dass es nicht funktioniert; Kaktus hat wahrscheinlich in einem alten Pack nach dem Befehl geschaut.
Alles Kakteens Schuld. 8)
-
Naaaa toll, jetzt sagt er das hier:
(http://imgmi.net/b/ba79c300.png)
Solangsam nervts :police: :police: :police:
-
Öhm, also auf das GUI-Element scheinst du keinen export zu haben. Am Ende des GlobalScripts "export lstRestore;" sollte helfen. Was nervt daran eigentlich? ;)
-
... Dass ich andauernd hier neu fragen muss :D
Und jetzt kommt der hier: ;D
(http://imgmi.net/7/73f33f50.png)
-
lstRestore ist der Skriptname der Liste der savegames im Laden-GUI; der sollte sowieso global sein; keine Ahnung, was da los ist.
So funktioniert es auf jeden Fall:
in Global.ash irgendwo rein:
import function gOptLoad_OnClick(GUIControl *control, MouseButton button);
ins Raumskript:
gOptLoad_OnClick(gOptLoad, eMouseLeft);
Getestet mit MansionPack.
-
Kann ich das "_OnClick" auch weglassen, mit dem gibts nämlich wieder die Fehlermeldung "undefined Symbol 'gOptLoad'".
Ohne das "_OnClick" funktionierts, dann krieg ich aber wiederum die Fehlermeldung:
(http://imgmi.net/0/0e760b1e.png)
Haha, Leute was ist denn mit AGS andauernd los??? Der Editor spinnt ja!
-
Offenbar braucht die Funktion "gOptLoad" noch mehr Parameter.
-
Ich weiß nicht, welches Starterpack Du benutzt, aber anscheinend heißen bei Dir die Sachen anders.
Mach mal im Editor das F5-GUI auf (bei mir Nr. 3: gOptions). Jetzt klickst Du den Laden-Button an, wie heißt der? (1)gOptLoad?
Jetzt klickst Du auf den Blitz, was steht rechts neben OnClick? (2)gOptLoad_OnClick?
Jetzt klick bitte doppelt auf den Laden-Button und poste die Funktion, in die der Cursor springt (in Global.asc).
Bei mir:
function gOptLoad_OnClick(GUIControl *control, MouseButton button)
{
gOptions.Visible = false;
gRestore.GetLucasSavegameListBox(lstRestore);
gRestore.Visible = true;
}
Wir werden das schon schaukeln.
NsMn: Nein.
-
ÄÄäähm, wo steht der Name des Buttons, unter "Name" steht bei mir nämlich bei sämtlichen Buttons nichts!? :o :o
Und bei Doppelklick kommt:
(http://imgmi.net/b/b17a3820.png)
Mein Menü funktioniert aber InGame perfekt... Was is denn da los??
Muss ich jetzt die Namen einfügen??? Ich benutze das Bernard272er SP
... dummerweise mit 3.12, könnte da der Fehler liegen!?
-
Daran liegt es mit Sicherheit. Denn offiziell sollte es zwar funktionieren, aber die Verwendung veralteter Starterpacks bringt immer noch einige Macken mit sich.
Problemloser geht es auf jeden Fall, wenn man im leeren Starterpack die Hintergründe einfügt und sich so alles neu aufbaut.
-
Ach du Scheiße, kein Wunder, dass da nix geht. Hätte man ja mal etwas früher erwähnen können, dass da noch 2.72 am Werk ist. :P
Dann hatte Kaktus doch recht, die import Zeile muss aber so aussehen:
import function interface_click (int interface, int button);
Das rufst Du im Raum auf mit:
interface_click(OPTIONS, 1);
-
Oh mein ******** Gott! Es funktioniert! :o :o :o :o
Der Umstieg auf das richtige Starterpack wird wohl nicht mehr gehen, ich bin ja schon mitten drin, ich muss halt mit den Macken leben :-\
-
Mensch, ich bin dafür, dass jeder direkt beim Fragestellen sowohl AGS- als auch Starterpackversion dabei schreiben sollte. Ich hoffe aber sowieso, dass die neueren Entwickler nach meinem "Tutorial-Upgrade" endlich mal die 3er Starterpacks nehmen werden.
-
Gute Idee, das mache ich ab jetzt so.
-
Wär super wenn du dann nicht der einzige wärst, der es so macht. ;)
-
Hi, jetzt würde ich gerne wissen, wie man abfragt, ob der Spieler ein bestimmtes Inventoryitem bei sich hat.
Benutze AGS3.12 mit (blöderweise) BernardSP272
-
Mit InventoryQuantity
Beispiel:
[ags]
if ( player.InventoryQuantity[iFernbedienung.ID] > 0 )
{
}
[/ags]
-
Super! Danke, hat geklappt.
-
So, nun möchte ich einen sich immer wiederholenden Sound im Hintergrund haben.
Habe es mit Repeatly Execte versucht, hat auch geklappt, aber leider ist es dann
nicht im Hintergrund, und man kann nicht spielen. :(
-
such in der ags hilfe nach ambient sound
-
Hat geklappt! Danke. :)
-
Hi, diesmal wieder mit einer ähnlichen Frage, wie die vorherige,
dieses Problem kann man aber diesmal nicht mit AmbientSound
umgehen. ;)
Und zwar will ich im Hintergrundgeschehen, also während man selber steuern kann ein Object Transparent machen und wieder zurück,
das alles ganz langsam. Im Repeatly Execute geht es ja nicht, da kann man dann ja nicht steuern. Wie mache ich das???
-
sicher geht das in der Repeatly Execute
du darfst da halt nicht eine schleife machen, sondern pro aufruf der Repeatly Execute wird der transparenzwert um eine stufe verringert bzw. erhöht
in ner globalen raumvariable merkst du dir ob du verringerst oder erhöhst und immer wenn das objekt opacity 100 oder 0 erreicht, wird die variable von erhöhen auf verringern (oder umgekehrt) umgeschaltet
-
Achso. Stimmt. Danke :D
-
Jetzt habe ich aber ein weiteres Problem, mit dem Repeatlyexecute-Transparenz-Objekt. Das Objekt soll extrem langsam die Transparenz ändern. So ca. alle 15 Sekunden ein % mehr oder weniger, je nachdem.
Wie bekomme ich das bewerkstelligt? Dezimalzahlen gehen ja leider nicht, sonst würde ich die benutzen :-\
-
stichwort timer!
initialisiere nen timer mit der von dir gewünschten verzögerung mittels SetTimer (siehe ags hilfe)
im repeatlyexecute checkst du dann, ob der timer abgelaufen ist und verringerst nur dann die transparenz ;)
und danach musst du den timer wieder mit SetTimer aktivieren
-
Danke, so hats geklappt!
Aber jetzt will ich noch einbauen, dass davor eine kleine Wartezeit ist. Ich hab das mal so versucht:
[ags]#sectionstart room_c // DO NOT EDIT OR REMOVE THIS LINE
function room_c() {
if(GetGlobalInt(21)==1) {
SetTimer (3, 80);
if(IsTimerExpired(3)==1) {
SetTimer (1, 40);
SetGlobalInt (21, 2);
}
}
if(GetGlobalInt(21)==2) {
if(IsTimerExpired(1)==1) {
if(oObject_X.Transparency > 0) {
oObject_X.Transparency -= 2;
SetTimer (1, 40);
}
}
}
}
#sectionend room_c // DO NOT EDIT OR REMOVE THIS LINE
[/ags]
Aber leider passiert jetzt garnichts mehr. Was ist hier falsch??
-
wenn GlobalInt(21) 1 ist, setzt du bei jedem aufruf der funktion den timer 3 neu
der wird somit wohl nie fertig werden :cl
wenn du wirklich nur ne wartezeit vor dem erstemal aufrufen einbauen willst, dann vergiss die GlobalInt und mach einfach ein SetTimer mit der selben nummer aber nem längeren delay beim AfterFadeIn des raums
in der rep_exec verwendest du einfach dann das richtige delay
-
Danke, hab es jetzt geschafft :D
-
Also, habe zwar nicht ganz verstanden, was du meintest, habe es jetzt aber so zum laufen gebracht (Ein Object Y soll während dem ganzen mit Transparent werden, aber immer nur auf 50% und zurück. Daher Auch nur immer 1 Prozent):
[ags]
#sectionstart room_a // First Time Enters Room
function room_a() {
SetTimer (1, 1580);
}
#sectionend room_a // First Time Enters Room
#sectionstart room_c // Repeatly Execute
function room_c() {
if (GetGlobalInt(21)==0) {
if(IsTimerExpired(1)==1) {
if(oObject_X.Transparency > 0) {
oObject_X.Transparency -= 2;
oObject_Y.Transparency +=1;
SetTimer (1, 10);
}
}
if(oObject_X.Transparency == 0) {
if (GetGlobalInt(22)==0) {
SetGlobalInt (21, 2);
SetTimer (1, 158);
SetGlobalInt (22, 2);
}
}
if(GetGlobalInt(21)==2) {
if(IsTimerExpired(1)==1) {
if(oObject_X.Transparency < 100) {
oObject_X.Transparency += 2;
oObject_Y.Transparency -=1;
SetTimer (1, 10);
}
}
}
if(oObject_X.Transparency == 100) {
if (GetGlobalInt(22)==2) {
SetGlobalInt (21, 0);
SetTimer (1, 158);
SetGlobalInt (22, 0);
}
}
}
}
#sectionend room_c // Repeatly Execute
[/ags]
Ich habe nun aber 2 Probleme:
1. Objekt X wird untransparent und Y Transparent, aber es geht nicht mehr zurück. Da finde ich den Fehler nicht...
2. Objekt Y wird komplett transparent, soll aber nur halb transparent werden. Wieso??
-
Probiers mal bitte mit ein wenig mehr Struktur. Bei deiner Version hast du wegen einem sinnlosen if völlig den Überblick verloren, warum es gar nicht gehen konnte. Natürlich kannst du auch wieder dein GI-22 einbauen und es meinetwegen beim 2. Schritt auf 2 setzen, aber mir erscheinen zwei GlobalInts für den selben Zweck sinnlos. ;D
[ags]#sectionstart room_a // First Time Enters Room
function room_a() {
SetTimer(1, 1580);
}
#sectionend room_a // First Time Enters Room
#sectionstart room_c // Repeatly Execute
function room_c() {
if(IsTimerExpired(1) == 1) {
if(GetGlobalInt(21) == 0) {
if(oObject_X.Transparency > 0) {
oObject_X.Transparency -= 2;
oObject_Y.Transparency +=1;
SetTimer(1, 10);
} else {
SetGlobalInt(21, 1);
SetTimer(1, 158);
}
} else {
if(oObject_X.Transparency < 100) {
oObject_X.Transparency += 2;
oObject_Y.Transparency -=1;
SetTimer(1, 10);
} else {
SetGlobalInt(21, 0);
SetTimer(1, 158);
}
}
}
}
#sectionend room_c // Repeatly Execute
[/ags]
-
Hey, Danke!
Habe aber leider immer noch das Problem, dass die Wolken nicht nur zu 50& transparent werden, sondern komplett.
Und sie tauchen auch nicht wieder auf :(
*Edit: Ok Vergesst es, Porblem gelöst :D
-
Transparente Wolken? Na da bin ich ja mal gespannt. ;D
-
Upps, jetzt habe ich den Namen des Objekts verraten. Aber nicht schlimm, das ist wirklich nichts spielrelevantes :)
-
2.72, Get/SetGlobalInt und keine Einrückungen?
Warum machst Du es Dir so schwer?
Viel Glück weiterhin, Du wirst es brauchen.
-
Normalerweise rücke ich ein, aber es kommt vor, dass ich es mal hinklatsche, auch wegen Zeitstress.
Aber ja, Einrückungen hätten mir hier geholfen.
-
Also, habe nun wieder folgendes Problem:
Ich möchte, dass der Spieler, wenn er versucht, etwas bestimmtes mit einem Hotspot zu machen, von einer anderen Person angekuckt und angeredet wird, dann guckt die Person wieder weg, also DOWN.
So habe ich es gemacht (Aussagende Namen, etc habe ich umbenannt):
[ags]else if (UsedAction (A_PULL)) {
if (MovePlayer (99, 117)) {
player.FaceLocation (97, 67);
Wait (5);
PlaySound (2);
Wait (7);
PlaySound (2);
Wait (7);
PlaySound (2);
Wait (35);
cBananenmann.FaceLocation (97, 80);
Wait (25);
cBananenmann.Say ("Ich bin eine Banane.");
Wait (5);
player.FaceLocation (154, 115);
Wait (5);
player.Say ("Schon gut.");
Wait (20);
cBananenmann.FaceLocation (149, 120);
}
}[/ags]
Alles klappt. Einziges Problem: Die Person sieht nicht wieder zurück. Ich weiß auch nicht wieso. Mit den Views stimmt alles. Die richtigen Koordinaten sind es ganz sicher.
Woran kann das liegen?
???
-
Probier es mal mit
[ags] cBananenmann.FaceLocation (cBananenmann.x, cBananenmann.y + 1);[/ags]
Oder schreib mal ein Wait(1); dahinter.
Übrigens sehe ich gerade, dass Du vermutlich in jedem Verb-Block am Anfang
[ags] if (MovePlayer (99, 117)) {
player.FaceLocation (97, 67);
Wait (5);[/ags]
drin stehen hast.
Das wurde leider früher so in den Tutorials gemacht; es ist viel geschickter, diesen Abschnitt zuerst aufzurufen und dann nach den Verben zu differenzieren. Spart viel Schreibarbeit.
-
Stimmt, ist ne gute Idee. Eigentlich spart es bei mir nicht viel, da ich meist immer nur alte Einträge kopiere und editiere. Aber die ein oder andere Stunde kann es am Ende ausgemacht haben :D
BTW: Das Problem habe ich anders gelöst, habe einen Fehler bei den View gemacht. Danke.
-
Wie kann man denn abfragen, ob ein InventoryItem bereits im Besitz des Spielers ist?
-
[ags]if (player.HasInventory(iBlah)) {
player.Say("Das hab ich, ist das nicht toll?");
} else {
player.Say("Wie schade, sowas hab ich nicht");
}[/ags]
-
Danke :)
-
So, ich habe mal wieder eine technische Frage:
Wenn ich in das Spiel eine Cutscene einbaue und diese skipbar ist, gibt es dann eine Möglichkeit, abzufragen, ob sie geskippt wurde?
-
Hilfedatei... (StartCutscene, See Also: ...)
static bool Game.SkippingCutscene
Returns whether the player has elected to skip the current cutscene. This will return true if the game is between a StartCutscene and EndCutscene command, and the player has chosen to skip it.
Z.B. so:
[ags]
... // cutscene code
bool player_skipped = Game.SkippingCutscene;
EndCutscene();
if (player_skipped) Display("Heh! Du hast ja übersprungen!);[/ags]
-
Danke :D