Hi.
Also, zu dem Terrain.
Hier der Code für ne Wiese mit vordefinierten Wegen.
Zuerst legst du ein Bitmap-File mit der Größe deines Terrains an. Also wenn das Terrain 64*64 groß sein soll, dann wird das Bitmap 64*64 Pixel groß.
Nehmen wir an du willst also ein Terrain machen, welches einfach eine Wiese mit einem kleinen Platz und nem Teich darin darstellen soll. Bei mir würde das dann so aussehen (64*64)
http://flips5.fl.funpic.de/map.png
Zur Farberklärung:
- Grün->Wiese
- Dunkles Grau->Kiesel
- Helles Grau->Übergang Wiese-Kiesel oder Kiesel-Wasser (mit Blending beispielsweise)
- Blau->Wasser
So, jetzt brauchst du noch ne Routine zum auslesen (Optimierungswürdig
):
Delphi-Quellcode:
const SECTORS_COUNT = 4; //Wasser, Wiese, Kiesel, Grenzfäche
SIZE = 4096; //64*64
LENGTH = 64;
type Pixel = record
koordinate : TPoint;
farbe : TColor;
end;
type Sector = record
farbe : TColor;
filename : string;
end;
//Global
var Pixels : array [0..SIZE] of Pixel;
Sectors : array [0..SECTORS_COUNT-1] of Sector;
bit : TBitmap;
[...]
//=======ONCREATE========//
Sectors[0].farbe = clGreen;
Sectors[0].filename = 'texturen/wiese.tga';
[...]
bit := TBitmap.Create;
try
bit.LoadFromFile(ExtractFilePath(ParamStr(0))+'level1.bmp');
i:=0;
for x := 0 to bit.Width-1 do
for y := 0 to bit.Height-1 do
begin
Pixels[i].color := bit.Canvas.Pixels[x,y];
Pixels[i].koordinate.X := x;
Pixels[i].koordinate.Y := y;
inc(i);
end;
finally
bit.Free;
end;
[...]
Wie gesagt, der Code is optimierungswürdig
So, als nächstes brauchst du einen Code der das ganze in
OpenGL darstellt.
Delphi-Quellcode:
procedure RenderPixel(pPixel:TPixel;Nummer:integer);
begin
case pPixel.Color of
clGreen : WiesenTextur.Bind; //Entsprechende Texturen Binden
clGray : Kiesel.Bind; //Entsprechende Texturen Binden
clMedGray : //Hier musste dir halt überlegen wie du das mit dem Blending machst :-)
clBlue : Wasser.Bind; //Entsprechende Texturen Binden
end;
with pPixel.koordinate do
begin
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(x,1,y -LENGTH);
glTexCoord2f(0,1);
glVertex3f(x,1,(y-LENGTH)+1);
glTexCoord2f(1,1);
glVertex3f(x+1,1,(y-LENGTH)+1);
glTexCoord2f(1,0);
glVertex3f(x+1,1,y-LENGTH);
glEnd();
end;
end;
//Aufruf
procedure Render;
var i:integer;
begin
//Der sonstige OGL Kram
//...
for i := 0 to SIZE-1 do
RenderPixel(Pixels[i],i);
//Der sonstige OGLKram
//...
end;
So ich nehme an die Hälfte is falsch un die andere Hälfte hab ich vergessen^^
Philipp F.