Autor Thema: Scrollpfeil vom Inventar  (Gelesen 3361 mal)

Kiwa

  • volljähriger Tentakel
  • *****
  • Beiträge: 779
  • Geschlecht: Männlich
    • Profil anzeigen
Scrollpfeil vom Inventar
« am: 22. Mai 2013, 23:01:39 »
Hallo zusammen,

welche Möglichkeiten gibt es um bei AGS 3.2.1 das Inventar zu aktualisieren und (wenn es leer ist) das der Scrollpfeil nicht mehr angezeigt wird?

Ja, UpdateInventory habe ich schon ausprobiert. Bringt aber nix. Situation: player verliert ganzes Inventar, doch der Scrollpfeil bleibt. Wenn man jetzt etwas nimmt, ist es im Inventar nicht sichtbar. Man muss erst auf den Scrollpfeil klicken um es zu sehen. Das ist doof. Wie schon gesagt, hat UpdateInventory nicht geholfen.

Gibt es für den Scrollpfeil ein extra Befehl (das er verschwindet wenn das Inventar leer ist)? Oder gibt es sonst noch Möglichkeiten?
 
Gruß Kiwa
Das Leben ist ein Adventure. Aber ohne Komplettlösung.

Für fast alles gibt es eine logische Erklärung. Für alles andere ein Placebo.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #1 am: 22. Mai 2013, 23:51:29 »
Erstelle / geh zu on_event, dann benutz eEventAdd/LoseInventory.

Ich dachte eigentlich, dass in den Starterpacks falls nötig automatisch nach oben gescrollt wird; evtl. ist das flöten gegangen.
Lässt sich aber leicht selbst einbauen; einfach bei eEventLoseInventory überprüfen, ob InvWindow.TopItem > InvWindow.ItemCount ist, und falls ja, scrollen (über InvWindow.TopItem bzw. die vorhandenen Funktionen, die von den Scrollpfeilen aufgerufen werden).
Mittels der gleichen Methode kann man auch die Scrollpfeile aus- und einblenden. Es müssten acht sichtbare items sein, also einfach InvWindow.ItemCount > 8: Pfeile an, ansonsten aus.
Die Scrollpfeile sind schlicht Buttons und können über .Visible oder .Enabled ausgeblendet bzw. deaktiviert werden.

Einen "extra Befehl" gibt es für sowas selten; komplexe Programmteile sind i.d.R. aus simplen zusammengesetzt, man muss nur den Zusammenhang überblicken.

Kiwa

  • volljähriger Tentakel
  • *****
  • Beiträge: 779
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #2 am: 23. Mai 2013, 00:11:45 »
Danke erstmal für deine schnelle und umfangreiche Antwort.

Ich habe in meinem Projekt nach "eEventLoseInventory" gesucht (Strg. F) aber AGS hat es nicht gefunden. Zuerst habe ich nur im GlobalScript danach gesucht, dann das ganze Projekt. Wo soll das "eEventLoseInventory" den stehen, in welcher Datei/Script?

Falls ich es selber einbauen muss, wo am besten?

EDIT: Die on_event Funktion habe ich im GlobalScript gefunden. Soll ich dort die Parameter "int event, int data" auf 5 4 abprüfen? Die Zahlen habe ich von der Homepage die du verlinkt hast. Bei den Zahlen steht "Other click on inventory". Sind damit auch die Scrollpfeile gemeint?

Da das GlobalScript sehr wichtig ist, will ich da nix falsch machen und lieber doppelt nachfragen. Zum entfernen von Items habe ich immer die LoseInventory Funktion benutzt.


Habe das eEventLoseInventory gefunden. Hab jetzt verstanden wie du es meinst. Nur das mit dem scrollen klappt noch nicht.
Habe jetzt folgendes im GlobalScript in die on_event Funktion eingebaut:

[ags]if (event == eEventLoseInventory){
      if (InvWindow.TopItem > InvWindow.ItemCount){
         
      }
  }[/ags]

Was muss jetzt genau in die If-Klammer?
« Letzte Änderung: 23. Mai 2013, 00:38:25 von Kiwa »
Das Leben ist ein Adventure. Aber ohne Komplettlösung.

Für fast alles gibt es eine logische Erklärung. Für alles andere ein Placebo.

Kiwa

  • volljähriger Tentakel
  • *****
  • Beiträge: 779
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #3 am: 23. Mai 2013, 14:29:15 »
Sorry für den Doppelpost aber mir ist gerade was aufgefallen:
Ich habe gerade zum ersten mal versucht das Spiel so zu starten (mit der Änderung, wie sie im obigen Post beschrieben ist) doch das funktioniert nicht. AGS sagt dann:

