item-limitation und inventarerweiterung

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
der neue

item-limitation und inventarerweiterung

Beitrag von der neue »

ich kenne mich noch nicht so richtig gut aus in ags weshalb ich hier nach hilfe suche. ich wollte dass mein hauptcharakter nur eine bestimmte anzahl an items tragen kann. wenn er z.b. drei items bei sich trägt dann ist er voll beladen und kann keine weiteren items mehr aufnehmen. man soll aber auch items finden können die dann das inventar vergrößern auf z.b. 6 freie itemplätze. aber da ich mich noch nicht so gut auskenne und ags erst seit kurzem benutze wollte ich fragen ob ihr mir helfen könnt und mir sagen könnt wie das gehen könnte. vielleicht auch mit einem besispiel das wäre nett. danke.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Wenn der Spieler einen Gegenstand genommen hat, würdest Du normalerweise das hier schreiben:

Code: Alles auswählen

player.AddInventory(iItem);
Du schreibst stattdessen folgendes an den Anfang des Global scripts:

Code: Alles auswählen

int max_items;
export max_items;

function CountInv() {
  int cnt=0;
  int c=1;
  while (c<=100) {  // die 100 entsprechend erhöhen, wenn mehr Gegenstände da sind
    cnt=cnt+player.InventoryQuantity[c];
  }
  return cnt;
}

function myAddInv(InventoryItem *item) {
  if (CountInv()=max_items) {
    player.Say("Ich trage schon zuviele Sachen mit mir herum.");
  }
  else {
    player.AddInventory(item);
  }
}
In den Script header:

Code: Alles auswählen

import myAddInv(InventoryItem *item);
import max_items;
Wenn der Spieler jetzt einen Gegenstand aufnimmt, schreibst Du einfach:

Code: Alles auswählen

myAddInv(iItem);
Wenn er etwas nimmt, das dass Inventar vergrößert, schreibst Du z.B.:

Code: Alles auswählen

player.AddInventory(iRucksack);
max_items=max_items+3;
Wichtig: diese Funktion zählt alle Items, die der Spieler hat, sie würde also auch den Rucksack mitzählen. Wenn Du das verhindern willst, muss die CountInv()-Funktion z.B. so aussehen:

Code: Alles auswählen

function CountInv() {
  int cnt=0;
  int c=1;
  while (c<=100) {  // die 100 entsprechend erhöhen, wenn mehr Gegenstände da sind
    if (c<>iRucksack.ID && c<>iGuerteltasche.ID) {
      cnt=cnt+player.InventoryQuantity[c];
    }
  }
  return cnt;
}
Use gopher repellent on funny little man
der neue

Beitrag von der neue »

bei mir kommt folgender fehler:

Bild

int max_items;
export max_items;

function CountInv() {
int cnt=0;
int c=1;
while (c<=100) { // die 100 entsprechend erhöhen, wenn mehr Gegenstände da sind
cnt=cnt+player.InventoryQuantity[c];
} /////////////LINE 23///////////
return cnt;
}

function myAddInv(InventoryItem *item) {
if (CountInv()==max_items) { /////////////LINE 28///////////
player.Say("Ich trage schon zuviele Sachen mit mir herum.");
}
else {
player.AddInventory(item);
}
}

myAddInv(iPoster); /////////////Room 1 LINE 21///////////


ich würde ja gerne selber den fehler finden bzw nach ihm suchen aber ich verstehe nur sehr wenig von dem code. ich hoffe du kannst mir noch einmal helfen. danke.[/quote]
Smiley
Hobby-Archäologe
Hobby-Archäologe
Beiträge: 163
Registriert: 28.04.2005, 16:26
Wohnort: Mönchengladbach

Beitrag von Smiley »

der neue hat geschrieben: ich würde ja gerne selber den fehler finden bzw nach ihm suchen aber ich verstehe nur sehr wenig von dem code. ich hoffe du kannst mir noch einmal helfen. danke.
Das Skript hängt, weil die While-Schleife "ewig" durchlaufen wird.
khrismuc hat, wenn ich das richtig sehe, nur ein "c++" vergessen:

Code: Alles auswählen

function CountInv() {
  int cnt=0;
  int c=1;
  while (c<=AGS_MAX_INV_ITEMS) {  
    cnt=cnt+player.InventoryQuantity[c];
    c++;
  }
  return cnt;
} 
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Genau, das passiert mir öfter :)
Danke, Smiley

@der neue:
die beiden Funktion sind eigentlich recht einfach, CountInv() zählt alle Inventargegenstände, und myAddInv() prüft, ob das Inventar voll ist.

player.InventoryQuantity[c] liefert die Anzahl Gegenstände der Nummer c, die der Spieler im Inventar hat. Normalerweise 0 oder 1. Mit der Variable c zähle ich alle Gegenstände von 1 bis 100 durch, mit cnt zähle ich deren Anzahl, indem ich ständig hinzuaddiere, wieviel von einem Gegenstand im Inventar ist. Mit iItem.ID erhalte ich die Nummer des Gegenstandes, die if-Abfrage stellt sicher, dass ein paar Objekte nicht mitgezählt werden.
Use gopher repellent on funny little man
der neue

Beitrag von der neue »

danke leute! jetzt funktionierts einwandtfrei! :D
Antworten