Entwickler-Ecke

Multimedia / Grafik - DelphiX: Minigolf?


fcg - Do 05.06.03 21:42
Titel: DelphiX: Minigolf?
hi @ all

Ich möchte mit DephiX eine Art Minigolf proggen. Eigentlich ja soweit kein Problem. Nur bei der Darstellung / Erstellung des Spielfelder haperts bei mir. Ich habe folggende Datei:


Quelltext
1:
2:
3:
4:
5:
6:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx                                  xx
xxxxx                  g                    x
xxxx                                          x
xxx                                            x


Dabei sollen Alle X Banden seien (Collidieren) und das g soll das Loch darstellen. Wie bekommen ich diesen Code einer textdate nun Sinnvoll in mein Spiel??

thÄnxX

fcg


Phobeus - Do 05.06.03 22:32

Hand aufs herz... warum den als Txt-Datei und nicht als binär Datei? Wie Du es am besten machst? Du gehst jede reihe durch und schreibst für jedes x in einem 2D-Array eine 1 ... ansonsten läßt Du eine 0 stehen.

feld : array[0..w,0..b] of Byte;

hö?
Phobeus


mimi - Fr 06.06.03 14:25

ich hatte mal das gleich versucht und habe es geschaft (siehe sokobahn 1.5 bzw. Brekout ;))
wenn du willst gibe ich dir den code....

@Phobeus
Binär hatt den nachteiel das man nicht einfach mal ebend die datei ändern kann ohne ein exteren programm zu starten bzw. zu schreiben :(

und zum teste würde ich das auch liber in einer Text datei packen :)


umpani - Fr 06.06.03 18:42

Du solltest die Textdatei als Array einlesen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
Var Karte: array[1..40,1..100] of string[1];

procedure einlesen;
var datei:textfile; 
      i,y:integer;
      zeile:string;
     
begin
  assignfile(datei,'karte.txt');
  reset(datei);
  y := 1;
  repeat
  readln(datei,zeile);
  for i := 1 to length(zeile) {nicht größer als 40} do
    begin
       karte[i,y] := copy(zeile,i,1);
    end;
  inc(y);
  until eof(datei);
closefile(datei);


end;


Jetzte ist die Textdatei 1:1 im Array vorhanden.

(Achtung, es könnten kleine Syntaxfehler im Code sein. Ich habe ihn nur aus dem Kopf hingeschrieben)


mimi - Fr 06.06.03 20:24

ich habe es per stringliste gelöst:)
und da sieht der code so aus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Sokubahn 1.0: Level Datei
LevelOptionen {
  Music:00,01,02,03,04,06,07,08,09,10,11,12,13
  TexturIndex:0,0,0,3,1
  MapSize:40
  Grafik_File:~texturen01.grf
LevelOptionen }

Draw_Karte {
################
# ..           #
#              #
#     S        #
#              #
#              #
#              #
#              #
################
Draw_Karte }


fcg - Mo 09.06.03 17:52

@mim: kannst mir den code mal bitte zuschicken..?

philipp@fcgservice.net

thÄnxX

fcg


mimi - Mo 09.06.03 19:02

hier ist der code habe:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
procedure TSokubahn.LoadFileMap(pFileName:String);
  function GetDefaultDir(Str,de:String): String;
  var
    LevelVerzeichnis:String;
  begin
    LevelVerzeichnis:=ExtractFileDir(pFileName);
    if Pos('.',str) > 0 then
      if Pos('~',str) > 0 then
        result:=getexedir + 'default\image\' +  GetToken(str,'~',2)
      else
        result:=LevelVerzeichnis + 'image\' +  str
    else
      if Pos('~',str) > 0 then
        result:=getexedir + 'default\image\' + GetToken(str,'~',2) + de
      else
        result:=LevelVerzeichnis + 'image\' + str + de ;
  end;
var
  x,y,i:Integer;
  Level:TStringList;
  str,str2,TextIndex:String;
  LevelVerzeichnis:String;