GlobalScript.asc(2482): Error (line 2482): must have an instance of the struct to access a non-static member
--> das ist folgende Zeile: if (InvWindow.TopItem > InvWindow.ItemCount){

Was jetzt? Wenn man InvWindow. eingibt wird auch kein Kontextmenü angezeigt. Ich hatte es nur reinkopiert, aber nicht getestet. Am besten den ganzen richtige Code posten, danke.
Das Leben ist ein Adventure. Aber ohne Komplettlösung.

Für fast alles gibt es eine logische Erklärung. Für alles andere ein Placebo.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #4 am: 24. Mai 2013, 02:49:55 »
InvWindow ist der Name der Klasse; wie das Inventarfenster im Starterpack heißt, wusste ich nicht mehr. Der Name ist "gMainInventory".

Bei der Gelegenheit habe ich auch in die repeatedly_execute geschaut, und da findet sich ganz am Ende jede Menge Inventar-Code, u.A. auch Befehle, mit denen die Scrollpfeile grafisch "ausgeschaltet" werden.
Auch automatisches nach-oben-scrollen findet sich dort:

[ags]   InvWindow *invMain = gMainInventory;
   if ( null != invMain.ItemAtIndex[0] )
   {
      if ( 0 != gMainInventory.TopItem )
      {
         // if inventory can scroll up
         gMainInvUp.NormalGraphic = invUparrowONsprite;
         InventoryItem *invItem = InventoryItem.GetAtScreenXY(180, 160);
      
         if (invItem.ID < 0)
            gMainInventory.ScrollUp();
      }
      else
         gMainInvUp.NormalGraphic = invUparrowOFFsprite;
   }
   if ((gMainInventory.TopItem + (gMainInventory.ItemsPerRow * gMainInventory.RowCount)) < gMainInventory.ItemCount)
      gMainInvDown.NormalGraphic = invDownarrowONsprite;
  else
      gMainInvDown.NormalGraphic = invDownarrowOFFsprite;[/ags]

Somit ist also praktisch alles, was Du erreichen willst, bereits eingebaut. Oder fehlt das eben doch in Deinem Starterpack?

Kiwa

  • volljähriger Tentakel
  • *****
  • Beiträge: 779
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #5 am: 24. Mai 2013, 13:57:40 »
Danke, das Problem ist jetzt gelöst. Aber etwas anders als du es vorgeschlagen hast. Ich hatte deinen Code in die on_event Funktion kopiert (in die "if (event == eEventLoseInventory){....}" Klammer.

Das hat so aber nix gebracht. Das Spiel läuft zwar aber das Problem bleibt. Dann habe ich einfach ein "bißchen" experimentiert. Jetzt habe ich folgendes in der on_event Funktion:

[ags]  if (event == eEventLoseInventory){
    if (Inventar_scrollen == true){
      Inventar_scrollen = false;
      gMainInvUp.NormalGraphic = invUparrowOFFsprite;
      gMainInventory.ScrollUp();
    } 
  }
[/ags]

Das "Inventar_scrollen" ist eine globale Variable die ich für diesen Zweck eingebaut habe. Wenn der gewünschte Effekt eintreten soll wird vorher im Roomscript die Variable auf true gesetzt. So funktioniert es.  :D  Es klappt zwar auch ganz ohne Variable aber mir ist das zu riskant. Ich weiß nicht ob es dann irgendwo an einer anderen Stelle im Spiel kracht. So gehe ich auf Nummer sicher. Was sagst du dazu? Gut, oder eher schlecht (vom Standpunkt des scriptens her betrachtet) ?
Das Leben ist ein Adventure. Aber ohne Komplettlösung.

Für fast alles gibt es eine logische Erklärung. Für alles andere ein Placebo.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #6 am: 24. Mai 2013, 15:52:11 »
Ich würde sagen, "schlut" bzw. "gecht" ;D

Der Witz ist ja, wenn das eh nur an einer bestimmten Stelle passiert, brauchst Du das ganze on_event-Dingens gar nicht; Du kannst es auch einfach  an die entsprechende stelle im Raumskript setzen.

Was mich viel mehr interessiert ist aber, warum Du ein Starterpack verwendest, in dem elementarer Code fehlt...?
Welches benutzt Du? Und ist bei Dir in der rep_exe der von mir zuletzt gepostete Code oder nicht?

Kiwa

  • volljähriger Tentakel
  • *****
  • Beiträge: 779
  • Geschlecht: Männlich
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #7 am: 24. Mai 2013, 21:38:11 »
Ich würde sagen, "schlut" bzw. "gecht" ;D

Na, das nenne ich mal eine dimplomatische Antwort   ::)

Der Witz ist ja, wenn das eh nur an einer bestimmten Stelle passiert, brauchst Du das ganze on_event-Dingens gar nicht; Du kannst es auch einfach  an die entsprechende stelle im Raumskript setzen.

Der Witz ist, das habe ich auch u.a. (nachdem deine Methode nicht geklappt hatte) versucht (kein Scherz). Zuerst habe ich nur "gMainInventory.ScrollUp();" benutzt (im Roomscript). Ergebnis war, das es nur halb klappte. Pfeil blieb stehen, wenn man aber was genommen hat, verschwand er sofort und man konnte das Item auch sehen und benutzen. Dann habe ich weiter experimentiert weil ich den Pfeil auch noch weg haben wollte. Viele mißlungene Experimente später habe ich dann auch das "gMainInvUp.NormalGraphic = invUparrowOFFsprite;" ins Roomscript übernommen. Wenn man dann das Spiel starten wollte verweigerte dies AGS mit den Worten:
 "undefined symbol 'invUparrowOFFsprite'". So und so ähnlich gings dann ne Weile weiter bis hin zur jetzigen Lösung.

Was mich viel mehr interessiert ist aber, warum Du ein Starterpack verwendest, in dem elementarer Code fehlt...?
Welches benutzt Du? Und ist bei Dir in der rep_exe der von mir zuletzt gepostete Code oder nicht?

Ich wusste nicht das hier irgendwelcher Code fehlt, wie sollte ich? Sooo lange bin ich nun auch noch nicht mit AGS unterwegs das ich das alles weiß (seit Jan diesen Jahres). Naja, jetzt habe ich wieder was gelernt. Ich benutze das .... ähm wenn ich das sage verrate ich schon zuviel über die nächste Epi.  :P  Ich werds dir aber gerne sagen wenn ich veröffentlicht habe (welches SP in welcher Version). Ich glaube, was in der rep_exe steht kann ich ruhig posten:

Spoiler (hover to show)
Das Leben ist ein Adventure. Aber ohne Komplettlösung.

Für fast alles gibt es eine logische Erklärung. Für alles andere ein Placebo.

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Scrollpfeil vom Inventar
« Antwort #8 am: 25. Mai 2013, 16:28:05 »
Langsam, langsam :)
Ich hab nicht erwartet, dass Du auswendig weißt, wo welcher Code hin gehört. Ich hatte aber in meinem vorletzten Beitrag geschrieben, dass das von Dir Gewünschte eigentlich bereits funktionieren sollte. Auf diesen Teil des Beitrages bist Du aber überhaupt nicht eingegangen, deswegen hab ich nochmal nachgefragt.

