ISOMetric Game Maps 1000 & 500 Pts

Im looking for DELPHI SOURCE for a ISO Metric map for game use, there are 2 types i need, both have to work in Delphi 3, using DIB's, WrapX or just TCanvas.

1.(500 Points) Simple ISOMetric Map
where you have map as it is in Age of empires eg. Map drawed in a Dimond shaped format and the non-map is black, + Get what ISO-Tile was clicked on.

2.(1000 Points) Advanced ISOMetric Map
like the Simple one but with same features/example as Simcity 2/3000, Transport Tycoon, RollerCoaster Tycoon where you can Raise/Lower Land.

Both can be as a small game sample on a form just mixed to work but as a GraphicControl or such is also ok.

if you need Screenshots of what im talking about just let me know and ill kick some online.

If interested you can get Full Licence for WrapX in addition to points.
As we will use this help for developing Map Engine + Samples etc for WrapX too.
www.wrapx.suite.dk

Regards
Michael V. Andersen - BrainWare Software
brainware@cyberjunkie.dk
LVL 2
brainwareAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

TheNeilCommented:
Your draw routine is actually pretty easy. You just need to specify the size of your blocks in two variables, Block_Width and Block_Height, and the number of blocks tro display across and down the screen (held in no_rows, and no_columns).

Display.Canvas.Brush.Color := clBlack;
Display.Canvas.FillRect(RECT(0, 0, Display.Width, Display.Height));
FOR m := 0 TO (no_rows - 1)
DO
  FOR n := 0 TO (no_columns - 1)
  DO
    IF ODD(m)
    THEN
      Display.Canvas.Draw(Block_Width DIV 2 + Block_Width * n, m * (Block_Height DIV 2), Graphic)
    ELSE
      Display.Canvas.Draw(Block_Width * n, m * (Block_Height DIV 2), Graphic);

Just make sure that when you draw your graphics, you draw them transparently.

The selection process is a little more complex but still not too diffcult. There are a couple of ways but a good cheat (and quick) way is to create a selection mask while drawing the blocks.

Using the above code, create a second bitmap (24 bit colour) the same size as your drawing area and clear it all to black. When you draw the block onto the display, also draw a polygon onto this second bitmap. e.g.

SelectionMap.Canvas.Brush.Color := clBlack;
SelectionMap.Canvas.FillRect(RECT(0, 0, SelectionMap.Width, SelectionMap.Height));
Display.Canvas.Brush.Color := clBlack;
Display.Canvas.FillRect(RECT(0, 0, Display.Width, Display.Height));
FOR m := 0 TO (no_rows - 1)
DO
  FOR n := 0 TO (no_columns - 1)
  DO
  BEGIN
    SelectionMap.Canvas.Brush.Color := m * no_columns + n;
    SelectionMap.Canvas.Pen.Color := m * no_columns + n;

    IF ODD(m)
    THEN
    BEGIN
      Display.Canvas.Draw(Block_Width DIV 2 + Block_Width * n, m * (Block_Height DIV 2), Graphic);
      SelectionMap.Canvas.Polygon([Point(Block_Width * (n + 1), m * (Block_Height DIV 2)),
                                   Point(Block_Width * (n + 1) + Block_Width DIV 2, m * (Block_Height DIV 2) + Block_Height DIV 2),
                                   Point(Block_Width * (n + 1), m * (Block_Height DIV 2) + Block_Height),
                                   Point(Block_Width * (n + 1) - Block_Width DIV 2, m * (Block_Height DIV 2) + Block_Height DIV 2)])
    END
    ELSE
    BEGIN
      Display.Canvas.Draw(Block_Width * n, m * (Block_Height DIV 2), Graphic);
      SelectionMap.Canvas.Polygon([Point(Block_Width * (n + 1) - Block_Width DIV 2, m * (Block_Height DIV 2)),
                                   Point(Block_Width * (n + 1), m * (Block_Height DIV 2) + Block_Height DIV 2),
                                   Point(Block_Width * (n + 1) - Block_Width DIV 2, m * (Block_Height DIV 2) + Block_Height),
                                   Point(Block_Width * (n + 1) - Block_Width, m * (Block_Height DIV 2) + Block_Height DIV 2)])
    END;
  END;