begin
  LevelVerzeichnis:=ExtractFileDir(pFileName);
  Level:=TStringList.Create;

  if FileExists( pFileName ) = True then
    Level.LoadFromFile(pFileName)
  else begin
    ShowMessage('Level Datei: "' + pFileName + '"' + ' nicht gefunden !' );
    Exit;
  end;

  with Level do begin
    if Strings[0] <> LevelHeader then begin
      ShowMessage('Keine Sokubahn 1.0 Level Datei');
      Exit;
    end;
    
    for i:=IndexOf('LevelOptionen {')+1 to Indexof('LevelOptionen }')-1 do begin
      Str:=UpperCase(Trim(GetToken(Strings[i],':',1)));
      Str2:=UpperCase(Trim(GetToken(Strings[i],':',2)));

      if Str = UpperCase('Music'then
        GameSound:=TSound.create(Str2,LevelVerzeichnis + '\Music\''.mid',None);

      if Str = UpperCase('TexturIndex'then TextIndex:=Str2;
      if Str = UpperCase('MapSize'then
        SetMapSize(640 div StrToInt(Str2)-1,384 div StrToInt(Str2)-1,StrToInt(Str2) );

      if Str = UpperCase('Grafik_File'then
        GLXImageList.Items.LoadFromFile(GetDefaultDir( str2,'.grf') )


    end;
   
    ZielIndex:=StrToInt(GetToken( TextIndex,',',4));
    for y:=indexof('Draw_Karte {')+1 to IndexOf('Draw_Karte }')-1 do begin
      for x:=0 to MapX+1 do begin
        str:=Strings[y];                   

       if (str[x] = '#'and (Map[x-1,y-indexof('Draw_Karte {')-1].typ = None) then begin // Eine Wand
          Map[x-1,y-indexof('Draw_Karte {')-1].typ:=wand;
          Map[x-1,y-indexof('Draw_Karte {')-1].tex:=StrToInt(GetToken(TextIndex,',',1));
          Continue;
        end
        else begin
          if (upperCase(Str[x])  = 'R'and (Map[x-1,y-indexof('Draw_Karte {')-1].typ = None) then begin // eine Wand
            Randomize;
            Map[x-1,y-indexof('Draw_Karte {')-1].typ:=wand;
            Map[x-1,y-indexof('Draw_Karte {')-1].tex:=Random(3);
            Continue;
          end
          else begin
            if (Str[x] <> ''and (str[x] in ['0'..'9']) and (Map[x-1,y-indexof('Draw_Karte {')-1].typ = None) then begin
              Map[x-1,y-indexof('Draw_Karte {')-1].typ:=wand;
              Map[x-1,y-indexof('Draw_Karte {')-1].tex:=StrToInt(str[x]);
              Continue;
            end
          end;
        end;

        if str[x] = '-' then begin // Eine Kiste
           if Map[x-1,y-indexof('Draw_Karte {')-1].typ = None then begin
              Map[x-1,y-indexof('Draw_Karte {')-1].typ:=Kasten;

              Map[x-1,y-indexof('Draw_Karte {')-1].Tex:=StrToInt(GetToken(TextIndex,',',2));
              Continue;
           end;
         end;

        if str[x] = '.' then begin // Ein Ziel
          if Map[x-1,y-indexof('Draw_Karte {')-1].typ = None then begin
            Map[x-1,y-indexof('Draw_Karte {')-1].typ2:=Ziel;
            Map[x-1,y-indexof('Draw_Karte {')-1].Tex2:=StrToInt(GetToken(TextIndex,',',3));
            Continue;
          end;
        end;

        if str[x] = 'S' then begin // Eine Start Position
          if StartPositionen = '' then
            StartPositionen:= StartPositionen + IntToStr(x-1) + ',' + IntToStr(y-indexof('Draw_Karte {')-1)
          else
            StartPositionen:= StartPositionen + '|' +IntToStr(x-1) + ',' + IntToStr(y-indexof('Draw_Karte {')-1);
          Continue;
        end;


      end// for X
    end// For Y
  end;
  Player.x:=PlayerRandomPos(StartPositionen).x;
  Player.y:=PlayerRandomPos(StartPositionen).Y;
  Player.Tex:=StrToInt(GetToken(TextIndex,',',4));

  GameSound.PlayMusikFile(10);
end;


fcg - Mo 09.06.03 19:34

jo danke. werde mich mal da durcharbeiten...

fcg