-
Gothic 1 kann int Funktionen nicht mehr richtig auswerten?
Hallodeli,
mein Gothic macht im Moment unglaubliche Faxen.
Ich habe eine func int, welche TRUE oder FALSE zurückgibt. Etwa dieses Schema:
Code:
func int PC_Canlearnnow (var int hour, var int minute)
{
if hour>12
{
print ("Kein Lernen über 12 Stunden");
return FALSE;
};
if minute >=60
{
print ("Keine Minuten >=60");
return FALSE;
}:
if Hunger<(Hungermax/4)
{
print ("Du bist zu hungrig");
return FALSE;
};
return TRUE;
};
Hunger ist eine Globale Variable, die hier abgefragt wird. Der Rest ist lokal.
Die Abfrage:
Code:
if PC_CanLearnNow(3,10)==TRUE
{
print ("Produziere Item");
};
Im Spiel habe ich nun einen hungrigen Charakter, die Hungerabfrage müsste mir FALSE zurückgeben. Ich WEISS, dass sie auch wirklich getriggert wird, denn der print kommt im Spiel. Aber das Return wird von Gothic nicht richtig verarbeitet. Ich bekomme nämlich BEIDE Prints!
Sowohl "Du bist zu hungrig" als auch "Produziere Item. Da stimmt doch was nicht!
Ein weiteres Problem ist, dass das nicht sofort auftritt. Ab Anfang funktioniert die Abfrage blendend, aber nach ca. 20 Minuten Spielzeit fängt das Problem an. Auch Vobs, die ich in einer Framefunction mit Vob_turn animiere bleiben plötzlich stehen. Ist das etwa zu viel für den alten Gaul?
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Hi Bisasam,
What exactly is happening with Hunger and Hungermax values, maybe they are changing so quickly that you are getting both outputs TRUE FALSE right after each other.
-
07.12.2019 22:29
#3
Wenn ich es richtig erkenne, gibst du immer ein true zusätzlich dazu
-
Zitat von Falugify
Wenn ich es richtig erkenne, gibst du immer ein true zusätzlich dazu
Wenn ein return ausgeführt wird, dann wird die Funktion direkt an dieser Stelle verlassen, so dass spätere Return Statements nicht erreicht werden.
-
Könntest du mal die folgenden Änderungen in deinen Code einbauen und testen, ob die Funktion an besagter Stelle wirklich nur einmal aufgerufen wird?
Code:
int GLOBAL_COUNTER;
// once before calling PC_CanLearnNow the first time
GLOBAL_COUNTER = 0;
// advance the counter at the beginning of PC_CanLearnNow
// and add the counter to all messages
func int PC_Canlearnnow (var int hour, var int minute)
{
GLOBAL_COUNTER += 1;
if hour>12
{
print (ConcatStrings("Kein Lernen über 12 Stunden: ", IntToString(GLOBAL_COUNTER)));
return FALSE;
};
if minute >=60
{
print (ConcatStrings("Keine Minuten >=60: ", IntToString(GLOBAL_COUNTER)));
return FALSE;
}:
if Hunger<(Hungermax/4)
{
print (ConcatStrings("Du bist zu hungrig: ", IntToString(GLOBAL_COUNTER)));
return FALSE;
};
return TRUE;
};
// Change the producer function
if PC_CanLearnNow(3,10)==TRUE
{
print (ConcatStrings("Produziere Item: ", IntToString(GLOBAL_COUNTER)));
};
Geändert von Neconspictor (08.12.2019 um 20:13 Uhr)
-
Was soll mir diese Variable genau sagen? Wie oft die Funktion aufgerufen wird? Was soll dieser Test bewirken und aussagen?
Wenn du mir mitteilst wo du ein Problem vermutest, kann ich auch selbst noch etwas genauere Tests machen.
Achja, mal ne Frage. Hat dieser Code:
Code:
if PC_CanLearnNow(1,00)
{
print("Produziere Item");
};
und dieser Code:
Code:
if PC_CanLearnNow(1,00)==TRUE
{
print("Produziere Item");
};
die gleiche Wirkung? Oder würde ohne das ==TRUE die Überprüfung verfälscht?
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Zitat von Bisasam
Was soll mir diese Variable genau sagen? Wie oft die Funktion aufgerufen wird? Was soll dieser Test bewirken und aussagen?
Wenn du mir mitteilst wo du ein Problem vermutest, kann ich auch selbst noch etwas genauere Tests machen.
Es geht darum, ob die beiden Prints, die von dir beobachtet wurden, in demselben Funktionsaufruf auftreten, oder ob eben in zwei unterschiedlichen(die sehr schnell hintereinander aufgerufen werden). Bei letzterem würde dann der Code ja korrekt ausgeführt.
Zitat von Bisasam
Achja, mal ne Frage. Hat dieser Code:
Code:
if PC_CanLearnNow(1,00)
{
print("Produziere Item");
};
und dieser Code:
Code:
if PC_CanLearnNow(1,00)==TRUE
{
print("Produziere Item");
};
die gleiche Wirkung? Oder würde ohne das ==TRUE die Überprüfung verfälscht?
Das sollte keinen Unterschied machen, das == TRUE ist aber unnötig und kannst du weglassen.
-
Zitat von Bisasam
Achja, mal ne Frage. Hat dieser Code:
Code:
if PC_CanLearnNow(1,00)
{
print("Produziere Item");
};
und dieser Code:
Code:
if PC_CanLearnNow(1,00)==TRUE
{
print("Produziere Item");
};
die gleiche Wirkung? Oder würde ohne das ==TRUE die Überprüfung verfälscht?
Das ist fast das selbe (in deinem konkreten Fall ist es aber gleich). Grundsätzlich ist eine Bedingung dann wahr, wenn sie nicht falsch ist (duh). Das heißt jeder Wert, der nicht falsch (0) ist, gilt als wahr. Wenn du aber konkret mit TRUE vergleichst, sind nur die Bedingungen war, die auch wirklich 1 zurückgeben. Würde PC_CanLearnNow also z.B. 2 zurückgeben, würde deine Bedingung das als falsch erkennen. Lässt du den Vergleich mit TRUE weg, würde der Wert 2 zu einer "wahren" Bedingungen führen.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|