When you get your mouseevent (And therefore the co-ordinates, you just pull the pixel from the SelectionMap.

e.g. Index := SelectionMap.Canvas.PIxels[X, Y] - 1;

Index now contains the index of the block in the grid.

As for doing a raised map then I'm fresh out of ideas, the drawing is a doddle (you can use the code above) but selection is tricky unless you limit yourself to selecting at 'ground' level. To get an impression of raised buildings, you really need to modify your graphics rather than any code. The above code layers everything so that the most distant objects get drawn first. Say your 'ground' is 64x32 pixels but your building can be up to 128 pixels high, you need to set the block width and height to be 64 and 32 respectively in the above code, and it'll handle the rest for you. If you want a more detailed explanation then just ask.

The Neil

   
0
LischkeCommented:
Michael,

please visit http://www.digitalprojects.com/way-x/english.htm for the 3D TT engine and look if this is what you want. The description on the games engine list (http://cg.cs.tu-berlin.de/~ki/engines.html) states:

3D TT is a 3D game engine for a game like Transport Tycoon for Windows from Peter Dobrovka ( dobrovka@hkn.de ) and WAY-X (a group of hobby programmers).
Based on OpenGL
Multitextured landscape (without shading)
Perspective and isometric view
Large maps (1024x1024)
3D Sprites
Moving objects (esp. trains)
Integrated editor
Written in Delphi Pascal
More information, screenshots and a demo can be found on the (german) WAY-X Homepage under 3DTT (click one of the four icons in the top frame to view screenshots etc).


Ciao, Mike
0
brainwareAuthor Commented:
TheNeil: checking out you idea, mostley the selecting part im wondering about..
did manage to do a Normal ISO Map once eg. Drawed as a normal Rectangular map like C&C.  

Lischke: i found Way-X months ago but have nothing to do with the Map i need, Way-X is 3D, the ISO Map used in Transport Tycoon Deluxe etc is simply 2D eg. IsoMetric / Visual Illusion.


Even if TheNeil's way work for Simple i would still be needing the Advanced one wich is a bit harder and the type where i have never found any docs nor source for.
0
Cloud Class® Course: Microsoft Office 2010

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

brainwareAuthor Commented:
TheNeil i just wrapper a fast code out from what you wrote, but about the selecting i was Refereing to getting the Block eg. Inside the Correct Poly,
not drawing it, all you showed i can do in a few minutes my self as i just did,
check the code i zipped up and mabye continiue on that if you want.
http://www.bw-soft.com/devtemp/

i sayd SIMPLE w. Dimond Shaped MAP,
a bad sketch :
###/\###
##/  \##
##\  /##
###\/###

drawing it as a Rectangular map is no challange..
0
TheNeilCommented:
What is the problem with the selection idea? Using the second bitmap (the selection map), you can quickly find out which block the user clicked on. Isn't that what you wanted?

The Neil
0
brainwareAuthor Commented:
Not quite sure i understand that idea, would you please kick some sample together.
Mail it to me if you want or post url here to a file.

PS: When this is solved i will make a larger sample(s) avalible and post urls here.

About Lower/Raise im not talking about Simple Building heights, but LAND eg. you can raise land build a tunnel if you like and build on top of that, eg having a 3 Dim Array, but that's also just for Advanced type as i sayd..



0
TheNeilCommented:
I'll explain it in detail then.

When you're creating your display (actually drawing your graphics to the display), you also create a second bitmap (the selection map) where you draw polygons that happen to be the same shape as your graphics (in this case diamonds). The clever part comes in the colour that you draw the polygon in. By using a 24 bit bitmap (in memory), you create a direct mapping between the colour and the block that it represents. Therefore the first block in your grid has a colour of just 1 (very, very dark red RGB(1, 0, 0)), the second has 2 etc. When the user clicks on the display you use the mouse co-ordinates to access the pixel property of the selection map image.

e.g.

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  iIndex := SelectionMap.Canvas.Pixels[x, y];
end;

iIndex now contains the index into the array of elements. Because you initially clear the selection map image to black, you'll get a value of zero returned when the user clicks outside the valid area.

It's as simple as that.

If you want the actual code sample then give me an e-mail address and I'll create a sample app.

I'll have a think on the diamond drawing algorithm.

The Neil
0
brainwareAuthor Commented:
hmm yeah please send a sample, that way is rather weird to my ears and understanding.. mabye i have just been working other ways for way to longm who knows :)
E-MAIL Listed at top..

