Seite: << [1] ... [9] [10] [11] [12] 13 [14] [15] [16] [17] [18] [19] .. [28] [29] >> |
Autor |
Mitteilung |
|
verfasst am: 30.07.2007, 15:34
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: LennStar Im Spiel kommt eine Fehlermeldung bei
procedure ZwischenlandungStart(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender); *Fehler
UFO.FlyToPoint(UFO.position);
end;
*could not call proc
Das deutet darauf hin, dass der Variablen UFO in dieser Stelle kein Objekt (also ein UFO im Spiel) zugeordnet ist. Ob ich mit der Vermutung recht hab, könnte man z.B. mit einer Abfrage Sender=Nil testen.
Aber ich hab jetzt mal dein oben gepostetes Skript im Editor geladen, und bin doch reichlich überrascht. Man bekommt ja den Eindruck, du hast5 dir am Anfang überlegt, was das Skript machen soll, dann das komplette Skript geschrieben, und dann das erste mal getestet. Anders kann ich mir die vielen Fehler nicht erklären. Gerade für Anfänger bietet es sich an, die Arbeit in Teilschritte zu zerlegen, und diese dann erstmal zu prüfen (und gegebenenfalls zu korrigieren). |
|
verfasst am: 30.07.2007, 15:34
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Ein ja hätte auch gereicht. :D
Bei dem Fehler: Muss da noch UFO übergeben werden?
procedure ZwischenlandungStart(Sender:TObject, UFO:TUFO);
Woher bestimmt sich die Reihenfolge? |
|
verfasst am: 30.07.2007, 15:38
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Zitat: Natter Gerade für Anfänger bietet es sich an, die Arbeit in Teilschritte zu zerlegen, und diese dann erstmal zu prüfen (und gegebenenfalls zu korrigieren).
Und wie? Nur Strg+F9 bringt da jedenfalls gar nichts. Und was anderes läuft nicht. |
|
verfasst am: 30.07.2007, 15:42 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: DirkF Die Befehle mit den game_api_get* -Variablen funktionieren nicht im Editor, nur im Hauptprogramm. Man könnte das zwar über Defines abfangen, aber das wäre eine Menge Aufwand für einen anschließend immer noch unsauberen Test.
Irgendwo wäre das trotzdem schon sinnvoll. Wenn man gut programmieren kann, dann ist es vielleicht kein Problem, immer gleich im Spiel zu testen - schließlich ist das dann nicht allzu oft nötig. Für einen Anfänger ist das aber viel zu umständlich. Und so umständlich ist das eigentlich garnicht, gibt doch für den Skripteditor einen extra Compilerschalter, ich glaub {$ifdef skriptedit} oder so ähnlich (müsste ich nochmal nachschauen). |
|
verfasst am: 30.07.2007, 15:45
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: LennStar Und wie? Nur Strg+F9 bringt da jedenfalls gar nichts. Und was anderes läuft nicht.
naja, zumindest die Syntaxprüfung läuft da doch. Ich hab bestimmt 20 Syntax-Fehler beseitigt, bevor das Skript das erste mal gestartet wurde.
Vielleicht sollte man im Tutorial auch mal ein Kapitel machen, was bei welchem Fehler die häufigste(n) Fehlerursache(n) ist/sind. Eigentlich ist es nämlich dank der Fehermeldungen sehr einfach, Syntaxfehler zu eliminieren. |
|
verfasst am: 30.07.2007, 15:49
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
|
Wenn Du in Zwischenlandung sagst, das der Funktion "ZwischenlandungStart" als Objekt der Bodeneinsatz übergeben wird, dann kannst Du natürlich nicht diesen Bodeneinsatz mit TUFO plötzlich in ein UFO verwandeln...
Und Nein, Du kannst das UFO auch nicht zusätzlich übergeben, denn die Eventfunktionen dürfen nur ein Objekt haben.
Die ZwischenlandungStart muss das UFO aus einer anderen Datenquelle holen, z.B. so wie ich das mit den UKI_AAgetUFO mache (aber natürlich neue Funktionen anlegen). |
|
verfasst am: 30.07.2007, 15:54 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
So, hier ist jetzt zumindest mal dein obiges komplettes Skript mit Fehlerkorrektur (deine nachträglichen Änderungen sind aber nicht drin). Und ich hab auch eine Abfrage eingebaut, damit der Test im Editor klappt (im Editor wird einfach ein Zufallsufo verwendet)
program UKI000Forschungsschiff;
uses UKI_AAinit, UKI_ABall, UKI_BAgeo;
var
Landezahl: integer; //Anzahl Landungen
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl2: integer; //Wie oft zwischen den Landungen
Flugzahl3: integer; //Wie oft nach der letzten Landung
procedure ZwischenlandungStart(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender);
UFO.FlyToPoint(UFO.position);
end;
procedure Zwischenlandung(UFO:TUFO);
var
Boden: TEinsatz;
Zeit: longint;
begin
savegame_api_Message('#.',lmMissionMessage,Nil);
Zeit:=random(360)+120; //Wie lange dauert die Landung: Zufall+2h
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
Boden.RemainTime:=Zeit;
Boden.Name:= 'Überfall auf ein gelandetes UFO';
Boden.Objectives:= 'Eliminieren Sie alle Aliens vor Ort.';
Boden.Description:= '#.';
Boden.start;
register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
procedure UKICommandComplete(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender);
case UFO.KIstep of
0,1,2,3,4,5,6,7,8:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
9:
begin
if (Landezahl>0) then
begin
if (earth_api_PointOverLand(UFO.Position)=true) then
begin
Zwischenlandung(UFO);
UFO.KIStep:= 9-Flugzahl2;
Landezahl:= Landezahl-1;
end
else UFO.FlyToPoint(PositionNear(UFO.position,20));
end
else
begin
UFO.KISTep:= 19-Flugzahl3;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
end;
10,11,12,13,14,15,16,17,18:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
19: UFO.escape;
end;
end;
procedure StartMission;
var
UFO: TUFO;
begin
{$IFNDEF Skriptedit}
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
{$ENDIF}
{$IFDEF Skriptedit}
UFO:=ufo_api_createUFO;
{$ENDIF}
register_UFO(UFO);
UFO.UserKI:=true;
Flugzahl1:= random(3)+1; //Flüge vor 1. Landung
Flugzahl2:= random(3)+1; //Flüge zwischen Landungen
Flugzahl3:= random(3)+1; //Flüge nach allen Landungen
Landezahl:= random(2)+1; //Landungen
// die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
register_event(@UKICommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
UFO.FlyToPoint(PositionNear(UFO.position,20));
UFO.KIStep:= 9-Flugzahl1;
end;
begin
MissionName := 'UKI000Forschungsschiff';
MissionType := mzUFO;
end.
|
|
verfasst am: 30.07.2007, 16:02 · Edited by: DirkF
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
|
@Natter: Du hättest die bereits gepostete nächste Version von heute 15:08 unten auf der vorherigen Seite nehmen sollen, so sind da oben nämlich auch die von mir schon geposteten Optimierungen verschwunden... |
|
verfasst am: 30.07.2007, 16:04
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Zitat: DirkF z.B. so wie ich das mit den UKI_AAgetUFO mache (aber natürlich neue Funktionen anlegen).
Wenn ich die wenigstens verstehen würde... das fehlen einer Erklärung zu set/getinteger hilft auch nicht ;) Wird ja nicht bloß eine Wertzuweisung sein wie i:=3, oder?
Über nen timer gehts auch nicht, denn der Bodeinsatz kann ja auch gewonnen werden, "Zeit" nützt also gar nichts. |
|
verfasst am: 30.07.2007, 16:05
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beiträge: 2261
|
Zitat: DirkF Die Befehle mit den game_api_get* -Variablen funktionieren nicht im Editor, nur im Hauptprogramm. Man könnte das zwar über Defines abfangen, aber das wäre eine Menge Aufwand für einen anschließend immer noch unsauberen Test. Ähh. Das wäre mir aber neu. Wenn es sich um Spielsatz speziefische Variablen handelt, sollte man natürlich auch den Spielsatz als Testspielsatz in den Einstellungen eintragen. Zitat: Natter So, hier ist jetzt zumindest mal dein obiges komplettes Skript mit Fehlerkorrektur Du musst beim case aufpassen, da dort zum Beispiel zwei mal die 9 auftaucht... Das sollte eigentlich nicht so sein, da nur das erste mit der 9 dann ausgeführt wird. |
|
verfasst am: 30.07.2007, 16:06
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
|
Zitat: LennStar das fehlen einer Erklärung zu set/getinteger hilft auch nicht ;) Wird ja nicht bloß eine Wertzuweisung sein wie i:=3, oder?
Doch, theoretisch ist es genau das.
Der Trick liegt darin was man danach mit dem Integer per Typenumwandlung macht... |
|
verfasst am: 30.07.2007, 16:13
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: DirkF @Natter: Du hättest die bereits gepostete nächste Version von heute 15:08 unten auf der vorherigen Seite nehmen sollen, so sind da oben nämlich auch die von mir schon geposteten Optimierungen verschwunden...
Hehe, stimmt - hab ich aktualisiert. Naja, die Version von 15.08 war ja schon fast ohne Syntax-Fehler. |
|
verfasst am: 30.07.2007, 16:15 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: Jim_Raynor Du musst beim case aufpassen, da dort zum Beispiel zwei mal die 9 auftaucht... Das sollte eigentlich nicht so sein, da nur das erste mit der 9 dann ausgeführt wird.
Wie gesagt, hab nur Syntaxfehler behoben, damit er im Editor testen kann. Den Rest sollte er dann selbst testen, z.B. mit Zeilenweiser Abarbeitung des Skriptes ;)
Übrigens ein weiterer Grund für das Testen in medit - geht Zeilenweise, und man hat den Variablen-Viewer, der einem die gerade aktuellen Werte anzeigt. |
|
verfasst am: 30.07.2007, 16:25 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Zitat: Jim_Raynor Du musst beim case aufpassen, da dort zum Beispiel zwei mal die 9 auftaucht... Das sollte eigentlich nicht so sein, da nur das erste mit der 9 dann ausgeführt wird.
Das hatte ich schon längst korrigiert - nachdem beim ersten Test das Spiel gecrasht ist ;)
Zitat: Natter geht Zeilenweise
zumindest bis zum ersten AAgetUFO
Wie kann man Zeilen ausklammern aus dem Test? |
|
verfasst am: 30.07.2007, 16:32
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
|
Zitat: LennStar Wie kann man Zeilen ausklammern aus dem Test?
Siehe die Precompiler-Anweisungen in geschweiften Klammern oben in Natter's Code |
|
verfasst am: 30.07.2007, 16:34 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: LennStar zumindest bis zum ersten AAgetUFO
Wie kann man Zeilen ausklammern aus dem Test?
Hab ich in obigen Skript schon gemacht, hier nochmal die entsprechenden Zeilen:
{$IFNDEF Skriptedit}
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
{$ENDIF}
{$IFDEF Skriptedit}
UFO:=ufo_api_createUFO;
{$ENDIF}
Skriptedit ist eine Art Schalter (wie sie auch für Mehrsprachige Skripte Verwendung finden - siehe Kapitel 5 im Tutorial), der nur in medit gesetzt/definiert ist. |
|
verfasst am: 30.07.2007, 16:37 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: DirkF Die ZwischenlandungStart muss das UFO aus einer anderen Datenquelle holen, z.B. so wie ich das mit den UKI_AAgetUFO mache (aber natürlich neue Funktionen anlegen).
Hmm, interessanter Ansatz. Aber wenn man dabei eine globale Variable (skriptübergreifend global) definiert - wie stellt man dann sicher, das man da bei vielen UFOs nicht ausversehen die Daten überschreibt.
Und wenn man eine Integer-Variable nur als globale Variable im Skript definiert - dann könnte man ja auch gleich UFO global anlegen.
Hier mal ein Beispiel, wo das UFO in UFOCast zwischengespeichert wird (um zu sehen, ob ich das richtig verstanden hab - zumindest läuft das Skript damit erfolgreich bis zum Ende durch).
program UKI000Forschungsschiff;
uses UKI_AAinit, UKI_ABall, UKI_BAgeo;
var
Landezahl: integer; //Anzahl Landungen
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl2: integer; //Wie oft zwischen den Landungen
Flugzahl3: integer; //Wie oft nach der letzten Landung
UFOCast : Integer; // Wird verwendet, um ein UFO zwischenzuspeichern
procedure ZwischenlandungStart(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(UFOCast);
UFO.FlyToPoint(UFO.position);
end;
procedure Zwischenlandung(UFO:TUFO);
var
Boden: TEinsatz;
Zeit: longint;
dummy : Integer;
begin
savegame_api_Message('#.',lmMissionMessage,Nil);
Zeit:=random(360)+120; //Wie lange dauert die Landung: Zufall+2h
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
Boden.RemainTime:=Zeit;
Boden.Name:= 'Überfall auf ein gelandetes UFO';
Boden.Objectives:= 'Eliminieren Sie alle Aliens vor Ort.';
Boden.Description:= '#.';
Boden.start;
UFOCast := Integer(UFO);
register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
procedure UKICommandComplete(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender);
case UFO.KIstep of
0,1,2,3,4,5,6,7,8:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
9:
begin
if (Landezahl>0) then
begin
if (earth_api_PointOverLand(UFO.Position)=true) then
begin
Zwischenlandung(UFO);
UFO.KIStep:= 9-Flugzahl2;
Landezahl:= Landezahl-1;
end
else UFO.FlyToPoint(PositionNear(UFO.position,20));
end
else
begin
UFO.KISTep:= 19-Flugzahl3;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
end;
10,11,12,13,14,15,16,17,18:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
19: UFO.escape;
end;
end;
procedure StartMission;
var
UFO: TUFO;
begin
{$IFNDEF Skriptedit}
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
{$ENDIF}
{$IFDEF Skriptedit}
UFO:=ufo_api_createUFO;
{$ENDIF}
register_UFO(UFO);
UFO.UserKI:=true;
Flugzahl1:= random(3)+1; //Flüge vor 1. Landung
Flugzahl2:= random(3)+1; //Flüge zwischen Landungen
Flugzahl3:= random(3)+1; //Flüge nach allen Landungen
Landezahl:= random(2)+1; //Landungen
// die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
register_event(@UKICommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
UFO.FlyToPoint(PositionNear(UFO.position,20));
UFO.KIStep:= 9-Flugzahl1;
end;
begin
MissionName := 'UKI000Forschungsschiff';
MissionType := mzUFO;
end.
|
|
verfasst am: 30.07.2007, 16:40 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Skriptedit ist eine Art Schalter
aso.. im Endeffekt ändert das aber nichts, da kommt die selbe Meldung wie im Spiel ;) could not call proc |
|
verfasst am: 30.07.2007, 16:42 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Zitat: LennStar aso.. im Endeffekt ändert das aber nichts, da kommt die selbe Meldung wie im Spiel ;) could not call proc
Probier mal meine zuletzt gepostete Variante - die sollte klappen (worauf auch immer sich das nicht klappen bezieht) |
|
verfasst am: 30.07.2007, 16:43
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beiträge: 2261
|
Zitat: LennStar could not call proc Diese Meldung sagt aus, dass dein Objekt nil ist, und er eine Methode deswegen nicht aufrufen konnte. Jetzt musst nur noch rausbekommen, wo dein Objekt "verloren" geht ;) |
Seite: << [1] ... [9] [10] [11] [12] 13 [14] [15] [16] [17] [18] [19] .. [28] [29] >> |