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 —› Länge von Mehrdimensionalen Arrays bestimmen

Autor Mitteilung
verfasst am: 01.07.2011, 20:44 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Für ein Kartenscript muss ich beide Längen eines zweidimensionalen Arrays herausfinden. Das erste ist ja noch recht einfach. Hier das Script in gekürzter, aber reproduzierbarer Form:
procedure GenerateMap;
var
  Rooms: Array of Array of String;
  i, StreetsType, CursorX, CursorY: Integer;
begin
  SetLength(Rooms,GetMapWidth);
  for i:=0 to High(Rooms) do
    SetLength(Rooms[i],GetMapHeight);

// ... Quelltext hier gekürzt.

  CursorX:=random(high(Rooms));
  CursorY:=random(high(Rooms[CursorX]));
end;

begin
  // Hier darf kein weiterer Code folgen
end.


Bei der Zeile CursorX:=random(high(Rooms)); tritt noch kein Problem auf. Bei CursorY:=random(high(Rooms[CursorX])); macht der Editor aber Probleme und redet von einem "Type mismatch" in der Zeile. Kann mir da jemand helfen?
verfasst am: 02.07.2011, 00:34 · Edited by: Andiana
Registrierdatum: 21.10.2005, 20:08

 Beiträge: 131
sorry hab das high übersehen...

Aber CursorY:=random(GetMapHeight) würde doch das gleiche tun oder?
verfasst am: 02.07.2011, 11:08
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Hmm... das stimmt. Danke, das hilft mir weiter. :)
verfasst am: 02.07.2011, 11:10
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Jim_Ranyor hatte die mehrdimensionalen Arrays damals nur grob implementiert - sie funktionieren bei normalen Zugriffen, aber wenn man indirekte Tricks versucht, dann kann es immer zu Problemen kommen.
In solchen Fällen hilft es normalerweise, den gewünschten Teil des mehrdimensionalen Array in einen temporären eindimensionalen Array zu kopieren und den dann zu benutzen.

Was die zweite Frage angeht: random(GetMapHeight) gibt eine zufällige Raum-Koortinatezahl entlang einer Seite der Karte zurück, mit random(GetMapWidth) würdest du die andere Koordinatenzahl kriegen.

Ich kann nur nicht sagen ob das das ist was Du haben willst, da Du nur Teile des Codes gepostet hast...
verfasst am: 02.07.2011, 12:23 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Das Script selbst hat recht viele für das Problem irrelevanten Zeilen. Dort wo der Quelltext gekürzt ist, wird Rooms mit den einzelnen Räumen gefüllt. Dafür nutze ich aber viele Case-Verzweigungen (Mapgröße, Raster der Straßen, ..., (es handelt sich um eine Stadt-Map)) Anschließend soll ein zufälliger Straßen-Raum ausgewählt und durch den Raum mit den XForce-Spawnpunkten (ein gelandetes Transport-"Raumschiff" als Render-Tile, derzeit noch ein wenig unschön) ersetzt. Hatte letztens bei einer anderen Map gemerkt, dass ein zweites CopyRoomToPos auf einer Position den Raum nicht überschreibt, sondern die Tiles addiert. daher speichere ich das ganze vorher als Array, um hinterher einzelne Räume ersetzen zu können. Der ganze untere Teil des Scripts sieht so aus:
// Erzeuge sooft zufällige Koordinaten, bis der gewählte Raum eine Straße ist.
  repeat
    CursorX:=random(GetMapWidth);
    CursorY:=random(GetMapHeight);
  until Copy(Rooms[CursorX][CursorY],1,6)='street';

// Ersetze die aktuelle Straße mit dem entsprechenden XForce-Raumschiff-Raum
  Rooms[CursorX][CursorY]:=Copy(Rooms[CursorX][CursorY],1,9)+'xforce';

// Fülle die Map mit den Räumen aus dem Array
  for CursorX:=0 to GetMapWidth do
    for CursorY:=0 to GetMapHeight do
      CopyRoomToPos(CursorX,CursorY,Rooms[CursorX][CursorY]);


Hinweis: Die Straßen-Räume sind benannt in:
"street_H_1" .. "street_H_5", "street_H_xforce" (Horizontale Straßen)
"street_V_1" .. "street_V_5", "street_V_xforce" (Vertikale Straßen)
"street_X_1" .. "street_X_3", "street_X_xforce" (Kreuzungen)
verfasst am: 03.07.2011, 16:37 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Um die ursprüngliche Frage bezüglich der Länge von mehrdimensionalen Arrays nun zu beantworten, zur Vollständigkeit einmal die Lösungsmöglichkeiten:
x:=high(Array);
y:=high(Array[x]);
funktioniert NICHT. (Zeilenumbruch hier einfügen) So funktionierts: Entweder man speichert wie DirkF beschrieben die zweite Array-Dimension in ein temporäres Array und nimmt seine Länge:
x:=high(Array);
TempArray:=Array[x];
y:=high(TempArray);
Oder man speichert direkt beim Bestimmen der Array-Längen diese in Integer-Variablen (falls, wie in meinem Fall, nicht bereits entsprechende Variablen (MapWidth, MapHeight) existieren):
x:=4;
y:=4;
SetLength(Array,x);
for i:=0 to x-1 do
  SetLength(Array[i],y);



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

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