You get 1 Index pointing to what?
what kind of an Array are you taloking about? normaly i would use a Array[0..mapwidth,0..mapheight] of a ISOBlock

NOT to be a dificult person, but aint there some good way just to check if its inside Block?'s Polygon insted? just becuse wasting memory for somthing like this is NOT my style..

Also becuse the game will need a lot of memory already, so saving a few kb when possiple i want to do it.
0
brainwareAuthor Commented:
Have you ever worked with Isometric maps ?
Anyhow Anyone else with some bright ideas????
0
brainwareAuthor Commented:
Check ISO Layers here.. its C++/C++ Builder source, i just downloaded it and will take a look at it my self, but if there was anything interesting to someone else well take a look..

http://www.serpentsoftware.com/progindex.html
0
JaccoCommented:
I did not yet work it out fully but here is some preliminary result of determining where you are in the isometric grid:

function CoordToISOCoord(x,y: Integer): TPoint;
var
  p, i: TPoint;
  dx, dy: Integer;
begin
  // determine rectange
  p.X := X div Block_Width;
  p.Y := 2 * (Y div Block_Height);
  // determine the offset within the retangle
  i.X := X mod Block_Width;
  i.Y := Y mod Block_Height;
  // determine the quadrant
  dx := -1;
  if i.X > Block_Width div 2 then begin
    i.X := -(i.X - (Block_Width div 2)) + (Block_Width div 2);
    dx := 0;
  end;
  dy := -1;
  if i.Y > Block_Height div 2 then begin
    i.Y := -(i.Y - (Block_Height div 2)) + (Block_Height div 2);
    dy := 1;
  end;
  // if external
  if (Block_Height div 2)- i.X * (Block_Height / Block_Width) > i.Y then begin
    p.X := p.X + dx;
    P.Y := p.Y + dy;
  end;
  Result := p;
end;

Regards Jacco
0
brainwareAuthor Commented:
Jacco, ill take a look at it.

btw.. wondering if any of ya have seen
Railroad Tycoon II Gold, i just tryed it and the graphics are great.. but also the Isometric map is special, not fixed heights like sc2000 etc but a bit like Voxel generated maps.
0
ZifNabCommented:
brainware,

Can you put somewhere a snapshot of Tycoon II on a site? Perhaps I know a way.

Zif.
0
JaccoCommented:
Hi brainware, here is something I cooked up. Use left mouse button to "raise" land and right mouse button to "lower" land. Randomize button randomizes terrain.

// START OF DFM
object Form1: TForm1
  Left = 11
  Top = 107
  Width = 770
  Height = 438
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object pbScreen: TPaintBox
    Left = 8
    Top = 40
    Width = 729
    Height = 345
    OnMouseDown = pbScreenMouseDown
    OnMouseMove = pbScreenMouseMove
  end
  object btnRandomize: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Randomize'
    TabOrder = 0
    OnClick = btnRandomizeClick
  end
  object sbHori: TScrollBar
    Left = 8
    Top = 392
    Width = 729
    Height = 16
    PageSize = 0
    TabOrder = 1
    OnChange = sbHoriChange
  end
  object sbVert: TScrollBar
    Left = 744
    Top = 40
    Width = 16
    Height = 345
    Kind = sbVertical
    PageSize = 0
    TabOrder = 2
    OnChange = sbVertChange
  end
end
// END OF DFM

// START OF CODE
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    btnRandomize: TButton;
    pbScreen: TPaintBox;
    sbHori: TScrollBar;
    sbVert: TScrollBar;
    procedure btnRandomizeClick(Sender: TObject);
    procedure sbHoriChange(Sender: TObject);
    procedure sbVertChange(Sender: TObject);
    procedure pbScreenMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure pbScreenMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure DrawMap;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

