


Zur Zeit online: keiner ausser dir |


Seite: << [1] [2] [3] [4] [5] [6] [7] [8] 9 [10] .. [17] [18] >> |
Autor |
Mitteilung |
|
verfasst am: 30.06.2007, 17:28 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Er ist allerdings ein indirekter Hinweis darauf, das Du irgendwo vorher einen unglücklichen (d.h. nicht der korrekten Syntax entsprechenden aber trotzdem keinen Fehler erzeugenden) Code stehen hast.
Ich hab durch Zufall herausgefunden, woran es lag.
uses UKI_BAgeo;
Das war noch drin, da ich vorhatte, die zu nutzen. Hab mir dann aber gesagt, da die Landung-unit eingebunden werden soll, soll jedes script dann selbst eine Position festlegen. (Möglich wär ja, dass erst noch eine andere Berechnung durchgeführt werden soll)
Nachdem ich das gelöscht habe, kam kein Fehler mehr, als ich diesbezüglich noch mal probieren wollte.
{überholter Gedankengang: Dafür hab ich jetzt woanders, wo vorher die (wahrscheinlich) gleiche Meldung kam, diese mit einer (Adresse 00000) 21 statt einer 20. (siehe weiter oben, da hatte ich das am Anfang mal erwähnt)}
probiert: Ressourcenbeschaffung: mit uses: Aliens_Active 21, ohne: 20
Solariermuellkippe: immer 21 (benutzt keine uses)
...
Schlussfolgerung aus den Beobachtungen:
- Die (aktive) Verwendung von uses (egal welche) legt die Adresse scheinbar von 21 auf 20. Wenn die uses XXX nicht angesprochen wird, ändert sich nichts. - falls das irgeneine Hilfe ist.
- Die Verwendung von uses UKI_BAgeo; hat den Punkt-Fehler zur Folge, sofern sie allein als uses XXX verwendet wird - eine zweite unit oder eine andere allein oder keine und das Problem tritt nicht auf!
Egal was bei mir sein mag, in der UKI_BAgeo scheint auf alle Fälle was nicht zu stimmen. Als "Vorbildscript" solltest du da dringend mal nachsehen.
Edit: Wenn ich im unveränderten UKI000nothing bei uses UKI_AAinit, UKI_ABall; ein Komma setze, kommt genau der gleiche Fehler (Adresse 20) auch!
Aber nur zwischen UKI_ABall und dem ;, sonst nirgends, also [UKI_ABall*Fehlerbreich*;].
Edit2: Tritt auch innerhalb eines {} und //Kommentars auf, dabei bei , und . wenn in einer Zeile außerhalb von Text, und nur , wenn innerhalb von Text. (Adresse 21)
Wobei ich mich nicht erinnern kann, dass das vorher auch war. Ich kanns aber nicht beschwören. Tritt auch ohne uses UKI_BAgeo auf. |
|
verfasst am: 01.07.2007, 11:54 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Was ganz anderes (oder nicht? ;D) als oben.
Ich hab jetzt in mein Startscript den Aufruf der AAinit eingebaut. Das sieht so aus:
program Einleitung;
uses UKI_AAinit;
const
message_1 = ';
procedure StartMission;
begin
UKI_AAinit;
game_api_messageBox('Dark Age Version 2. (UKI_AAinit Initialisierung erfolgt.)');
game_api_messageBox(message_1);
mission_win;
end;
Im Spiel kommt aber folgende Meldung:
Run Time Error in Mission EinleitungRadar:
UKI_AAinit - File: UKI_AAinit; Line: 40, Col: 3
STARTMISSION - Line: 34, Col: 3
Global Var UKI_UFO already registered
Hätte ich den Aufruf von UKI_AAinit weglassen sollen? |
|
verfasst am: 01.07.2007, 12:27
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
UKI_AAinit muss genau einmal pro Spiel aufgerufen werden, und zwar bevor irgendeine der UKI-Funktionen (in welchem Skript auch immer) genutzt wird.
Die Fehlermeldung bedeutet das Du in Deinem Spielsatz den Befehl zweimal in zwei verschiedenen Skripten aufrufst - bitte suchen an welchen beiden Stellen, und dann den zeitlich späteren Aufruf löschen. |
|
verfasst am: 01.07.2007, 14:21 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Die Fehlermeldung bedeutet das Du in Deinem Spielsatz den Befehl zweimal in zwei verschiedenen Skripten aufrufst
Ah, hatte vergessen, dass das ja in dem RandomUFO schon von Haus aus drin ist.
Ich werd da gleich mal noch einen entsprechenden Hinweis an der Stelle der Doku einsetzen, die mich da erwischt hat. |
|
verfasst am: 01.07.2007, 15:32 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Und ein neues... Das ist was ich getippt habe, die Vorgabeprozeduren (UKIShootdown etc.) sind auch noch drin.
procedure Landing;
var
i: integer;
Flugzahl2: integer; //Wie oft zwischen den Landungen
Landezahl: integer; //Anzahl Landungen
begin
Flugzahl2:= random(2)+2;
Landezahl:= random(2)+1;
for i:=1 to Landezahl do
begin
if earth_api_PointOverLand(UFO.Position) then
Zwischenlandung;
if not earth_api_PointOverLand(UFO.Position) then
UFO.FlyToPoint(PositionNear(UFO.position,10));
if earth_api_PointOverLand(UFO.Position) then
Zwischenlandung;
for i:=1 to Flugzahl2 do
begin
UFO.FlyToPoint(PositionNear(UFO.position,10));
end;
end;
end;
procedure StartMission;
var
UFO:TUFO;
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
i: integer;
begin
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
register_UFO(UFO);
UFO.UserKI:=true;
// die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
register_event(@UKIShootDown, UFO, EVENT_ONUFOSHOOTDOWN);
register_event(@UKIDiscover, UFO, EVENT_ONUFODISCOVERED);
register_event(@UKIEscape, UFO, EVENT_ONUFOESCAPE);
register_event(@UKIKampfwin, UFO, EVENT_ONUFOKAMPFWIN);
register_event(@UKIHitbyBase, UFO, EVENT_ONUFOHITBYBASE);
register_event(@UKINewCommand, UFO, EVENT_ONUFONEWCOMMAND);
register_event(@UKICommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
register_event(@UKInearEnemy, UFO, EVENT_ONUFONEARESTENEMYCHANGED);
Flugzahl1:= random(2)+2;
Flugzahl3:= random(2)+2;
for i:=1 to Flugzahl1 do
begin
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
Landing;
for i:=1 to Flugzahl3 do
begin
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
UFO.Escape;
end;
begin
MissionName := 'UKI000Forschungsschiff';
MissionType := mzUFO;
end.
Nach Aufruf durch RandomUFO im editor und im Spiel kommt folgende Meldung:
Run Time Error in Mission UKI000Forschungsschiff
LANDING - Line Col
STARTMISSION Line Col
Could not call Proc
edit: Die Zeilenangabe ändert sich doch, aber nur wenn ich alles schließe und den Spielsatz abspeichere.
Was fett ist, ist also die beanstandete Zeile. |
|
verfasst am: 01.07.2007, 15:45
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Irgendwie vermisse ich die Prozedur Zwischenlandung in dem Codeausschnitt.
Außerdem frage ich mich, wieso Du die Zwischenlandung zweimal durchführen willst... |
|
verfasst am: 01.07.2007, 17:10
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Irgendwie vermisse ich die Prozedur Zwischenlandung in dem Codeausschnitt.
per uses - das, worums in der letzten Woche ging.
Zitat: DirkF Außerdem frage ich mich, wieso Du die Zwischenlandung zweimal durchführen willst...
Das erste Mal Zwischenlandung ist in der if, wenn das UFO also nicht über Land ist, wird es nicht ausgeführt - kein Bodeneinsatz im Wasser.
Dafür bewegt sich das UFO ein Stück, und versucht noch mal die Zwischenlandung.
Wenn immer noch über Wasser, kommt die Schleife für Bewegungen zwischen mehreren Landungen.
Das UFO soll mehrere Landungen ausführen, bevor es endgültig verschwindet.
unit UKI_Unit_Zwischenlandung;
var
UFOSpeicher: TUFO;
UFO: TUFO;
procedure ZwischenlandungStart(Sender:TObject);
begin
UFO:=UFOSpeicher;
ufo_api_CreateUFOFromModel(UFO.model);
end;
procedure Zwischenlandung;
var
Boden: TEinsatz;
Zeit: longint;
begin
savegame_api_Message(#',lmMissionMessage,Nil);
UFOspeicher:=UFO;
Zeit:=random(360)+120; //Wie lange dauert die Landung: Zufall+2h
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
UFO.Escape;
Boden.RemainTime:=Zeit;
Boden.Name:= 'Überfall auf ein gelandetes UFO';
Boden.Objectives:= #.';
Boden.Description:= #';
Boden.start;
//Wenn die Einsatzzeit abgelaufen ist, wird ein UFO erzeugt, ansonsten nicht (erfolgreicher Bodeneinsatz)
register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
end.
btw: Wenn ich hier oben UFO:TUFO rausnehme, dann kommt beim Start der RandomUFO wieder die Fehlermeldung mit der Adresse 21. |
|
verfasst am: 01.07.2007, 17:38
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Das erste Mal Zwischenlandung ist in der if, wenn das UFO also nicht über Land ist, wird es nicht ausgeführt - kein Bodeneinsatz im Wasser.
Dafür bewegt sich das UFO ein Stück, und versucht noch mal die Zwischenlandung.
Aber wenn das UFO über Land ist, dann wird die Zwischenlandung zweimal in derselben Sekunde am selben Ort ausgeführt - bist Du sicher, das Du das willst?
Ansonsten liegt der Fehler wahrscheinlich in dem Bereich, wie Du mit den Objektpointern für UFO umgehst. Pointer müssen entweder übergeben oder übergeordnet definiert werden - so wie Du UFO definierst kann das nichts werden...
Du kannst nicht erwarten, das ein Pointer der lokal in einer übergeordneten Funktion definiert wird (UFO:TUFO in Startmission) auf dasselbe Objekt zeigt wie ein Pointer, der global in einer untergeordneten unit (UFO:TUFO in der Unit) definiert wird. Das sind zwei grundverschiedene UFOs die Du da definierst, und deshalb klappt das auch nicht.
Denn das UFO in Zwischenlandung ist nie erzeugt worden.
Entweder definierst Du das UFO global in dem übergeordneten Skript, oder Du musst es per Aufruf übergeben (Zwischenlandung(UFO);).
Zur Erklärung:
Wenn Du eine beliebige Variable innerhalb einer Funktion definierst, dann existiert sie NUR innerhalb dieser Funktion. Dies gilt bei dem Code oben z.B. für UFO, Flugzahl1 und Flugzahl3 bei StartMission. Schon die Funktion Landing; kann absolut gar nichts mit dieser Variablen UFO anfangen, weil sie nicht übergeben wird und außerhalb der StartMission auch nicht existiert...
Die müssten stattdessen genauso global definiert sein wie Du das in der Unit gemacht hast - diese Definition ist global (und deshalb gibt es auch keinen Fehler in Landing, denn dort wird die Globale Definition abgefragt), aber diesem UFO wird nirgendwo ein Objekt definiert.
Denn StartMission sagt ja: Bitte erzeuge das UFO in meiner lokalen Variable, auf die der Rest des Skriptes keinen Zugriff hat. |
|
verfasst am: 01.07.2007, 19:21
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Entweder definierst Du das UFO global in dem übergeordneten Skript, oder Du musst es per Aufruf übergeben (Zwischenlandung(UFO);).
Wo fängt das denn jetzt an?
Ich dachte in der RandomUFO, da steht drin *such*
ZPosition.x:=random(360)-1;
ZPosition.y:=random(170)+4;
UFO:=ufo_api_CreateUFO;
UFO.Position:=ZPosition;
Da haben wir das UFO, dem das KI-script zugewiesen wird.
UFO.KIName:='UKI000Forschungsschiff';
dann
UKI_AAcreate(UFO);
procedure UKI_AAcreate(UFO:TUFO);
begin
game_api_setinteger('UKI_UFO',Integer(UFO));
mission_api_StartSkript(UFO.KIname);
end;
Und ich schätze mal, an dieser Stelle hängt dann irgendwas mit dieser Weitergabe, denn der Teil mit dem setinteger sagt mir gar nichts. |
|
verfasst am: 01.07.2007, 19:36
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Beide Definitionen sind in Deinem Skript, nirgendwo anders.
Das ist die Globale Definition:
unit UKI_Unit_Zwischenlandung;
var
UFOSpeicher: TUFO;
UFO: TUFO;
D.h. dieses UFO wird überall AUSSER dort genutzt, wo Du eine lokale Definition hast.
Das ist die lokale Definition:
procedure StartMission;
var
UFO:TUFO;
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
i: integer;
D.h. dieses UFO ist NUR innerhalb der StartMission-Funktion vorhanden und kann NIRGENDWO sonst zugegriffen werden.
Dein Landing; kann gar nicht auf das in StartMission übergebene UFO zugreifen, weil das UFO von StartMission nur lokal definiert ist und nirgendwo sonst existiert.
Das ist der Fehler.
Die Übergabe aus meinen anderen Skripten mit UFO:=UKI_AAgetUFO; funktioniert einwandfrei, erst in Deinem Skript wird die Weitergabe aus der StartMission; an das Landing; blockiert. |
|
verfasst am: 02.07.2007, 19:01
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Brauche ich denn nun irgendwo in und unterhalb der UKI000 ein var UFO:TUFO?
Denn wenn ich es weglasse oder in der UKI000 anlege,dann gibts unknown identifier in ZwischenlandungStart, und bei Start per Random (wo ja das UFO definiert wird) gibts nur den Adresse21 Fehler.
Wenn ich noch so einen Pointer brauche, dann sag es, denn von den Dingern versteh ich nichts, und die Hilfen sind nicht sonderlich hilfreich. |
|
verfasst am: 02.07.2007, 19:57
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Fangen wir mal von vorne an, das sollte die Verwirrung entweder beheben oder vervollständigen ;-)
Es gibt zwei verschiedene Methoden, ein anderes Skript einzubinden: uses und mission_api_StartSkript(skript);
Im Falle von uses gehören diese eingebundenen Skripte zum Hauptskript mit dem uses-Befehl und werden zusammen mit diesem Beendet. Die eingebundenen units dürfen kein "StartMission" enthalten und teilen sich mit dem aufrufenden Skript alle globalen Variablen.
Im Falle von mission_api_Startskript werden diese Skripte aber unabhängig gestartet und können auch unabhängig beendet werden. Das hiermit aufgerufene Programm MUSS ein eigenes Startmission enthalten und eigene Variablen definieren, denn es hat keinerlei direkten Zugriff auf die Variablen des aufrufenden Skriptes. Lediglich ein indirekter Zugriff über getrennt definierte Variablen in game_api_* kann Werte übergeben.
Da man natürlich nicht laufend den Speicher für die KI jedes einzelnen UFOs belegen will, müssen die UFO-Erzeugungsskripte die KI-Skripte extern aufrufen. Nur so können diese KI-Skripte passend beendet werden wenn das UFO zerstört ist.
Dementsprechend ist Dein UKI000Forschungsschiff (oder wie Du Dein KI-Skript nennst) die oberste Einheit für die Definition aller Variablen innerhalb dieses Skriptes und seiner Units. Du musst darin alles definieren was jemals darin verwendet werden soll - fehlen diese Definitionen, dann gibt es natürlich Fehler.
Dein Problem ist, das Du eine Variable zweimal definiert hast und dadurch zwei verschiedene Variablen mit demselben Namen erzeugt hast. Ich formuliere Deinen fehlerhaften Code mal hier um - schau nach welche Variable Du wo definiert hast und wo verwendest, dann siehst Du das Problem:
unit UKI_Unit_Zwischenlandung;
var
UFOSpeicher: TUFO;
gUFO: TUFO;
procedure ZwischenlandungStart(Sender:TObject);
begin
gUFO:=UFOSpeicher;
ufo_api_CreateUFOFromModel(gUFO.model);
end;
procedure Zwischenlandung;
var
Boden: TEinsatz;
Zeit: longint;
begin
savegame_api_Message(#',lmMissionMessage,Nil);
UFOspeicher:=gUFO;
Zeit:=random(360)+120; //Wie lange dauert die Landung: Zufall+2h
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=gUFO.Position;
Boden.PopulateFromUFO(gUFO);
gUFO.Escape;
Boden.RemainTime:=Zeit;
Boden.Name:= 'Überfall auf ein gelandetes UFO';
Boden.Objectives:= #.';
Boden.Description:= #';
Boden.start;
//Wenn die Einsatzzeit abgelaufen ist, wird ein UFO erzeugt, ansonsten nicht (erfolgreicher Bodeneinsatz)
register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
end.
procedure Landing;
var
i: integer;
Flugzahl2: integer; //Wie oft zwischen den Landungen
Landezahl: integer; //Anzahl Landungen
begin
Flugzahl2:= random(2)+2;
Landezahl:= random(2)+1;
for i:=1 to Landezahl do
begin
if earth_api_PointOverLand(gUFO.Position) then
Zwischenlandung;
if not earth_api_PointOverLand(gUFO.Position) then
gUFO.FlyToPoint(PositionNear(gUFO.position,10));
if earth_api_PointOverLand(gUFO.Position) then
Zwischenlandung;
for i:=1 to Flugzahl2 do
begin
gUFO.FlyToPoint(PositionNear(gUFO.position,10));
end;
end;
end;
procedure StartMission;
var
lUFO:TUFO;
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
i: integer;
begin
lUFO:=UKI_AAgetUFO;
Allcreate(lUFO);
register_UFO(lUFO);
lUFO.UserKI:=true;
// die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
register_event(@UKIShootDown, lUFO, EVENT_ONUFOSHOOTDOWN);
register_event(@UKIDiscover, lUFO, EVENT_ONUFODISCOVERED);
register_event(@UKIEscape, lUFO, EVENT_ONUFOESCAPE);
register_event(@UKIKampfwin, lUFO, EVENT_ONUFOKAMPFWIN);
register_event(@UKIHitbyBase, lUFO, EVENT_ONUFOHITBYBASE);
register_event(@UKINewCommand, lUFO, EVENT_ONUFONEWCOMMAND);
register_event(@UKICommandComplete, lUFO, EVENT_ONUFOCOMMANDCOMPLETE);
register_event(@UKInearEnemy, lUFO, EVENT_ONUFONEARESTENEMYCHANGED);
Flugzahl1:= random(2)+2;
Flugzahl3:= random(2)+2;
for i:=1 to Flugzahl1 do
begin
lUFO.FlyToPoint(PositionNear(lUFO.position,20));
end;
Landing;
for i:=1 to Flugzahl3 do
begin
lUFO.FlyToPoint(PositionNear(lUFO.position,20));
end;
lUFO.Escape;
end;
Dein Problem ist, das Du mit
lUFO:=UKI_AAgetUFO;
das UFO zwar der (fast nutzlosen) Variable lUFO zuweist, aber nirgendwo definiert wird, woher denn das gUFO kommen soll.
Der korrekte Code lautet in UKI000Forschung:
program UKI000Forschungsschiff;
uses UKI_Zwischenlandung;
var
UFO: TUFO;
procedure StartMission;
var
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
i: integer;
begin
Und NACHDEM Du das UFO im KI-Script korrekt definiert hast, kannst (und musst) Du auch die nicht ganz korrekte Definition in der unit Zwischenlandung löschen.
Vor der korrekten Definition im KI-Script geht das löschen natürlich nicht, denn sonst sind ja die gUFO Variablen im KI-Script ohne Definition... |
|
verfasst am: 02.07.2007, 21:09 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Hmm...
Also UKI_000 läuft durch bis Zwischenlandung, und da durch die ganzen Boden.xxx und dann zu UFO.Escape.
Mit diesem Befehl wird die var UFO komplett gelöscht (oder deregistriert) so dass ein UFO gar nicht mehr existiert und somit erst wieder per var definiert werden muss.
Ist das soweit korrekt? Dann ist mein Fehler, dass ich das UFO als weiterhin belegbare Variable angenommen hatte - und ich dich dann irgendwo oben etwas falsch verstanden habe.
Wenn das nicht stimmt, muss ich sehen, ob ich morgen wieder denken kann, heute ists schlecht damit. (Und eigentlich die ganze Woche, weil ich tagsüber mächtig beschäftigt bin)
edit: Wenn ich UFO unter UK_I000 in die var schreibe, wird bei Zwischenlandung UFOSpeicher:=UFO; gemeckert unknown identifier UFO. Und das versteh ich nicht, dass ist doch - durch die unit - auch nur eine prozedur von UKI_000. |
|
verfasst am: 02.07.2007, 22:04
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Falsch - der Fehler ist, das Du das UFO zweimal definierst...
Schau doch mal wo ich Deine UFO durch lUFO bzw. gUFO ersetzt habe.
UFOspeicher:=gUFO;
Boden.Position:=gUFO.Position;
Boden.PopulateFromUFO(gUFO);
gUFO.Escape;
funktioniert nicht und wird NIE funktionieren, weil es keine einzige Stelle gibt wo das gUFO definiert wird.
Die Zeilen bewirken soviel wie
"Setze UFOSpeicher auf Null, da es kein gUFO gibt, dann setze einen Bodeneinsatz auf den Ursprung 0,0, Bevölkere ihn mit keinem Alien aus einem leeren gUFO und vernichte dann ein nie existierendes gUFO."
Es gibt in Deinem Code keine einzuge Stelle, wo Du dem
gUFO das ursprüngliche UFO zuweist, denn der Befehl beim ZwischenlandungStart wird erst später aufgerufen.
Am besten ist es wohl, wenn Du die Variablen nicht global speicherst sondern übergibst.
Schreibe den Befehl also um in z.B.
Zwischenlandung(UFO:TUFO); und die anderen Befehle äquivalent. Das dürfte einfacher sein als Dir per Forum die unterschiedlichen Definitionsebenen verschiedener Variablen in verschiedenen Funktionen zu erklären.
Dabei musst Du aber aufpasen, das Du mit den Variablen nicht durcheinander kommst - am besten Du benennst die TUFO-Variable bei jeder Funktion anders... |
|
verfasst am: 02.07.2007, 22:13
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Oder vielleicht mal anders beschrieben:
Zitat: LennStar procedure StartMission;
var
UFO:TUFO;
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
i: integer;
begin
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
register_UFO(UFO);
und
Zitat: LennStar Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
UFO.Escape;
sind ZWEI VERSCHIEDENE UFOs!!!
Nur weil Du zufällig in beiden Teilen denselben Variablennamen verwendest, sind die Variablen NICHT IDENTISCH
Das in UFO:=UKI_AAgetUFO; erhaltene UFO erreicht zu keinem Zeitpunkt die Funktion Zwischenlandung; - die Variable wird in der Zwischenlandung NIRGENDWO übertragen. |
|
verfasst am: 03.07.2007, 13:45 · Edited by: DirkF
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Nochmal ein paar Infos:
eigentlich ist in Deinem Skript nur eine einzige Zeile zu löschen und es würde sofort perfekt funktionieren.
Der Grund weshalb ich Dir diese Zeile nicht einfach nenne besteht darin, das Du verstehen musst weshalb sie falsch ist - und weshalb der Compiler sie trotzdem für richtig hält. Andernfalls machst Du diesen Fehler immer wieder in allen Skripten...
Es gibt in der Programmierung syntaktische Fehler und logische Fehler. Bei Syntaktischen Fehlern zeigt ein Compiler in 95% aller Fälle die fehlerhafte Zeile an - es gibt nur wenige Ausnahmen wie falsch gesetzte Semikolons bei denen die falsche Zeilenangebe steht.
Bei einem logischen Fehler (und so einer liegt hier vor) zeigt der Compiler dagegen in 95% aller Fälle die Zeile an, wo der Fehler zum ersten mal bemerkt wurde und NICHT die fehlerhafte Zeile selber.
Die vom Compiler als Fehler gemeldeten Zeilen sind also völlig korrekt, und der echte Fehler liegt stattdessen in einer lange vorher stehenden Zeile, die schon längst als angeblich korrekt durchlaufen wurde, es aber nicht ist.
Hier mal ein primitiver Code:
program test;
var
Dummy:String;
procedure ausgabe(text:String);
var
Dummy: String;
begin
Dummy:= 'ich verstehe nichts';
game_api_messagebox(text);
end;
procedure Zwischentext;
var
Dummy: String;
begin
Dummy:= 'Hallo Welt';
ausgabe(Dummy);
end;
procedure StartMission;
begin
Dummy:='Programm gestartet';
ausgabe(Dummy);
Zwischentext;
ausgabe(Dummy);
end.
Schau Dir mal an was dieser Code wann ausgiebt und weshalb.
Wenn Du jeden Schritt davon nachvollziehen kannst, kannst Du auch den Fehler in Deinem Skript finden...
P.S. eventuell sind oben Syntaxfehler, ich hab das aus dem Kopf ohne Test geschrieben... |
|
verfasst am: 03.07.2007, 21:39 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF eigentlich ist in Deinem Skript nur eine einzige Zeile zu löschen und es würde sofort perfekt funktionieren.
Und mein Problem ist, dass es dann eben NICHT funktioniert - wie ich schon ein ganzes Stück weiter oben gesagt habe.
In StartMission steht schon seit Sonntag Abend keine var UFO mehr drin. Ich hab das irgendwo auch gesagt.. Zitat: LennStar edit: Wenn ich UFO unter UK_I000 in die var schreibe, wird bei Zwischenlandung UFOSpeicher:=UFO; gemeckert unknown identifier UFO. Und das versteh ich nicht, dass ist doch - durch die unit - auch nur eine prozedur von UKI_000.
program UKI000Forschungsschiff;
uses UKI_AAinit, UKI_ABall, UKI_BAgeo, UKI_Unit_Zwischenlandung;
var
UFO: TUFO;
procedure Landing;
var
c: integer;
d: integer;
Flugzahl2: integer; //Wie oft zwischen den Landungen
Landezahl: integer; //Anzahl Landungen
begin
Flugzahl2:= random(2)+2;
Landezahl:= random(2)+1;
for c:=1 to Landezahl do
begin
if earth_api_PointOverLand(UFO.Position) then
begin
Zwischenlandung;
end;
if not earth_api_PointOverLand(UFO.Position) then
begin
UFO.FlyToPoint(PositionNear(UFO.position,10));
if earth_api_PointOverLand(UFO.Position) then
begin
Zwischenlandung;
end;
end;
for d:=1 to Flugzahl2 do
begin
UFO.FlyToPoint(PositionNear(UFO.position,10));
end;
end;
end;
procedure StartMission;
var
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
a: integer;
b: integer;
begin
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
register_UFO(UFO);
UFO.UserKI:=true;
*register...
Flugzahl1:= random(2)+2;
Flugzahl3:= random(2)+2;
for a:=1 to Flugzahl1 do
begin
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
Landing;
for b:=1 to Flugzahl3 do
begin
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
UFO.Escape;
end;
begin
MissionName := 'UKI000Forschungsschiff';
MissionType := mzUFO;
end.
unit UKI_Unit_Zwischenlandung;
var
UFOSpeicher: TUFO;
procedure ZwischenlandungStart(Sender:TObject);
begin
UFO:=UFOSpeicher;
ufo_api_CreateUFOFromModel(UFO.model);
end;
procedure Zwischenlandung;
var
Boden: TEinsatz;
Zeit: longint;
begin
savegame_api_Message(+.',lmMissionMessage,Nil);
UFOSpeicher:=UFO;
Zeit:=random(360)+120; //Wie lange dauert die Landung: Zufall+2h
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
UFO.Escape;
Boden.RemainTime:=Zeit;
Boden.Name:= +;
Boden.Objectives:= +';
Boden.Description:= +';
Boden.start;
register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
end.
|
|
verfasst am: 03.07.2007, 22:02
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Da bin ich an einer anderen Stelle durcheinander gekommen - mit ein Grund weshalb Du besser mit übergebenen lokalen statt globalen Variablen arbeiten sollst.
Das UFO muss natürlich vor jeder anderen Funktion definiert werden - die units werden aber aufgerufen, bevor die Variable UFO definiert wird. Dadurch kennen diese die Variable nicht.
Nur - anders herum wird aus der globalen Variable auch ein Schuh draus. Wenn Du UFO:TUFO nämlich in den Unit-Skripten definierst, dann musst Du höllisch aufpassen aus welchem anderen Skript Du die Unit überhaupt aufrufen darfst und was in den anderen Skripten definiert ist.
Deshalb wäre es an dieser Stelle wirklich besser, wenn Du meiner Empfehlung von gestern 22:04 folgst und alle Funktionen so umschreibst, das die Variablen gezielt übergeben werden.
Und die globalen Definitionen erstmal komplett weglässt...
Außerdem wäre es auch mal Interessant zu wissen, für welche anderen Skripte und Funktionen Du die Zwischenlandung alles herausgetrennt hast - units lohnen sich erst wenn sie von mindestens drei verschiedenen Hauptskripten eingebunden werden, und müssen dann zu allen verschiedenen Hauptskripten kompatibel gehalten werden (deshalb das Problem mit in Skripten definierten globalen Variablen). |
|
verfasst am: 03.07.2007, 22:19
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Deshalb wäre es an dieser Stelle wirklich besser, wenn Du meiner Empfehlung von gestern 22:04 folgst und alle Funktionen so umschreibst, das die Variablen gezielt übergeben werden.
Wovon ich keine AHnung habe. Wollt ich nur noch mal gesagt haben...
müsste ich dann also überall procedure xxx(UFO:TUFO); schreiben? Zitat: DirkF Das dürfte einfacher sein als Dir per Forum die unterschiedlichen Definitionsebenen verschiedener Variablen in verschiedenen Funktionen zu erklären.
Das erscheint mir wiederum einfach.
Zitat: DirkF Außerdem wäre es auch mal Interessant zu wissen, für welche anderen Skripte und Funktionen Du die Zwischenlandung alles herausgetrennt hast
Im Moment nur das eine. Aber Landungen werden nicht nur in einem script benutzt. Das einzige Problem das ich da sehe, ist vllt. die Zeitdauer der Lanung.
Der Rest an der Sache wird ja im Hauptscript erledigt, so dass man die Unit auch für Terrorangriffe, Frachttransporter zu Alienbasen etc. nutzen könnte. |
|
verfasst am: 03.07.2007, 22:46 · Edited by: DirkF
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Wovon ich keine AHnung habe. Wollt ich nur noch mal gesagt haben...
müsste ich dann also überall procedure xxx(UFO:TUFO); schreiben?
Wenn Du das UFO übergeben willst. Ich gebe Dir mal ein Beispiel wie man das lösen könnte, wobei ich ausdrücklich mit den Namen spiele um zu verdeutlichen, das eine Benennung immer nur lokal wirksam ist. Der Code oben ist übrigens immer noch unsauber, ich zeige mal eine bessere Lösung:
procedure Zwischenlandung(Lander:TUFO;Zeit:Integer);
var
Boden: TEinsatz;
begin
savegame_api_Message(+.',lmMissionMessage,Nil);
UFOSpeicher:=Lander;
Zeit:=random(360)+Zeit; //Wie lange dauert die Landung: Zufall+übergebene Basiszeit
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=Lander.Position;
Boden.PopulateFromUFO(Lander);
Lander.Escape;
Boden.RemainTime:=Zeit;
Boden.start;
end;
(schnipp)
while (not earth_api_PointOverLand(UFO.Position)) do
// FEHLER: KLAPPT NICHT MIT FLYTOPOINT
// Ich lasse es trotzdem drin um den Befehl zu zeigen
// Siehe folgetext mit erklärung
// UFO.FlyToPoint(PositionNear(UFO.position,10));
Zwischenlandung(UFO,120);
// For-Schleife funktioniert ebenfalls nicht mit
// FlyToPoint!!!
//for d:=1 to Flugzahl2 do
// begin
UFO.FlyToPoint(PositionNear(UFO.position,10));
// end;
(schnipp)
Übrigens: Noch ein Fehler in dem Originalscript sind fehlerhafte Einrückungen bei den end; Befehlen.
Das erzeugt zwar keine direkten Fehler, aber Du kannst dann selber kaum erkennen, welches end; zu welchem begin gehört.
Und wenn Du da durcheinander kommst und eines vergisst, ist das eine Hölle in der Fehlersuche.
In diesem Fall ist das zweite end; nach der Zwischenlandung; zuweit eingerückt (das gehört zwei Buchstaben weiter nach vorne). Abgesehen davon ist die begin/end-Klammer um Zwischenlandung unnötig, da es dort nur den einen Befehl gibt - begin und end benutzt man um mehrere Befehle zu einem Bearbeitungsblock zusammenzuschließen.
Und Dein Problem der Zeitdauer der Landung ist auch schon gleich mit gelöst...
EDIT:
Siehe nächsten Text... |
Seite: << [1] [2] [3] [4] [5] [6] [7] [8] 9 [10] .. [17] [18] >> |
Du musst dich registrieren um auf dieses Thema zu antworten.
|
|



|