Konkret geht es um zwei Dinge:
a) Scrollpfeile nur anzeigen, wenn sie auch gebraucht werden
b) Inventar automatisch nach oben scrollen, falls es zu weit nach unten gescrollt ist.

Bzgl. a) willst Du, soweit ich Dich verstanden habe, die Pfeile komplett weghaben, nicht nur ausgegraut. Das geht, indem Du einfach die entsprechenden Sprites veränderst. Die Nummern findest Du im GlobalScript, in der Definition der Variablen invUparrowOFFsprite und invDownarrowOFFsprite. Diese Variablen sind nicht global, deswegen bekommst Du im Raumskript den Fehler, Du hättest aber die Buttons stattdessen einfach unsichtbar machen können (was Du ja eh wolltest). Der entsprechende Befehl lässt sich im Raumskript direkt verwenden.

Bzgl. b) sollte der existierende Code eigentlich funktionieren. Wenn er das nicht tut, liegt es vermutlich daran, dass Du ein Starterpack verwendest, bei dem die Koordinaten 180;160 nicht mehr über dem ersten sichtbaren Invitem liegen. Wenn das der Grund ist, und Du die Koordinaten entsprechend anpasst, sollte alles wie gewünscht funktionieren, komplett ohne zusätzlichen Code.

Du kannst mir auch eine PM schicken und schreiben, welches SP Du verwendest, dann kann ich den Code überprüfen.
« Letzte Änderung: 25. Mai 2013, 16:29:24 von KhrisMUC »