const
  Map_Width  = 100;
  Map_Height = 100;
  Tile_Width  = 40;
  Tile_Height = 30;
  clDark  = $023F3F3F;
  clMid   = $027F7F7F;
  clLight = $02C0C0C0;
  Map_Colors: array[-1..1,-1..1] of TColor =
    (
      ( clDark   , clDark   , clMid    ),
      ( clDark   , clBlue   , clMid    ),
      ( clLight  , clLight  , clLight    )
    );

type
  TMap = array[0..Map_Width+1,0..Map_Height+1] of Integer;
var
  Map: TMap;
  Map_Left: Integer = 20;
  Map_Top : Integer = 20;
  Map_Cursor: TPoint;
  Map_Point : Integer;
  bmp: TBitmap;

procedure NudgeEdge(x,y,d: Integer);
var
  t: Integer;
begin
  if (x<0) or (y<0) or (x>Map_Width+1) or (y>Map_Height+1) then Exit;
  Map[x,y] := Map[x,y] + d;
  t := Map[x,y];
  if Abs(Map[x-1,y-1]-t) > {2}1 then NudgeEdge(x-1,y-1,d);
  if Abs(Map[x  ,y-1]-t) > 1 then NudgeEdge(x  ,y-1,d);
  if Abs(Map[x+1,y-1]-t) > {2}1 then NudgeEdge(x+1,y-1,d);
  if Abs(Map[x-1,y  ]-t) > 1 then NudgeEdge(x-1,y  ,d);
  if Abs(Map[x+1,y  ]-t) > 1 then NudgeEdge(x+1,y  ,d);
  if Abs(Map[x-1,y+1]-t) > {2}1 then NudgeEdge(x-1,y+1,d);
  if Abs(Map[x  ,y+1]-t) > 1 then NudgeEdge(x  ,y+1,d);
  if Abs(Map[x+1,y+1]-t) > {2}1 then NudgeEdge(x+1,y+1,d);
end;

function CoordToScreen(x,y: Integer): TPoint;
begin
  Result.X := ((Map_Width div 2)+1) * Tile_Width + x * (Tile_Width div 2) - y * (Tile_Width div 2);
  Result.Y := x * (Tile_Height div 2) + y * (Tile_Height div 2);
  Result.Y := Result.Y - Map[x,y] * (Tile_Height div 4);
  Result.X := Result.X - Map_Left * Map_Width;
  Result.Y := Result.Y - Map_Top  * Map_Height;
end;

function InOnePlane(x,y: Integer): Boolean;
begin
  // check if diagonals cross in one point
  Result := Map[x  , y  ] + 0.5 * (Map[x+1,y+1] - Map[x  ,y  ]) =
            Map[x+1, y  ] + 0.5 * (Map[x  ,y+1] - Map[x+1,y  ]);
end;

procedure TForm1.DrawMap;
var
  x,y: Integer;
  p1,p2: TPoint;
  weDir, nsDir: Integer;
