Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [49] [50] >> |
Autor |
Mitteilung |
|
verfasst am: 24.05.2006, 14:41
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Hier werde ich euch ein wenig löchern.
Hinter alien_api_GetRandomAlien muss vermutlich eine Variable, richtig? Oder warum krieg ich "Identifier expected"? |
|
verfasst am: 24.05.2006, 14:46
|
Registrierdatum: 26.03.2006, 08:29
Beiträge: 83
|
Korrekt, die Syntax lautet dann:
var alien : TAlien
alien := alien_api_GetRandomAlien(); |
|
verfasst am: 24.05.2006, 15:15 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
OK, jetzt ist Fehlerfrei. Funktionieren tuts natürlich noch nicht ^^
Und wie leg ich die Anzahl fest?
Komando zurück, so wie hier, richtig? Nur halt keine UFOs
var
Index : Integer;
UFOs : Integer;
begin
// zufällige UFO-Anzahl ermitteln
UFOs := random(5) + 1;
for Index := 1 to UFOs do
begin
ufo_api_CreateUFO(); // UFO erzeugen
end; |
|
verfasst am: 24.05.2006, 15:34
|
Registrierdatum: 26.03.2006, 08:29
Beiträge: 83
|
wenn ich mich richtig erinnere und sich da nichts geändert hat, müsstest du den code noch so verändern:
var
Index : Integer;
UFOs : Integer;
UFO : TUFO;
begin
// zufällige UFO-Anzahl ermitteln
UFOs := random(5) + 1;
for Index := 1 to UFOs do
begin
UFO := ufo_api_CreateUFO(); // UFO erzeugen
end;
einfache regel: schau dir einfach im Missionseditor die entsprechende Funktion/Prozedur an. Handelt es sich um eine Funktion (das sind die mit dem gelben Pfeil davor) dann steht die so da: Funktionsname : Typ.
Dann musst du halt eine Variable des entsprechenden Typs definieren und der die Funktion zuweisen. Also im Beispiel von UFO-Erzeugung: Die Funktion ufo_api_CreateUFO ist vom Typ TUFO (dahinter stehts ja). Das heißt man muss diese Funktion einer Variablen vom Typ TUFO zuweisen, damit das funktioniert und man das UFO später noch erreichen kann, z.B. für Positionsangaben etc. |
|
verfasst am: 24.05.2006, 15:40
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Nur will ich keine UFOs ^^ sondern ich mach nur Bodeneinsätze.
OK, ich hab jetzt das zusammengeschrieben (und dabei ArneLs Struktur auch allein hingekreigt *g* So langsam kommen meine 3 Monate Pascal wieder aus den Teifen des Vergessens hervor)
Allerdings bin ich mir ziemlich sicher, dass das einsatz_api_generateeinsatz woanders hinmuss.
procedure StartMission;
var
alien: TAlien; //für alien_api_GetRandomAlien
Index: integer; //Minimumzahl
Zahl: Integer; //max. Zahl der Aliens
begin
einsatz_api_generateeinsatz //Einsatz erzeugen
begin
Zahl:= random (5) + 5; //max. Zahl der Alien 4-9
for Index:= 1 to Zahl do //für Zahl-Anzahl 1 zufälliges Alien
begin
alien := alien_api_GetRandomAlien();
end;
end;
end; |
|
verfasst am: 24.05.2006, 15:52 · Edited by: ArneL
|
Registrierdatum: 26.03.2006, 08:29
Beiträge: 83
|
Gleiche Struktur auch bei den Einsätzen: einsatz_api_GenearteEinsatz ist schon an der richtigen Stelle, da es aber auch eine Funktion ist, brauchst du auch hier eine entsprechende Variable, nämlich z.B. einsatz : TEinsatz. Und damit die Aliens im Einsatz auftauchen musst du sie noch mit einsatz.AddAlien(alien) hinzufügen. Korrekt wäre dann also
procedure StartMission;
var
alien: TAlien; //für alien_api_GetRandomAlien
Index: integer; //Minimumzahl
Zahl: Integer; //max. Zahl der Aliens
einsatz : TEinsatz; //für einsatz_api_GenerateEinsatz
begin
einsatz := einsatz_api_generateeinsatz //Einsatz erzeugen
begin
Zahl:= random (5) + 5; //max. Zahl der Alien 4-9
for Index:= 1 to Zahl do //für Zahl-Anzahl 1 zufälliges Alien
begin
alien := alien_api_GetRandomAlien();
einsatz.AddAlien(alien); //Alien zum Einsatz hinzufügen
end;
einsatz.Start; //Einsatz starten
end;
end;
Edit:
man muss natürlich einsatz_api_generateeinsatz der Variablen einsatz zuweisen ^^ |
|
verfasst am: 24.05.2006, 16:01
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
TEinsatz hatte ich inzwischen, einsatz.start kannte ich nicht mal ^^ Ist aber irgendwie logisch, obwohl es theoretisch nach dem end; von StartMission von "allein" losgehen könnte. Aber das wär wohl Spielprogrammierung und kein script.
An welche Stelle müssten jetzt Nachrichten und die Definition des Einsatzbeschreibungsinhaltes? (Also das Briefing mit den Aufgaben)
Direkt hinter einsatz_api_generateeinsatz ? |
|
verfasst am: 24.05.2006, 16:15
|
Registrierdatum: 26.03.2006, 08:29
Beiträge: 83
|
Die werden dann dem Objekt vom Typ TEinsatz zugewiesen. Beispiel:
procedure StartMission;
var
alien: TAlien; //für alien_api_GetRandomAlien
Index: integer; //Minimumzahl
Zahl: Integer; //max. Zahl der Aliens
einsatz : TEinsatz; //für einsatz_api_GenerateEinsatz
begin
einsatz := einsatz_api_generateeinsatz //Einsatz erzeugen
einsatz.Objectives := 'Test'; //Einsatzziele/Briefing
einsatz.Description := 'Test'; //Beschreibung
begin
Zahl:= random (5) + 5; //max. Zahl der Alien 4-9
for Index:= 1 to Zahl do //für Zahl-Anzahl 1 zufälliges Alien
begin
alien := alien_api_GetRandomAlien();
einsatz.AddAlien(alien); //Alien zum Einsatz hinzufügen
end;
einsatz.Start; //Einsatz starten
end;
end; |
|
verfasst am: 24.05.2006, 16:20
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beiträge: 2261
|
Zitat: ArneL UFO := ufo_api_CreateUFO(); // UFO erzeugen Das UFO:= ist nur notwendig, wenn man mit dem UFO noch etwas machen möchte. Ansonsten muss man nicht zwingend den Rückgabewert in eine Variable speichern. Zitat: ArneL einsatz.AddAlien(alien_api_GetRandomAlien); funktioniert auch und man spart sich die Variable alien.
Für die Beschreibung gibts bei TEinsatz die Eigenschaften Descriptions und Objectives. Wann du die setzt ist so ziemlich egal, sinnvollerweise aber noch vor Einsatz.Start.
Das begin ... end (ausserhalb der For-Schleife) ist auch überflüssig. Und auf eine vernüftige Einrückung wird ich auch achten, sonst kommt man früher oder später mit den begin ... end durcheinander:
procedure StartMission;
var
Index : integer; //Minimumzahl
Zahl : Integer; //max. Zahl der Aliens
einsatz : TEinsatz; //für einsatz_api_GenerateEinsatz
begin
einsatz := einsatz_api_generateeinsatz //Einsatz erzeugen
Zahl:= random (5) + 5; //max. Zahl der Alien 4-9
for Index:=1 to Zahl do //für Zahl-Anzahl 1 zufälliges Alien
begin
einsatz.AddAlien(alien_api_GetRandomAlien); //Alien zum Einsatz hinzufügen
end;
einsatz.description:='Hau den den Kopf weg';
einsatz.objectives:='Besiege alle Aliens im Gebiet';
einsatz.Start; //Einsatz starten
end; |
|
verfasst am: 24.05.2006, 16:45 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Also ich krieg immer nen runtime-error (Couls not call proc) im Spiel bei
begin
alien := alien_api_GetRandomAlien();
einsatz.AddAlien(alien); //Alien zum Einsatz hinzufügen
end;
wobei sich die genaue Zeile jedes Mal ändert, und mit der kürzeren Version auch. |
|
verfasst am: 24.05.2006, 16:49
|
Registrierdatum: 26.03.2006, 08:29
Beiträge: 83
|
benutzt du das skript wie oben? wenn ja, dann beschreib den fehler mal genauer |
|
verfasst am: 24.05.2006, 16:53 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Kann das am Missiontype liegen? Welcher muss das sein? Ich habs ja vom UFO-script übernommen.
// Missionstype festlegen
// mzUFOs = alle mit register_ufo registrierten UFOs müssen zerstört werden
// mzUser = müssen muss mit Mission_Win oder Mission_loose abgeschlossen werden
MissionType := mzUser;
Also entweder anderer type oder noch ein Mission_win rein? Oder ganz weg?
Beschreiben gibts da nicht viel. Kommt einfach nurn Infofenster
run time error in script Ressourcenbeschaffung
STARTMISSION - Line 15, Coll 11
Could not call proc |
|
verfasst am: 24.05.2006, 17:05
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beiträge: 2261
|
Could not Call Proc deutet immer darauf hin, dass du ein nicht initsialisiertes Objekt benutzt. In deinem Fall wird es Einsatz sein, weil du bestimmt der Variablen keinen Wert zuweist ...
einsatz := einsatz_api_generateeinsatz |
|
verfasst am: 24.05.2006, 17:24 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Zitat: Jim_Raynor einsatz := einsatz_api_generateeinsatz
Jepp.
@ArneL unten: Darum hab ichs wegeditiert ;) Bloß beim zweiten hab ich nicht mehr drauf geachtet. |
|
verfasst am: 24.05.2006, 17:26 · Edited by: ArneL
|
Registrierdatum: 26.03.2006, 08:29
Beiträge: 83
|
Zitat: LennStar ber weil ArneL das nicht hatte, wieder raus genommen
stimmt nicht, wenn du dir die beiden beispielskriptteile mal ansiehst, ist das in beiden drin. im ersten beispiel hab ichs zuerst vergessen, aber noch hinzugefügt. |
|
verfasst am: 24.05.2006, 18:22
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
|
@LennStar:
Wenn ich mal versuche so zwischen den Zeilen Deiner Fragen zu lesen, dann glaube ich das viele Deiner Probleme daher kommen, das Du den Unterschied zwischen Funktionen und Methoden noch nicht wirklich verinnerlicht hast.
Es gibt in Xscript eine Reihe von Funktionen die Objekte erzeugen und mit Objekten arbeiten. Aber es ist nicht möglich ein Objekt mit einer Funktion zu verändern - dafür sind die Objekteigenschaften und Objektmethoden da.
einsatz_api_generateeinsatz ist eine Funktion, die ein Objekt vom Typ TEinsatz erschafft. Dabei werden alle Werte mehr oder weniger zufällig gesetzt, insbesondere sind die Einsätze in den Skripten oben zufällig über den ganzen Globus verteilt.
AddAlien(TAlien) ist eine Methode von Objekten des Typs TEinsatz. Sie MUSS IMMER bezogen auf ein solches vorher definiertes Objekt aufgerufen werden. Ist das Objekt nicht vorhanden kommt der oben beschriebene Fehler.
Wie Jim schon an ein oder zwei Stellen hier im Forum sagte ist die Referenz im Gegensatz zum Tutorial aktualisiert auf die 0.910, d.h. alle aktuell bestehenden Eigenschaften und Methoden von TEinsatz befinden sich hier: http://doc.xforce-online.de/ger_pages/XSkriptReferenz/TypTEinsatz.html
Wenn etwas dort nicht angegeben ist dann kannst Du es beim Einsatz auch nicht verändern - und beachte bitte das dies eine Seite der Typenreferenz ist und nicht zur Funktions/Procedure-Referenz gehört.
Das liegt an dem dahinter liegenden Prinzip der Objektorientierung, bei den Funktionen findest Du normalerweise nichts was bestehende Objekte verändern kann. |
|
verfasst am: 24.05.2006, 19:21
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Zitat: DirkF Wenn ich mal versuche so zwischen den Zeilen Deiner Fragen zu lesen, dann glaube ich das viele Deiner Probleme daher kommen, das Du den Unterschied zwischen Funktionen und Methoden noch nicht wirklich verinnerlicht hast.
Hey, bis heute früh hatte ich gar nichts mehr verinnerlicht ;) Ich hab im Verlauf des Tages (fast) alles Pascal wiederentdeckt, dass ich in der Schule mal gelernt und inzwischen vollkommen vergessen hatte.
Das größte Problem ab jetzt wird erstmal sein, dass ich die ganzen api's etc. nicht kenne- von irgendwelchen porperties mal ganz zu schweigen. Ich muss also immer erst suchen, was es denn überhaupt gibt.
Ansonsten kann ich nicht sagen, dass du Unrecht hast ;)
Aber sieh es auch mal so, wenn du keine Ahnung (erst Recht nicht vom Programmieren) hast und das hier siehst:
type
TEinsatz = class(TOBJECT)
// Methoden
procedure PopulateFromUFO(UFO: TUFO);
procedure AddAlien(Alien: TAlien);
function Start: Boolean;
Dann kriegst du erst mal einen Riesen-Schock und fragst dann:
Was heißt type?
Was ist TEinsatz (Was hat das T da zu suchen?)
Was ist mit class gemeint?
TObjekt? TUFO? schon wieder so ein T? Ist das das gleiche?
usw. usw.
Da braucht ihr euch nicht wundern, wenn dann keiner anfangen will, sich ins script zu arbeiten ;)
btw: Was heißt das T da drin? Type denk ich mal, oder?
Und das _api_?
Das Tutorial (sofern vorhanden) ist gar nicht so schlecht, aber es erlaubt nun mal keine Rückfragen. Lernen geschieht durch Fehler, aber wenn es niemanden gibt, der einem sagt was falsch ist kommt man irgendwann an eine Stelle, an der man auch nach Stunden oder Tagen keine Lösung findet. |
|
verfasst am: 24.05.2006, 19:45
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
|
Dann mal zu den Antworten ;-)
type steht für eine Typen-Definition und ist einfach ein Schlüsselwort.
TEinsatz (d.h. der Bezeichner hinter dem Schlüsselwort) gibt den Namen dieses Typen an.
Einheitlich durch das ganze XScript zieht sich das T als Kennzeichnung für einen Typenbezeichner, d.h. desjenigen Bezeichners über den Du eine beliebige Variable definieren kannst.
Ich habe mich übrigens genau aus diesem Grunde (und um Tippfehlern vorzubeugen) bei allen nicht eindeutigen Bereichen bemüht eine andere Variablenbezeichnung zu nehmen, z.B. definiere ich in meinen Scripten
boden : TEinsatz;
und habe dann boden als Namen für das Objekt des Bodeneinsatzes. Dann gibt es weniger Verwechslungsmöglichkeiten wenn ich schreibe boden.addalien(alien)...
(Und nein, ich habe das auch nicht perfekt durchgezogen - manchmal ist es einfach besser verständlich wenn man schreibt UFO:TUFO; - was dann UFO als eine Variable des Typs TUFO definiert)
Alle solche Typdefinitionen stehen übrigens in der Referenz
Und wenn Du beschriebene Scripte haben willst - seit ein paar Minuten stehen unter Online-Doku - XScript - Scriptvorlagen die dokumentierten Skripte zur UFO-Steuerung.
Unter UKI_ACdown findest Du übrigens auch meine Variante zur Erzeugung eines Bodeneinsatzes beim UFO-Abschuss...
(Du wirst die aber wahrscheinlich besser verstehen wenn Du Dir die Scripte der Reihe nach von UKI_AA anfangend anschaust, da in UKI_AC nur der letzte Befehlsaufruf enthalten ist). |
|
verfasst am: 24.05.2006, 20:08 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
|
Nee, da schau ich lieber noch nicht rein. ^^
Aber gleich noch mal ein Problem: Ich hab jetzt eine Abfrage (Angriff:Boolean)eingebaut und ein if, und bekomme vor dem else ein "identifier expected"
Wieso?
Oder ist meine Erinnerung an die if-Syntax falsch?
Angriff:= game_api_Question(*zu lang*);
if (Angriff) then
begin
Einsatz:= einsatz_api_generateeinsatz //Einsatz erzeugen
Zahl:= random (5) + 5; //max. Zahl der Alien 4-9
for Index:= 1 to Zahl do //für Zahl-Anzahl 1 zufälliges Alien
begin
einsatz.AddAlien(alien_api_GetRandomAlien); //Alien zum Einsatz hinzufügen
end;
einsatz.Objectives := '- sch. Seitenbreite'; //Einsatzziele/Briefing
einsatz.Description := ' *Länge*'; //Beschreibung
einsatz.Start; //Einsatz starten
end;
else |
|
verfasst am: 24.05.2006, 20:18
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
|
Ein Semikolon beendet immer den gesamten Befehl, d.h. danach kann auch kein else zu einem Befehl mehr folgen.
Hier mal ein korrekter IF/ELSE-Auszug aus einem meiner UKI-Scripte:
if (base=basis_api_GetBasisCount-1) then
begin
Baseassault(UFO);
UFO.Escape;
exit;
end
else
begin
base:=base+1;
basis:=basis_api_GetBasis(base);
UFO.FlytoPoint(basis.position);
game_api_setInteger('UKI200base',base);
end;
Du darfst das END vor dem ELSE also nicht mit Semikolon abschließen. Das ist eine der kleinen Eigenarten auf die ich vor ein paar Monaten auch herein gefallen bin als ich mich mit den ersten Scripten versuchte... |
Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [49] [50] >> |