{**************************************************************** ***************************************************************** ***************************************************************** Jyväskylän Yliopisto Tietotekniikan Laitos GKOSYKSY99 Harjoitustyö: Macho Myyrä ja Taistelu Silakka VIII -------------------------------------------------- Enemy.PAS ---------------- Kanta_sprite.pas:sta peritty luokka, jossa lisänä kuusi kuvaa, tila, timer, suunta, vauhti yms. Mukaan: Kanta_Sprite.PAS //Itse luokka Kanta_Sprite.DCR //Kuvake Enemy.PAS //Itse tama Enemy.dcr //Kuvake talle itselle Version: 0.1 By: Vesa Lappalainen Date: 23.10.1999 Comments: Erään harjoitustehtävän runko Version: 0.2 By: Mika Pikkarainen Date: 01.11.1999 Comments: Mikan väännös peliämme varten. LiikkuvaObjekti osaa liikkua eri suuntiin. Lähettää liikkuessa viestin omistajelleen. Propertyja nopeus x- ja y-suunnassa, suunta (x ja y) ja kuva.TLiikkuvaObjekti muodostaa kantaluokan. Sotkuinen ja turhaa sisältävä versio -> minua nukuttaa!!! Version 0.3 By: Lasse Lilja ja Sami Manninen Date: 13.11.1999 3:08AM Comments: "Mikaan ei ole turhaa" Version 0.4 By: Lasse Lilja Date: 13.11.1999 Comments: "No joo, nyt siina on kuusi kuvaa" Version 0.5 By: Lasse Lilja Date: 14.11.1999 Comments: Kikkailin äänillä (dyn/vai/ei) ja lisäsin oletushakemiston... Version 0.6 By: Lasse Lilja Date: 22.11.1999 Comments: Laitoin niita takas jota kantaluokasta poistin ****************************************************************** ****************************************************************** ******************************************************************} unit Enemy; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Kanta_Sprite; {**************************************************************************} type TOnSpriteMove = procedure (sender:TObject;x,y:integer) of object; TOnDeathTimer = procedure (sender:TObject;x,y:integer) of object; TOnChangeDir = procedure (sender:TObject;dir:integer) of object; {**************************************************************************} type TEnemy = class(TKanta_Sprite) private FVauhti : Integer; FSuunta : Integer; FTila : Integer; dx,dy : integer; {kuvien nimet} FSpritenHORKuva : String; {H=Horizontal} FSpritenVERKuva : String; {V=Horizontal} FSpritenPALAAKuva : String; {P=Palaa, haavoittunut} FSpritenKUOLIKuva : String; {K=Kuollut} {TIMERIT} FTimer : TTimer; FTimer2 : TTimer; FOnSpriteMove : TOnSpriteMove; FOnChangeDir : TOnChangeDir; FOnDeathTimer : TOnDeathTimer; protected FSpriteImageList : TImageList; procedure Paint; override; procedure SetSpritenKuvat; override; procedure TimerTimer(Sender: TObject); virtual; procedure Timer2Timer(Sender: TObject); virtual; public constructor Create(AOwner:TComponent); override; destructor Destroy; override; procedure Kuole; override; procedure Tuhoa; override; procedure SetSpritenHORKuva(S:string); override; procedure SetSpritenVERKuva(S:string); virtual; procedure SetSpritenPALAAKuva(S:string); virtual; procedure SetSpritenKUOLIKuva(S:string); virtual; procedure SetSuunta(i:integer); virtual; procedure SetVauhti(i:integer); virtual; procedure SetTila(i:integer); virtual; function MuutaKoord(i:integer):integer;virtual; published property SpritenHORKuva: String read FSpritenHORKuva write SetSpritenHORKuva; property SpritenVERKuva: String read FSpritenVERKuva write SetSpritenVERKuva; property SpritenPALAAKuva: String read FSpritenPALAAKuva write SetSpritenPALAAKuva; property SpritenKUOLIKuva: String read FSpritenKUOLIKuva write SetSpritenKUOLIKuva; property Vauhti: Integer read FVauhti write SetVauhti default 0; property Suunta: Integer read FSuunta write SetSuunta default 1; property Tila: Integer read FTila write SetTila default 0; property OnSpriteMove : TOnSpriteMove read FOnSpriteMove write FOnSpriteMove; property OnChangeDir : TOnChangeDir read FOnChangeDir write FOnChangeDir; property OnDeathTimer : TOnDeathTimer read FOnDeathTImer write FOnDeathTimer; end; {**************************************************************************} procedure Register; {**************************************************************************} implementation {TRIGONOMETRISET} const CONERAD=Pi/180; const CLEFT=180; const CRIGHT=0; const CDOWN=90; const CUP=270; const CRUUTU=24; //jotta pysyy ruudulla {KUVAT} const CYLOS=0; const CVASEMMALLE=1; const CALAS=2; const COIKEALLE=3; const CHAAVOITTUNUT=4; const CKUOLLUT=5; {TIMERIT} const CS=1000; const CMIN=60000; {**************************************************************************} constructor Tenemy.Create(AOwner:TComponent); begin inherited; {IMAGE LISTIT} FSpriteImageList := TImageList.Create(self); {TIMER 1} FTimer := TTimer.Create(self); FTimer.Interval := Round(CS/10); FTimer.Enabled := false; FTimer.OnTimer := TimerTimer; {TIMER 2} FTimer2 := TTimer.Create(self); FTimer2.Interval := CMIN; FTimer2.Enabled := false; FTimer2.OnTimer := Timer2Timer; {DEFAULT} FVauhti := 0; FSuunta := COIKEALLE; FTila := 0; dy := 0; dx := FVauhti; {KUVAT} FSpritenHORKuva:='.\kuvia\Happo_mies.bmp'; FSpritenVERKuva:='.\kuvia\Happo_miesy.bmp'; FSpritenPALAAKuva:='.\kuvia\Happo_mies_vuotaa.bmp'; FSpritenKUOLIKuva:='.\kuvia\Happo_mies_kuoli.bmp'; FOnSpriteMove := NIL; FOnChangeDir := NIL; FOnDeathTimer := NIL; end; {**************************************************************************} destructor Tenemy.Destroy; begin {TIMERIT} FTimer.Free; FTimer2.Free; {KUVAT} FSpriteImageList.Free; inherited; end; {*********************************************************************** * KOORMUUNNOS * ***********************************************************************} function TEnemy.MuutaKoord(i:integer) :integer; begin Result:= Round( (i-(i mod CRUUTU)) /CRUUTU ); end; {**************************************************************************} procedure Tenemy.Kuole; begin Vauhti:=0; Tila:=5; Paint; tuhoa; end; {**************************************************************************} procedure TEnemy.Tuhoa; begin Free; end; {**************************************************************************} procedure Tenemy.Paint; begin FSpriteImageList.Draw(Canvas,0,0,Tila); inherited; end; {**************************************************************************} procedure Tenemy.SetSuunta(i:integer); begin if ( i <> FSuunta ) then if Assigned(FOnChangeDir) then FOnChangeDir(self,i); FSuunta := i; if(Tila CKUOLLUT ) then FTila :=CKUOLLUT else FTila := i; end; {**************************************************************************} procedure Tenemy.SetVauhti(i:integer); begin FVauhti := i; dx := Round( Cos(Suunta*CONERAD) * Vauhti ); dy := Round( Sin(Suunta*CONERAD) * Vauhti ); FTimer.Enabled := ( dx <> 0 ) or ( dy <> 0); // Timeri käyntiin jos liikkuu end; {**************************************************************************} procedure Tenemy.SetSpritenVERKuva(S:String); begin FSpritenVERKuva := S; SetSpritenKuvat; end; procedure TEnemy.SetSpritenHORKuva(S:String); begin FSpritenHORKuva := S; SetSpritenKuvat;end; procedure Tenemy.SetSpritenPALAAKuva(S:String); begin FSpritenPALAAKuva := S; SetSpritenKuvat;end; procedure Tenemy.SetSpritenKUOLIKuva(S:String); begin FSpritenKUOLIKuva := S; SetSpritenKuvat;end; {**************************************************************************} procedure Tenemy.SetSpritenKuvat; var {Apu nelion kulmapisteet} rect,rect2: TRect; {Valiaikais bitmapit} VASbmp,OIKbmp,ALAbmp,YLAbmp,PALAAbmp,KUOLLUTbmp: TBitmap; {Bitmappien checknimet} sHOR,sVER,sPAL,sKUO: String; begin {Tyhjennetaan vanhan lista} FSpriteImageList.Clear; {Alustetaan checnimet} sHOR:=FSpritenHORKuva; sVER:=FSpritenVERKuva; sPAL:=FSpritenPALAAKuva; sKUO:=FSpritenKUOLIKuva; {Checataan onko joku tyhja nimi} if (sHOR='')or(sVER='')or(sPAL='')or(sKUO='') then begin Paint; exit; end; {Luodaan temp bitmapi} VASbmp := TBitmap.Create; OIKbmp := TBitmap.Create; ALAbmp := TBitmap.Create; YLAbmp := TBitmap.Create; PALAAbmp := TBitmap.Create; KUOLLUTbmp := TBitmap.Create; {pistetaan bitmapit paikoilleen} OIKbmp.LoadFromFile(sHOR); VASbmp.Assign(OIKbmp); YLAbmp.LoadFromFile(sVER); ALAbmp.Assign(YLAbmp); PALAAbmp.LoadFromFile(sPAL); KUOLLUTbmp.LoadFromFile(sKUO); {Muutetaan Oikea vasen} rect.Left := 0; rect.Top := 0; rect.Right := OIKbmp.Width; rect.Bottom := OIKbmp.Height; rect2 := rect; rect2.Right := 0; rect2.Left := rect.Right; VASbmp.Canvas.CopyRect(rect2,OIKbmp.Canvas, rect); {Muutetaan Ala Yla} rect.Left := 0; rect.Top := 0; rect.Right := ALAbmp.Width; rect.Bottom := ALAbmp.Height; rect2 := rect; rect2.Bottom := 0; rect2.Top := rect.Bottom; ALAbmp.Canvas.CopyRect(rect2,YLAbmp.Canvas, rect); {Alustetaan imagelisti ja siihen tyonnettava kalu} Width := VASbmp.Width; Height := VASbmp.Height; FSpriteImageList.Width := Width; FSpriteImageList.Height := Height; {Taytetaan listi} FSpriteImageList.AddMasked(YLAbmp,YLAbmp.TransparentColor); // paikka: 0 YLAbmp FSpriteImageList.AddMasked(VASbmp,VASbmp.TransparentColor); // 1 VASbmp FSpriteImageList.AddMasked(ALAbmp,ALAbmp.TransparentColor); // 2 ALAbmp FSpriteImageList.AddMasked(OIKbmp,OIKbmp.TransparentColor); // 3 OIKbmp FSpriteImageList.AddMasked(PALAAbmp,PALAAbmp.TransparentColor); // 4 PALAAbmp FSpriteImageList.AddMasked(KUOLLUTbmp,KUOLLUTbmp.TransparentColor); // 5 KUOLLUTbmp Paint; {Vapautetaan tempit} YLAbmp.Free; VASbmp.Free; ALAbmp.Free; OIKbmp.Free; PALAAbmp.Free; KUOLLUTbmp.Free; end; {**************************************************************************} procedure Tenemy.TimerTimer(Sender: TObject); begin {Ylhaalta yli} if ( top + dy < 0 )then begin dy := abs(dy); if (tila= Parent.ClientHeight-Height )then begin dy := -abs(dy); if (tila= Parent.ClientWidth-Width )then begin dx:=-abs(dx); if (tila