- unit SpielFeldUnit;
- interface
- uses classes,opengl,Controls,Pathfinding8,
- sdl,dglOpenGL, glBitmap;
- var
- Texture: TglBitmap2D;
- type
- TEinheit=class;
- TBefehlsTyp=(BT_STAND,BT_MOVE);
- TEinheitenTyp=Word;
- TPlayer=(plnone,pl1,pl2,plNeutral);
- TFeld= object
- public
- Owner:TPlayer;
- end;
- TSpielFeld=class(TPersistent)
- private
- FWidth:Word;
- FHeight:Word;
- procedure ZeichneSpielFeld;
- procedure ZeichneEinheiten;
- public
- Feld: array of array of TFeld;
- Einheit:array of TEinheit;
- SelectedUnitIndex:Integer;
- Constructor Create;
- destructor Destroy; override;
- function ErstelleEinheit(const EinheitenTyp:TEinheitenTyp;const NewOwner:TPlayer;const XPos,YPos:Word):Boolean;
- procedure Draw;
- procedure SetSize(NewWidth,NewHeight:Word);
- procedure Update;
- procedure FloodFill(Player:TPlayer);
- procedure OnSelection(Selected: Integer;Button: TMouseButton);
- published
- property Width:Word read FWidth ;
- property Height:Word read FHeight;
- end;
- //TAnimationType=(ANI_BIRTH,ANI_STAND,ANI_MOVE_LEFT,ANI_MOVE_RIGHT,ANI_MOVE_UP,ANI_MOVE_DOWN);
- TAnimation=record
- Pos:Word;
- Length:Word;
- Typ:TAnimationType;
- end;
- TBefehl=record
- Case Typ:TBefehlsTyp of
- BT_STAND:();
- BT_MOVE:(X,Y:Word);
- end;
- TEinheit=class
- public
- Ani:TAnimation;
- Befehl:TBefehl;
- X,Y:Word;
- Owner:TPlayer;
- Typ:TEinheitenTyp;
- constructor Create(VomTyp:TEinheitenTyp;NewOwner:TPlayer;XPos,YPos:Word);overload;
- Constructor Create;overload;
- procedure Draw;
- procedure Update;
- function GetRealX:Double;
- function GetRealY:Double;
- end;
- const
- FarbevonSpieler:array [TPlayer,0..2]of Double=((0.5,0.5,0.5), //plnone
- (0,1,0), //pl1
- (0,0,1), //pl2
- (1,0,0)); //plneutral
- LangsamkeitsFaktor:Byte=3;//Muss größer als 1 sein
- var SpielFeld:TSpielFeld;
- GitteristSichtbar:Boolean=false;
- implementation
- procedure ErstelleKreis(Radius:Real;PunkteAnzahl:Word);
- var
- PunktNummer: integer;
- begin
- glbegin(gl_Line_Loop);
- for PunktNummer := 0 to PunkteAnzahl do
- glvertex3f( (Radius *sin(Punktnummer/(PunkteAnzahl/(2*pi)))),(Radius *cos(Punktnummer/(PunkteAnzahl/(2*pi)))),0);
- glend;
- glEnable(GL_TEXTURE_2D);
- end;
- procedure TEinheit.Draw;
- begin
- glcolor3f(FarbevonSpieler[Owner,0],FarbevonSpieler[Owner,1],FarbevonSpieler[Owner,2]);
- gltranslatef(GetRealX,GetRealY,0);
- case Typ of
- 0:
- begin
- ErstelleKreis(0.35,20);
- Texture.Bind;
- glbegin(GL_QUADS);
- glTexCoord2i(1, 1);
- glVertex2i(Texture.Width, Texture.Height);
- glend;
- Texture.unBind;
- end;
- end;
- // gltranslatef(-GetRealX,-GetRealY,0);
- end;
- constructor TEinheit.Create(VomTyp:TEinheitenTyp;NewOwner:TPlayer;XPos,YPos:Word);
- begin
- inherited Create;
- Typ := VomTyp;
- Owner:= NewOwner;
- X:= XPos;
- Y:= YPos;
- Ani.Length := 100;
- end;
- constructor TEinheit.Create;
- begin
- inherited;
- end;
- procedure TEinheit.Update;
- begin
- Inc(Ani.Pos);
- if not((Ani.Pos >= Ani.Length) or (Ani.Typ = ANI_STAND))then exit;
- {Neue Animation bestimmen}
- case Befehl.Typ of
- BT_STAND:
- begin
- if (Ani.Pos >= Ani.Length) then Ani.Pos := 0;
- Ani.Typ := ANI_STAND;
- Ani.Length := 1000;
- end;
- BT_MOVE:
- begin
- if (X = Befehl.x) and (Y = Befehl.Y) then
- begin //Ziel erreicht
- Befehl.typ := BT_STAND ;
- Ani.Pos := 0;
- Ani.Typ := ANI_STAND;
- Ani.length := 1000;
- exit;
- end;
- Ani.Pos := 0;
- Ani.Typ :=FindPath(Befehl.X,Befehl.Y,self); ;//Hier muss der variante Teil hin
- Ani.Length := 10;
- case Ani.Typ of
- ANI_MOVE_LEFT : X := X-1;
- ANI_MOVE_Right: X := X+1;
- ANI_MOVE_UP : Y := Y+1;
- ANI_MOVE_DOWN : Y := Y-1;
- ANI_MOVE_LEFTDOWN: begin X:= X-1; Y:= Y-1 end;
- ANI_MOVE_RIGHTDOWN: begin X:= X+1; Y:= Y-1 end;
- ANI_MOVE_LEFTUP: begin X:= X-1; Y:= Y+1 end;
- ANI_MOVE_RIGHTUP: begin X:= X+1; Y:= Y+1 end;
- end;
- if SpielFeld.Feld[X,Y].Owner <> Owner then Ani.Length := Ani.Length*LangsamkeitsFaktor;
- end;
- end;
- end;
- function TEinheit.GetRealX:Double;
- begin
- case Ani.Typ of
- ANI_MOVE_RIGHT,
- ANI_MOVE_RIGHTUP,
- ANI_MOVE_RIGHTDOWN: result:= X -1 +Ani.Pos / Ani.Length +0.5;
- ANI_MOVE_LEFT,
- ANI_MOVE_LEFTUP,
- ANI_MOVE_LEFTDOWN:result:= X +1 -Ani.Pos / Ani.Length +0.5;
- else
- result := X +0.5;
- end;
- end;
- function TEinheit.GetRealY:Double;
- begin
- case Ani.Typ of
- ANI_MOVE_UP,
- ANI_MOVE_RIGHTUP,
- ANI_MOVE_LEFTUP: result:= Y -1 +Ani.Pos / Ani.Length +0.5;
- ANI_MOVE_DOWN,
- ANI_MOVE_LEFTDOWN,
- ANI_MOVE_RIGHTDOWN: result:= Y +1 -Ani.Pos / Ani.Length +0.5;
- else
- result := Y +0.5;
- end;
- end;
- procedure TSpielFeld.Update;
- var i:Integer;
- begin
- for I:= 0 to High(Einheit) do
- Einheit[I].Update;
- end;
- function TSpielFeld.ErstelleEinheit(const EinheitenTyp:TEinheitenTyp;const NewOwner:TPlayer;const XPos,YPos:Word):Boolean;
- begin
- if (XPos > FWidth) or (YPos > FHeight) or (Feld[XPos,YPos].Owner = plneutral) then
- begin
- result := false;
- exit;
- end;
- SetLength(Einheit,Length(Einheit)+1);
- Einheit[High(Einheit)] := TEinheit.Create(EinheitenTyp,NewOwner,XPos,YPos);
- //Feld[XPos,YPos].Owner := NewOwner;
- result := true;
- end;
- procedure TSpielFeld.Draw;
- begin
- glinitnames;
- glpushname(0);
- glrotatef(-20,-0,8,-45);
- gltranslatef(-0.9,-0.3,-1.7);
- glScalef(1/FWidth,1/FWidth,1/FWidth);
- {Zeichnen}
- ZeichneSpielFeld;
- ZeichneEinheiten;
- end;
- procedure TSpielFeld.ZeichneEinheiten;
- var I,BelegteNamen:Integer;
- begin
- BelegteNamen := Fwidth*Fheight +1 ;
- for I := 0 to High(Einheit) do
- begin
- glloadname(I + BelegteNamen);
- Einheit[I].Draw;
- end;
- //Selektions-Ring erstellen
- if (high(Einheit) >= SelectedUnitIndex) and (SelectedUnitIndex >= 0) then
- begin
- gltranslatef(Einheit[SelectedUnitIndex].GetRealX,Einheit[SelectedUnitIndex].GetRealY,0.1) ;
- glcolor3f(1,0.4,0);
- ErstelleKreis(0.45,20);
- gltranslatef(-Einheit[SelectedUnitIndex].GetRealX,-Einheit[SelectedUnitIndex].GetRealY,-0.1);
- end;
- end;
- procedure TSpielFeld.ZeichneSpielFeld;
- var I,X,Y:Integer ;
- begin
- for Y := 0 to FHeight-1 do
- for X := 0 to FWidth-1 do
- begin
- I:= (Y*FWidth +X+1);
- glloadname(I);
- glcolor3f(FarbevonSpieler[Feld[X,Y].Owner,0]*0.5,FarbevonSpieler[Feld[X,Y].Owner,1]*0.5,FarbevonSpieler[Feld[X,Y].Owner,2]*0.5);
- glbegin(GL_QUADS) ;
- glTexCoord2f(0,1); glvertex3f(x,y+1,0);
- glTexCoord2f(1,1); glvertex3f(x+1,y+1,0);
- glTexCoord2f(1,0);glvertex3f(x +1,y,0);
- glTexCoord2f(0,0);glvertex3f(x,y,0);
- glend();
- end;
- if GitteristSichtbar then
- for Y := 0 to FHeight-1 do
- for X := 0 to FWidth-1 do
- begin
- glcolor3f(1,1,0);
- glbegin(GL_LINE_LOOP) ;
- glTexCoord2f(0,1); glvertex3f(x,y+1,0.001);
- glTexCoord2f(1,1); glvertex3f(x+1,y+1,0.001);
- glTexCoord2f(1,0);glvertex3f(x +1,y,0.001);
- glTexCoord2f(0,0);glvertex3f(x,y,0.001);
- glend();
- end;
- end;
- procedure TSpielFeld.OnSelection(Selected: Integer;Button: TMouseButton);
- begin
- case Button of
- mbleft: if (Selected >= FWidth*FHeight) and ( Selected-FWidth*FHeight-1 <= High(Einheit) )
- then SelectedUnitIndex:= (Selected-FWidth*FHeight-1);
- mbRight:if (Selected <= FWidth*FHeight) and (Selected > 0) then
- if (high(Einheit) >= SelectedUnitIndex) and (SelectedUnitIndex >= 0) then
- begin
- Einheit[SelectedUnitIndex].Befehl.Typ := BT_MOVE;
- Einheit[SelectedUnitIndex].Befehl.X := ((Selected-1) mod FWidth);
- Einheit[SelectedUnitIndex].Befehl.Y := ((Selected-1) div FWidth);
- end;
- end;
- end;
- procedure TSpielFeld.SetSize(NewWidth,NewHeight:Word);
- var I:Integer;
- begin
- for I := 0 to High(Einheit) do Einheit[I].free;
- SetLength(Einheit,0);
- FWidth := NewWidth;
- FHeight := NewHeight;
- SetLength(Feld,NewWidth,NewHeight);
- end;
- procedure TSpielFeld.FloodFill(Player:TPlayer);
- var X,Y:Integer;
- begin
- for X:= 0 to FWidth-1 do
- for Y := 0 to FHeight-1 do
- Feld[X,Y].Owner := Player;
- end;
- Constructor TSpielFeld.Create;
- begin
- inherited;
- SetSize(10,10);
- end;
- destructor TSpielFeld.Destroy;
- var I:Integer;
- begin
- for I := 0 to High(Einheit) do Einheit[I].free;
- SetLength(Einheit,0);
- SetSize(0,0);
- end;
- initialization
- SpielFeld := TSpielFeld.create;
- Texture := TglBitmap2D.Create('unbenannt.bmp');
- Texture.FreeDataAfterGenTexture := False;
- Texture.GenTexture;
- //Beispiel1
- SpielFeld.SetSize(7,6);
- SpielFeld.floodfill(pl1);
- SpielFeld.ErstelleEinheit(0,pl1,5,0);
- SpielFeld.Feld[3,1].Owner := plneutral;
- SpielFeld.Feld[3,2].Owner := plneutral;
- SpielFeld.Feld[3,0].Owner := plneutral;
- SpielFeld.Feld[2,2].Owner := plneutral;
- SpielFeld.Feld[4,2].Owner := plneutral;
- SpielFeld.Feld[1,2].Owner := plneutral;
- SpielFeld.Feld[5,2].Owner := plneutral;
- (*
- //Beispiel3
- SpielFeld.SetSize(7,7);
- SpielFeld.floodfill(pl1);
- SpielFeld.ErstelleEinheit(0,pl2,0,6);
- SpielFeld.Feld[2,2].Owner := plneutral;
- SpielFeld.Feld[2,1].Owner := plneutral;
- SpielFeld.Feld[0,1].Owner := plneutral;
- SpielFeld.Feld[0,0].Owner := plneutral;
- SpielFeld.Feld[3,3].Owner := plneutral;
- SpielFeld.Feld[2,3].Owner := plneutral;
- SpielFeld.Feld[3,4].Owner := plneutral;
- SpielFeld.Feld[3,6].Owner := plneutral;
- SpielFeld.Feld[5,6].Owner := pl2;
- SpielFeld.Feld[4,6].Owner := pl2;
- SpielFeld.Feld[5,5].Owner := pl2;
- SpielFeld.Feld[6,5].Owner := pl2;
- SpielFeld.Feld[6,6].Owner := pl2;
- SpielFeld.Feld[4,5].Owner := pl2;
- SpielFeld.Feld[4,4].Owner := pl2;
- SpielFeld.Feld[3,5].Owner := pl2;
- SpielFeld.Feld[4,5].Owner := pl2;
- SpielFeld.Feld[5,4].Owner := pl2;
- SpielFeld.Feld[6,4].Owner := pl2;
- SpielFeld.Feld[6,3].Owner := plneutral;
- SpielFeld.Feld[6,2].Owner := plneutral;
- SpielFeld.Feld[5,3].Owner := plneutral;
- SpielFeld.Feld[4,0].Owner := plneutral;
- SpielFeld.Feld[4,1].Owner := plneutral;
- SpielFeld.Feld[6,1].Owner := plneutral;
- *)
- (*
- SpielFeld.SetSize(8,7);
- SpielFeld.floodfill(pl1);
- SpielFeld.ErstelleEinheit(0,pl1,1,3);
- SpielFeld.Feld[6,2].Owner := plneutral;
- SpielFeld.Feld[2,1].Owner := plneutral;
- SpielFeld.Feld[3,1].Owner := plneutral;
- SpielFeld.Feld[3,2].Owner := plneutral;
- SpielFeld.Feld[3,3].Owner := plneutral;
- SpielFeld.Feld[3,4].Owner := plneutral;
- SpielFeld.Feld[3,6].Owner := plneutral;
- SpielFeld.Feld[4,4].Owner := plneutral;
- SpielFeld.Feld[5,4].Owner := plneutral;
- SpielFeld.Feld[5,5].Owner := plneutral;
- SpielFeld.Feld[5,0].Owner := plneutral;
- SpielFeld.Feld[5,1].Owner := plneutral;
- SpielFeld.Feld[5,2].Owner := plneutral;
- *)
- finalization
- SpielFeld.free;
- end.