Inventarscroll Funktionen...

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
xeres
Frischling
Frischling
Beiträge: 7
Registriert: 02.04.2007, 16:10

Inventarscroll Funktionen...

Beitrag von xeres »

Also Hallo allerseits...
Ich habe da irgendwie ein kleines Problem mit meinem Inventar...
Nämlich: Wenn der Platz für 10 Items voll ist, sollte man hoch und herunter scrollen können...
Alle möglichen Lösungen für dieses Problem werden immer so in der Art gelöst:
(wobei button 1 für hoch, button 2 für runterscrollen ist...)

Code: Alles auswählen

// Inventory Scrolling:
     if (button == 1)
    {
      if (game.top_inv_item < game.num_inv_items - game.num_inv_displayed)
      {
        game.top_inv_item = game.top_inv_item + (game.num_inv_displayed / 2);
      }
    }
    if (button == 2)
    {
      if (game.top_inv_item > 0)
      {
        game.top_inv_item = game.top_inv_item - (game.num_inv_displayed / 2);
      }
    }
Problem: Ich bekomme den Error " '.top_inv_item' is not a public member of 'GameState'. "
Was besonders komisch ist, da der selbe Code im AGS-Starterpack für MMM ohne Beanstandung durchgeht...

Ich hab mir die Hilfe von AGS mal durchgeschaut, und da waren die Befehle im obigen Code teilweise veraltet, teilweise nicht mehr auffindbar... Darum habe ich es jetzt mal damit probiert:

Code: Alles auswählen

if (button == 1) {
	invMain.ScrollUp();
	UpdateInventory ();
  }

	if (button == 2) {
  invMain.ScrollDown();
  UpdateInventory ();
  }
Laut Hilfe:
Scrolls the inventory window up one line, if there are more items to display. If the inventory window is already at the top, then nothing happens.
sollte das eigentlich auch funktionieren, tut es aber nicht. Das UpdateInventory (); habe ich versuchsweise hinzugefügt bringt aber auch keine verbesserung.

Zusammenfassend: Die erste Lösungsmöglichkeit produziert bei mir einen Fehler, die zweite wird nicht beanstandet, funktioniert aber offenbar nicht. - Was hab ich jetzt übersehen?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Es gab ein paar kleinere Änderungen seit 2.72.
game ist eine Instanz der Klasse GameState, und da aus der Definition letzerer die inv_item-Sachen gestrichen wurden, kommt der Fehler.

Z.B. statt game.top_inv_item musst Du jetzt InvWindow.TopItem abfragen, wobei Du natürlich statt InvWindow den Scriptname Deines Inventarfensters einsetzen musst.

Damit gleich zum zweiten Problem: ist der Skriptname Deines Inventarfensters wirklich invMain?
Use gopher repellent on funny little man
xeres
Frischling
Frischling
Beiträge: 7
Registriert: 02.04.2007, 16:10

Beitrag von xeres »

Das Inventar ist invMain, genau in dieser Schreibweise :wink:
Ich hatte auch game.top_inv_item mit InvWindow.TopItem versucht zu ersetzen, das Problem war dann, dass für game.num_inv_displayed kein Ersatz besteht (jedenfalls finde ich es in der Hilfe) nicht und damit immer eine Fehlermeldung kommt.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Äh ja, wie ich schrieb, musst Du natürlich invMain.TopItem benutzen. InvWindow ist der Name der Klasse.

game.num_inv_displayed ist jetzt in deinem Fall invMain.ItemCount.
Use gopher repellent on funny little man
xeres
Frischling
Frischling
Beiträge: 7
Registriert: 02.04.2007, 16:10

Beitrag von xeres »

Also...

game.top_inv_item = invMain.TopItem
game.items_per_line = invMain.ItemsPerRow
game.num_inv_items = invMain.ItemCount (laut Hilfe)
game.num_inv_displayed = ? (könnte invMain.ItemAtIndex[] sein?)

Wenn ich game.num_inv_displayed ebenfalls mit invMain.ItemCount ersetze gibt es keinen Fehler, allerdings funktioniert es so auch nicht...
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Des Zeug ist eh alles veraltet, Du brauchst nur ScrollUp(); und ScrollDown();

Hast Du mehr als 10 Items drin?

Ansonsten würde ich mal ein Display("test"); dazuschreiben, um sicherzugehen, dass die Befehle überhaupt aufgerufen werden.

Und interface_click sollte man eh nicht mehr verwenden, Buttons haben inzwischen ihre eigene OnClick-Funktion.
Use gopher repellent on funny little man
xeres
Frischling
Frischling
Beiträge: 7
Registriert: 02.04.2007, 16:10

Beitrag von xeres »

Argh! Es stand praktisch schon da... Und wenn man auch alle Klammern hübsch schließt geht es auch so...
Vielen Dank für den Hinweis mit der OnClick funktion. Ich hab die Zeilen im Global script wegen dem "DO NOT EDIT OR REMOVE THIS LINE" zu wenig beachtet. :?
War alles mal wieder viel einfacher als gedacht. :idea:

Code: Alles auswählen

#sectionstart btnInvUp_Click  // DO NOT EDIT OR REMOVE THIS LINE
function btnInvUp_Click(GUIControl *control, MouseButton button) {  

invMain.ScrollUp();

}
#sectionend btnInvUp_Click  // DO NOT EDIT OR REMOVE THIS LINE

#sectionstart btnInvDown_Click  // DO NOT EDIT OR REMOVE THIS LINE
function btnInvDown_Click(GUIControl *control, MouseButton button) {

invMain.ScrollDown();

}
#sectionend btnInvDown_Click  // DO NOT EDIT OR REMOVE THIS LINE

Für alle die Nachschlagen: Der Button zum hochscrollen hat hier den Script name "btnInvUp" und entsprechen steht bei Click "btnInvUp_Click". "invMain" ist der Script name der Inventarbox
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Man kann übrigens durch Doppelklick auf das GUIControl direkt zur _Click-Funktion springen.
Falls man einen Button/was anderes hinzufügt, gibt man ihm einen Scriptname, stellt Left click auf Run script und klickt dann doppelt drauf, dann wird die _Click-Funktion angehängt und auch wieder dorthin gesprungen.
Use gopher repellent on funny little man
Antworten