begin
  bmp.Canvas.Brush.Style := bsSolid;
  bmp.Canvas.Brush.Color := clWhite;
  bmp.Canvas.FillRect(Rect(0,0,bmp.Width,bmp.Height));
  for x := 0 to Map_Width do
    for y := 0 to Map_Height do begin
      p1 := CoordToScreen(x,y);
      if (p1.X < -Tile_Width ) or (p1.X > pbScreen.Width + Tile_Width  ) or
         (p1.Y < -Tile_Height) or (p1.Y > pbScreen.Height + Tile_Height) then Continue;
      bmp.Canvas.Pen.Color := clBlack;
      if InOnePlane(x,y) then begin
        // if in one plane ==>
        weDir := (Map[x, y+1] - Map[x+1, y  ]);
        nsDir := (Map[x, y  ] - Map[x+1, y+1]);
        bmp.Canvas.Brush.Color := Map_Colors[weDir,nsDir];
        bmp.Canvas.Polygon([
          CoordToScreen(x  ,y  ),
          CoordToScreen(x+1,y  ),
          CoordToScreen(x+1,y+1),
          CoordToScreen(x  ,y+1)
        ]);
      end else begin
        // else draw the two triangles ==>
        if (Map[x,y] = Map[x+1,y+1]) and (Map[x+1,y] = Map[x,y+1]) then begin
          // both triangulations are possible
          // make a good choice....
        end;
        // only one triangulation is possible
        nsDir := 0;
        weDir := 0;
        if Map[x,y] = Map[x+1,y+1] then begin
          weDir := -(Map[x,y] - Map[x, y+1]);
          bmp.Canvas.Brush.Color := Map_Colors[weDir,nsDir];
          bmp.Canvas.Polygon([
            CoordToScreen(x  ,y  ),
            CoordToScreen(x+1,y+1),
            CoordToScreen(x  ,y+1)
          ]);
          weDir := Map[x,y] - Map[x+1, y];
          bmp.Canvas.Brush.Color := Map_Colors[weDir,nsDir];
          bmp.Canvas.Polygon([
            CoordToScreen(x  ,y  ),
            CoordToScreen(x+1,y+1),
            CoordToScreen(x+1,y  )
          ]);
        end else if Map[x+1,y] = Map[x,y+1] then begin
          nsDir := -(Map[x+1,y] - Map[x,y]);
          bmp.Canvas.Brush.Color := Map_Colors[weDir,nsDir];
          bmp.Canvas.Polygon([
            CoordToScreen(x+1,y  ),
            CoordToScreen(x  ,y+1),
            CoordToScreen(x  ,y  )
          ]);
          nsDir := Map[x+1,y] - Map[x+1,y+1];
          bmp.Canvas.Brush.Color := Map_Colors[weDir,nsDir];
          bmp.Canvas.Polygon([
            CoordToScreen(x+1,y  ),
            CoordToScreen(x  ,y+1),
            CoordToScreen(x+1,y+1)
          ]);
        end;
      end;
    end;
  // draw the cursor
  bmp.Canvas.Brush.Color := clRed;
  with Map_Cursor do begin
    if (x<>-1) and (y<>-1) then begin
      bmp.Canvas.Polygon([
        CoordToScreen(x  ,y  ),
        CoordToScreen(x+1,y  ),
        CoordToScreen(x+1,y+1),
        CoordToScreen(x  ,y+1)
      ]);
      case Map_Point of
        0: p1 := CoordToScreen(x  ,y  );
        1: p1 := CoordToScreen(x+1,y  );
        2: p1 := CoordToScreen(x+1,y+1);
        3: p1 := CoordToScreen(x  ,y+1);
      end;
      bmp.Canvas.Brush.Color := clWhite;
      bmp.Canvas.Ellipse(p1.X-4,p1.Y-4,p1.X+4,p1.Y+4);
    end;
  end;
  pbScreen.Canvas.Draw(0,0,bmp);
end;

procedure TForm1.btnRandomizeClick(Sender: TObject);
var
  i, x, y: Integer;
begin
  for i:=1 to 1000 do begin
    x := Random(Map_Width+1);
    y := Random(Map_Height+1);
    if Random > 0.5 then
      NudgeEdge(x,y,1)
    else
      NudgeEdge(x,y,-1);
  end;
    DrawMap;
end;

procedure TForm1.sbHoriChange(Sender: TObject);
begin
  Map_Left := sbHori.Position;
  DrawMap;
end;

procedure TForm1.sbVertChange(Sender: TObject);
begin
  Map_Top := sbVert.Position;
  DrawMap;
end;

function ScreenToCoord(x,y: Integer): TPoint;
var
  Points: array[0..3] of TPoint;
  rgn: HRGN;
  mx, my: Integer;
  p,i: Integer;
  dist, min_dist: Real;
begin
  Result := Point(-1,-1);
  for mx := 0 to Map_Width do
    for my := 0 to Map_Height do begin
      Points[0] := CoordToScreen(mx  ,my  );
      // drop out if not visible
      if (Points[0].X < -Tile_Width)  or (Points[0].X > Form1.pbScreen.Width) or
         (Points[0].Y < -Tile_Height) or (Points[0].Y > Form1.pbScreen.Height) then Continue;
      Points[1] := CoordToScreen(mx+1,my  );
      Points[2] := CoordToScreen(mx+1,my+1);
      Points[3] := CoordToScreen(mx  ,my+1);
      rgn := CreatePolygonRgn(Points,4,WINDING);
      if PtInRegion(rgn,x,y) then begin
        Result := Point(mx,my);
        // determine the nearest edge
        i := -1;
        min_dist := 9999;
        for p:=0 to 3 do begin
          dist := Sqrt(Sqr(Points[p].X-x) + Sqr(Points[p].Y-y));
          if dist < min_dist then begin
            min_dist := dist;
            i := p;
          end;
        end;
        Map_Point := i;
      end;
      DeleteObject(rgn);
    end;
