Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [34] [35] >> |
Autor |
Mitteilung |
|
verfasst am: 09.05.2010, 11:56 · Edited by: sujin
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
|
Wie läuft das eigentlich? Wenn ich einen BE mit drei Aliens habe, und alle drei das gleiche AI-Skript haben, in dem z.B. an globalen Variablen rumgepfuscht wird - kann ich wissen, ob zum Beispiel sowas immer funktioniert, wie es soll (dasdas Skript foo nur einmal gestartet wird)?
if (game_api_CheckGlobalVar(SWITCH) = gvtNotDefined) then
begin
game_api_RegisterBoolean(SWITCH);
end;
game_api_SetBoolean(SWITCH, False);
if (not game_api_GetBoolean(SWITCH)) and
(groundAI_api_GetRunningGround() <> nil) then
begin
game_api_SetBoolean(SWITCH, True);
mission_api_StartScriptWithObject('foo',
whatever);
end;
mission_win();
Wirklich parallel werden die Skripte wohl kaum ausgeführt (Multicore-CPUs ausgenommen, falls Delphi das unterstützt), aber geben die Skripte die Stafette nach je einem Byte-Opcode oder nach 50 ab?
Ich hoffe, meine Frage ist einigermaßen verständlich. |
|
verfasst am: 09.05.2010, 13:20 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Parallel kannst du vergessen. Selbst wenn man einen Multicoreprozessor hat und selbst wenn Delphi dss unterstützen würde - dann müsste der Quellcode immernoch dafür ausgelegt sein. Und dass ist eine extrem schwierige Geschichte, die in einem Rundenbasierten spiel imho völlig unnötig ist. Das Ganze läuft immer linear ab, ein Befehl nach dem anderen. |
|
verfasst am: 09.05.2010, 13:28
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
|
Also so?
- Skript 1 macht einen Befehl
- Skript 2 macht einen Befehl
- ...
- Skript N-1 macht einen Befehl
- Skript N macht einen Befehl
- Skript 1 macht einen Befehl
- ...
Und wenn ja, was zählt als Befehl? Alles von einem ; zum nächsten, oder 1 Pascalscript-Opcode (der vermutlich deutlich kleiner ist)? |
|
verfasst am: 09.05.2010, 13:35 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Du musst überlegen, wann ein Skript vom Programm aufgerufen wird. Wenn z.B. 2 Skripte auf ein Event reagieren, dann wird in beiden Skripten die damit verknüpfte Funktion aufgerufen. Da aber immer nur ein Befehl auf einmal aufgerufen werden kann, wird natürlich auch zuerst in Skript A die entsprechende Funktion aufgerufen. Daraufhin "verliert" das Hauptrogramm die Kontrolle bis diese Funktion abgearbeitet wurde (sonst hätte man ja wieder Parallelität). Erst wenn das Skript A nix mehr zu tun hat kann dann vom Hauptprogramm für das Event die entsprechende Funktion in Skript B aufgerufen werden. Prinzipiell wird ein Programm niemals wahllos zwischen verschiedenen Programmzeilen hin und her springen, sondern immer Zeile für Zeile abarbeiten. Wird irgendwo eine Funktion aufgerufen, so wird diese zunächst vollständig abgearbeitet ehe es weiter geht. Um dafür ein besseres Gefühl zu bekommen, kannst du deine Skripte in medit ja mal Zeilenweise ausführen. |
|
verfasst am: 09.05.2010, 13:39
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
|
Cool, danke. Determinismus ftw ;-) |
|
verfasst am: 13.05.2010, 23:20
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
|
Das scheint doch nicht so zu funktionieren, wie ich es mir dachte... der eingangs gepostete Code sorgt nämlich eben nicht dafür, dass 'foo' nur einmal gestartet wird.
Zur Erklärung: Ich wollte mir den Umweg sparen, ein extra Skript für jeden Fall, in dem ich es einsetze, zu schreiben und habe mir gedacht, ich könnte es ja eine Alien-AI wie weiteroben gepostet schreiben, die einfach nur die Kontrolle an foo weitergibt. Aber wie ich jetzt mit Messageboxen erfahren habe, startet das Skript einmal, wo noch kein Alien im BE ist, dann nochmal mit einem, wieder mit zweien, usw.
Vorschläge? |
|
verfasst am: 13.05.2010, 23:25 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
|
Etwas mehr Beispielcode wäre glaube ganz hilfreich ;)
Vom Prinzip her müsste es mit einer solchen Abfrage klappen. Wobei in obiger Funktion ja immer
game_api_SetBoolean(SWITCH, False);
aufgerufen wird. Folglich ist auch die nachfolgende if-Abfrage sinnlos (weil sie immer ausgeführt wird). |
|
verfasst am: 14.05.2010, 00:12
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
|
Ach ja... ich bin mal wieder blind 8)
Das Setzen auf False muss im gestarteten Skript passieren. |
|
verfasst am: 27.01.2022, 13:17
|
Registrierdatum: 27.01.2022, 13:07
Beiträge: 318
|
|
|
verfasst am: 24.03.2022, 19:17 · Edited by: anna12
|
Registrierdatum: 28.02.2022, 13:12
Beiträge: 63
|
|
|
verfasst am: 13.06.2022, 17:39
|
Registrierdatum: 29.10.2021, 14:57
Beiträge: 763
|
|
|
verfasst am: 22.11.2023, 10:38
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 01.02.2024, 18:33
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 14:01
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 14:02
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 14:05
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 14:06
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
|
verfasst am: 11.04.2024, 14:07
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 223544
|
|
Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [34] [35] >> |