{****************************************************************} {****************************************************************} {****************************************************************} { pelaaja.PAS Original code : Mika Pikkarainen 01.11.1999 Vesa Lappalainen 23.10.1999 Version 0.3 Lasse ja Sami 3:08AM 13.11.1999 "Mikaan ei ole turhaa" Version 0.4 Lasse 13.11.1999 "No joo, nyt siina on kuusi kuvaa" Version 0.5 Lasse 14.11.1999 Kikkailin äänillä (dyn/vai/ei) ja lisäsin oletushakemiston... 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!!! } {****************************************************************} {****************************************************************} {****************************************************************} unit pelaaja; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Mplayer; {**************************************************************************} 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 TPelaaja = class(TPaintBox) private FVauhti : Integer; FSuunta : Integer; FTila : Integer; FRuutu : 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; {AANET} FKuolemaMusa: String; FOnSpriteMove : TOnSpriteMove; FOnChangeDir : TOnChangeDir; FOnDeathTimer : TOnDeathTimer; {NAPPAIMET} FNappainYlos: String; FNappainVasen: String; FNappainAlas: String; FNappainOikea: String; procedure SetNappainYlos(const Value: String); procedure SetNappainVasen(const Value: String); procedure SetNappainAlas(const Value: String); procedure SetNappainOikea(const Value: String); protected TaustaAanet: TMediaPlayer; FSpriteImageList : TImageList; procedure OnMediaNotify(Sender: TObject); virtual; procedure SetKuolemaMusa(S: string); virtual; procedure Paint; override; procedure SeTPelaajanKuvat; virtual; procedure TimerTimer(Sender: TObject); virtual; procedure Timer2Timer(Sender: TObject); virtual; public constructor Create(AOwner:TComponent); override; destructor Destroy; override; procedure Kuole; virtual; procedure Tuhoa; virtual; procedure SeTPelaajanHORKuva(S:string); virtual; procedure SeTPelaajanVERKuva(S:string); virtual; procedure SeTPelaajanPALAAKuva(S:string); virtual; procedure SeTPelaajanKUOLIKuva(S:string); virtual; procedure SetSuunta(i:integer); virtual; procedure SetVauhti(i:integer); virtual; procedure SetRuutu(i:integer); virtual; procedure SetTila(i:integer); virtual; procedure MikaNappain(Key: String); function MuutaKoord(i:integer):integer;virtual; published property SpritenHORKuva: String read FSpritenHORKuva write SeTPelaajanHORKuva; property SpritenVERKuva: String read FSpritenVERKuva write SeTPelaajanVERKuva; property SpritenPALAAKuva: String read FSpritenPALAAKuva write SeTPelaajanPALAAKuva; property SpritenKUOLIKuva: String read FSpritenKUOLIKuva write SeTPelaajanKUOLIKuva; property NappainYlos: String read FNappainYlos write SetNappainYlos; property NappainVasen: String read FNappainVasen write SetNappainVasen; property NappainAlas: String read FNappainAlas write SetNappainAlas; property NappainOikea: String read FNappainOikea write SetNappainOikea; 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 Ruutu: Integer read FRuutu write SetRuutu default 24; property KuolemaMusa: string read FKuolemaMusa write SetKuolemaMusa; 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; {KUVAT} const CYLOS=0; const CVASEMMALLE=1; const CALAS=2; const COIKEALLE=3; const CHAAVOITTUNUT=4; const CKUOLLUT=5; {NAPPAIMET} {TIMERIT} const CS=1000; const CMIN=60000; {MUUT} const CRUUTU=24; {**************************************************************************} constructor TPelaaja.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; {NAPPAIMET} NappainYlos := 'Y'; NappainVasen := 'G'; NappainAlas := 'H'; NappainOikea := 'J'; {DEFAULT} FVauhti := 0; FSuunta := COIKEALLE; FTila := 0; FRuutu := CRUUTU; dy := 0; dx := FVauhti; Left := Round(Left - (Left mod FRuutu)/FRuutu); Top := Round(Top - (Left mod FRuutu)/FRuutu); {KUVAT} FSpritenHORKuva:='.\kuvia\pelaajaO.bmp'; FSpritenVERKuva:='.\kuvia\pelaajaY.bmp'; FSpritenPALAAKuva:='.\kuvia\pelaajaHAAV.bmp'; FSpritenKUOLIKuva:='.\kuvia\pelaajaKUOL.bmp'; {AANET} KuolemaMusa:='.\aania\pam.wav'; if ( TaustaAanet <> NIL ) then TaustaAanet.Free; TaustaAanet := TMediaplayer.Create(Self); TaustaAanet.Enabled := True; TaustaAanet.Visible := False; TaustaAanet.OnNotify := OnMediaNotify; FOnSpriteMove := NIL; FOnChangeDir := NIL; FOnDeathTimer := NIL; end; {**************************************************************************} destructor TPelaaja.Destroy; begin {TIMERIT} FTimer.Free; FTimer2.Free; {AANET} TaustaAanet.Free; {KUVAT} FSpriteImageList.Free; inherited; end; {**************************************************************************} procedure TPelaaja.Kuole; begin Vauhti:=0; Tila:=5; Paint; try TaustaAanet.Parent := Parent; TaustaAanet.Filename := KuolemaMusa; // Ladataan mediafile TaustaAanet.Open; // Avataan TaustaAanet.Wait:=True; TaustaAanet.OnNotify:=OnMediaNotify; TaustaAanet.Play; except On EMCIDeviceError do tuhoa; end; end; {**************************************************************************} procedure TPelaaja.OnMediaNotify(Sender: TObject); begin with Sender as TMediaPlayer do begin Tuhoa; end; end; {**************************************************************************} procedure TPelaaja.Tuhoa; begin Free; end; {**************************************************************************} procedure TPelaaja.SetKuolemaMusa(S: String); begin FKuolemaMusa := S; end;//setKuolemaMusa {**************************************************************************} procedure TPelaaja.Paint; begin FSpriteImageList.Draw(Canvas,0,0,Tila); inherited; end; {*********************************************************************** * KOORMUUNNOS * ***********************************************************************} function TPelaaja.MuutaKoord(i:integer) :integer; begin Result:= Round( (i-(i mod RUUTU)) /RUUTU ); end; {****************************************************************} procedure TPelaaja.MikaNappain(Key: String); begin If (AnsiUpperCase(Key)=NappainYlos) then begin Suunta := CUP; Vauhti:=FVauhti; Left:=MuutaKoord(Left)*CRUUTU; end; If (AnsiUpperCase(Key)=NappainVasen) then begin Suunta := CLEFT; Vauhti:=FVauhti; Top:=MuutaKoord(Top)*CRUUTU; end; If (AnsiUpperCase(Key)=NappainAlas) then begin Suunta := CDOWN; Vauhti:=FVauhti; Left:=MuutaKoord(Left)*CRUUTU; end; If (AnsiUpperCase(Key)=NappainOikea) then begin Suunta := CRIGHT; Vauhti:=FVauhti; Top:=MuutaKoord(Top)*CRUUTU; end; end;//MikaNappain {****************************************************************} procedure TPelaaja.SetNappainYlos(const Value: String); begin FNappainYlos := AnsiUpperCase(Value); end; procedure TPelaaja.SetNappainVasen(const Value: String); begin FNappainVasen := AnsiUpperCase(Value); end; procedure TPelaaja.SetNappainAlas(const Value: String); begin FNappainAlas := AnsiUpperCase(Value); end; procedure TPelaaja.SetNappainOikea(const Value: String); begin FNappainOikea := AnsiUpperCase(Value); end; {**************************************************************************} procedure TPelaaja.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 TPelaaja.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 TPelaaja.SetRuutu(i:integer); begin FRuutu := i; end; {**************************************************************************} procedure TPelaaja.SeTPelaajanVERKuva(S:String); begin FSpritenVERKuva := S; SeTPelaajanKuvat; end; procedure TPelaaja.SeTPelaajanHORKuva(S:String); begin FSpritenHORKuva := S; SeTPelaajanKuvat;end; procedure TPelaaja.SeTPelaajanPALAAKuva(S:String); begin FSpritenPALAAKuva := S; SeTPelaajanKuvat;end; procedure TPelaaja.SeTPelaajanKUOLIKuva(S:String); begin FSpritenKUOLIKuva := S; SeTPelaajanKuvat;end; {**************************************************************************} procedure TPelaaja.SeTPelaajanKuvat; var {Apu nelion kulmapisteet} rect,rect2: TRect; {Valiaikais bitmapit} Vbmp,Obmp,Abmp,Ybmp,Pbmp,Kbmp: TBitmap; {Bitmappien checknimet} sH,sV,sP,sK: String; begin {Tyhjennetaan vanhan lista} FSpriteImageList.Clear; {Alustetaan checnimet} sH:=FSpritenHORKuva; sV:=FSpritenVERKuva; sP:=FSpritenPALAAKuva; sK:=FSpritenKUOLIKuva; {Checataan onko joku tyhja nimi} if (sH='')or(sV='')or(sP='')or(sK='') then begin Paint; exit; end; {Luodaan temp bitmapi} Vbmp := TBitmap.Create; Obmp := TBitmap.Create; Abmp := TBitmap.Create; Ybmp := TBitmap.Create; Pbmp := TBitmap.Create; Kbmp := TBitmap.Create; {pistetaan bitmapit paikoilleen} Obmp.LoadFromFile(sH); Vbmp.Assign(Obmp); Ybmp.LoadFromFile(sV); Abmp.Assign(Ybmp); Pbmp.LoadFromFile(sP); Kbmp.LoadFromFile(sK); {Muutetaan Oikea vasen} rect.Left := 0; rect.Top := 0; rect.Right := Obmp.Width; rect.Bottom := Obmp.Height; rect2 := rect; rect2.Right := 0; rect2.Left := rect.Right; Vbmp.Canvas.CopyRect(rect2,Obmp.Canvas, rect); {Muutetaan Ala Yla} rect.Left := 0; rect.Top := 0; rect.Right := Abmp.Width; rect.Bottom := Abmp.Height; rect2 := rect; rect2.Bottom := 0; rect2.Top := rect.Bottom; Abmp.Canvas.CopyRect(rect2,Ybmp.Canvas, rect); {Alustetaan imagelisti ja siihen tyonnettava kalu} Width := Vbmp.Width; Height := Vbmp.Height; FSpriteImageList.Width := Width; FSpriteImageList.Height := Height; {Taytetaan listi} FSpriteImageList.AddMasked(Ybmp,Ybmp.TransparentColor); // paikka: 0 YBmp FSpriteImageList.AddMasked(Vbmp,Vbmp.TransparentColor); // 1 VBmp FSpriteImageList.AddMasked(Abmp,Abmp.TransparentColor); // 2 ABmp FSpriteImageList.AddMasked(Obmp,Obmp.TransparentColor); // 3 OBmp FSpriteImageList.AddMasked(Pbmp,Pbmp.TransparentColor); // 4 PBmp FSpriteImageList.AddMasked(Kbmp,Kbmp.TransparentColor); // 5 KBmp Paint; {Vapautetaan tempit} Ybmp.Free; Vbmp.Free; Abmp.Free; Obmp.Free; Pbmp.Free; Kbmp.Free; end; {**************************************************************************} procedure TPelaaja.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