end;

procedure TForm1.pbScreenMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Map_Cursor := ScreenToCoord(x,y);
  DrawMap;
end;

procedure TForm1.pbScreenMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  dz: Integer;
begin
  dz := 1;
  if Button = mbRight then dz := -1;
  case Map_Point of
    0: NudgeEdge(Map_Cursor.X  ,Map_Cursor.Y  ,dz);
    1: NudgeEdge(Map_Cursor.X+1,Map_Cursor.Y  ,dz);
    2: NudgeEdge(Map_Cursor.X+1,Map_Cursor.Y+1,dz);
    3: NudgeEdge(Map_Cursor.X  ,Map_Cursor.Y+1,dz);
  end;
  DrawMap;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bmp := TBitmap.Create;
  bmp.PixelFormat := pf32bit;
  bmp.Width  := pbScreen.Width;
  bmp.Height := pbScreen.Height;
  sbHori.Position := Map_Left;
  sbVert.Position := Map_Top;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.Free;
end;

end.
// END OF CODE

Let me know if this is what you are looking for.

Regards Jacco
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
JaccoCommented:
Hi BrainWave,

I could add some code for creating/maintaining tunnels/bridges as well.

I did not build in the possibility of tiles with edges

  1
0   2
  1

of which one diagonal rises 2 planes in height. (It is possible but it requires even more tile-images).

You need a lot more tile-images in this advanced map. I experimented a bit, but I work on Windows NT and do not have DirectX 6 or 7...

Did you get my sample running? It is written in Delphi 5 but should compile easily in D3.

Regards Jacco
0
brainwareAuthor Commented:
I will 1. Add Screenshot of TT2 on http://www.bw-soft.com/devtemp/ 
in a few hours, and going to try the sample shortly.. backing up data to dvd in win98 right now becuse a HDD says like a buldozer so i bet its about to drop dead..
gonna boot to w2k and code shortly.. but it all sounds very interesting..
i do however know it requires alot of Images for the advanced type..

Regards
Michael^2 xor V mod Andersen
0
brainwareAuthor Commented:
Adjusted points to 1500
0
brainwareAuthor Commented:
Jacco you da man :)
im very impressed, not much code and covers alot.

If you dont mind have the time any futher samples of this VERY Welcome,
mabye take a look at the Screenshots from Railroad tycoon 2 if you have any suggestions to that too. anyhow for now i would sayd 'Jacco' won the 1000 Points and the 500 as your last sample simply goes over the edge :)

However if you or ZifNab can come up with more heavy map 'engines' samples for the Railroad tycoon style where you mabye generate map out from a grayscale image and with option to set 'Face/Poly' Details/Quality well im very interested, as im hungry for good maps to be used for Building/RTS Games, Like the Total Annihilation maps wich are very great.
I don't care if its 2D or 3D as long as it works, and since DDRAW and D3D can work greatly together/mixed well 3D is very welcome as it would be possiple to do additional effects etc w. hardware.

Raising Points here to 1500 for you Jacco, and i have about 400pts left for more good maps if thats enough right now.. else i dont mind a few free once hehe.. :)

Many thanks to all of ya.
sorry TheNeil you lose ,)

Iso Regards
Michael V. Andersen
0
JaccoCommented:
Thanks brainware :)

Never earned so many points answering a question. (1500x4 = 6000). I earned my second T-Shirt.

I suggest you post a new Q with the specifics so we can keep track of the conversation.

Regards Jacco
0
brainwareAuthor Commented:
oki.. here it is..
http://www.experts-exchange.com/jsp/qShow.jsp?ta=delphi&qid=10296648 

Now im rather LOOOOW on points, but anyhow.. if you would have a sample laying around of a ISO Engine like in Diablo eg. ISO/Layers well feel free to post or email it :)

i am writing such my self, but ideas from others can sometimes be a good help.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.