Banner left   Banner center   Banner right

Germanenglish Home · News · Diary · Screenshots · Documentation (Wiki) · Downloads · Guestbook · Forum

Home · Benutzer registrieren · Suchen · Statistik · FAQ · Benutzerliste

Zur Zeit online: keiner ausser dir

 X-Force - Fight For Destiny - Forum —› X-Skript / Developer-Pack —› LennStars Fragerunde

Seite: << [1] ... [9] [10] [11] [12] 13 [14] [15] [16] [17] [18] >>

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] >>




Du musst dich registrieren um auf dieses Thema zu antworten.
Login :: » Name » Passwort

Ladezeit (sec.): 0.012 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003