Problem mit Variablen

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Problem mit Variablen

Beitrag von TheRock »

Hier der Code für eine Region im Hauptmenü, die bewirkt, dass
zum vorherigen Raum kommt(ResumeGame)

Code: Alles auswählen

player.ChangeRoom(player.PreviousRoom, GetGlobalInt(9), GetGlobalInt(8));
Hier ein ausschnitt des GlobalScripts:

Code: Alles auswählen

if (keycode == 27)
{
  SetGlobalInt (8, player.x); SetGlobalInt(9, player.y);
  character[EGO].ChangeRoom(1,  350, 200);
  
  }
Er bewirkt, dass man beim esc-Drücken
ins Hauptmenü kommt und weißt den globalen Variablen 8/9
die Position des Spielers zu
und wechselt den Spieler ins Hauptmenü!


Wenn ich jetz Esc drücke, kommt der Charakter ins Hauptmenü,
wenn ich nun ResumeGame drücke kommt er manchmal zu der richtigen Position in den vorherigen Raum,
manchmal allerdings ganzwoanders hin (und das mit der Größe [40%], die er im Hauptmenü hatte)!
Wenn ich nun wieder Esc drücke und dann ResumeGame, kommt er wieder auf die richtige Position!

Woran liegt das?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Das liegt daran, dass Du die 8 und die 9 vertauscht hast, somit schickst Du ihn zurück zu player.y, player.x statt x,y.

Deswegen behält er auch manchmal die 40% bei, weil er nämlich außerhalb einer walkable area landet, welche ihn wieder auf die richtige Größe setzen würde.

Nachtrag: Genau aus diesem Grund würde ich übrigens jedem empfehlen, sich mit globalen Variablen vertraut zu machen, da dann die nichtssagenden Zahlen wegfallen.

global

Code: Alles auswählen

int px;
int py;
export px, py;

...
if (keycode==27) {
  px=player.x;
  py=player.y;
...
header

Code: Alles auswählen

import int px;
import int py;
room

Code: Alles auswählen

player.ChangeRoom(player.PreviousRoom, px, py);
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

LOL
und ich hab extra nachgeguckt, ob sie verkehrt herum waren :oops:
Und habs nicht gecheckt!?!?! :roll:
Danke, wär vermutlich in 100 Jahren nicht draufgekommen


Habe schon wieder ein neues Problem:

Ich will zwei Inventargegenstände miteinander kombinieren:

Objaekt 3:

Code: Alles auswählen

if (character[GetPlayerCharacter()].activeinv == 4) {
LoseInventory(3);
LoseInventory(4);
SetGlobalInt(7, 1);
AddInventory(5);
InterfaceOff(3);
}
Und Objekt 4:

hat denselben code nur halt nicht 4 sondern 3 oben rechts!

Trotzdem funktioniert es nur mit Inventar 3 auf 4 und nicht umgekehrt?!
Wo ist der Fehler?
Gibts nen Befehl, dass er beides abcheckt, oder muss man den Code immer auf zwei Objekte übertragen?
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Überprüf mal, ob Du bei Objekt 4 den code auch ganz sicher bei "use inv on inv" reingeschrieben hast.

Ansonsten solltest Du wirklich den neuen Code verwenden:

Code: Alles auswählen

if (player.ActiveInventory==iGegenstand3) {
  player.LoseInventory(iGegenstand3);
  player.LoseInventory(iGegenstand4);
  SetGlobalInt(7, 1);
  player.AddInventory(iGegenstand5);
  gGui3.Visible=false;
}
Wenn Du den Code nicht zweimal schreiben willst, musst Du bereits in der on_mouse_click die Werte von player.ActiveInventory und game.inv_activated abfragen und entsprechend reagieren, anstatt ProcessClick(...); aufzurufen.
Ist aber etwas kompliziert.

Grundsätzlich kannst Du identischen Code immer zu einer Funktion zusammenfassen und einfach diese aufrufen.

Code: Alles auswählen

function inv34 () {
  player.LoseInventory(iGegenstand3);
  player.LoseInventory(iGegenstand4);
  SetGlobalInt(7, 1);
  player.AddInventory(iGegenstand5);
  gGui3.Visible=false;
}
und dann z.B. bei Objekt 4:

Code: Alles auswählen

if (player.ActiveInventory==inventory[3]) {
  inv34();
}
Benutzeravatar
TheRock
Rätselmeister
Rätselmeister
Beiträge: 2136
Registriert: 21.05.2006, 19:13
Wohnort: Berlin
Kontaktdaten:

Beitrag von TheRock »

Es war tatsächlich bei interact object!!!!!!!!! :roll:
Ich trottel!!!!! :oops:
Warum sind die einfachsten Fehler immer die unfindbaren?!?!
:evil: Danke :wink:
Antworten