{**************************************************************** ***************************************************************** ***************************************************************** Jyväskylän Yliopisto Tietotekniikan Laitos GKOSYKSY99 Harjoitustyö: Macho Myyrä ja Taistelu Silakka VIII -------------------------------------------------- PeliTausta.PAS ---------------- Panelista peritty tausta spriteille yms. jossa tapahtuma törmäyksille, musiikit (tausta + efektit), listat tausta spriteille (kanta_sprite). Mukaan: Kanta_Sprite.PAS //Itse luokka Kanta_Sprite.DCR //Kuvake PeliTausta.PAS //Itse tama PeliTausta.dcr //Kuvake talle itselle Version: 0.1 By: Lasse Lilja Date: 22.11.1999 Comments: Kuhan kokeilin ja tein rungon Version: 0.2 By: Lasse Lilja Date: 22.11.1999 Comments: Pistin taustalle spriteja tlistiin Version 0.3 By: Lasse Lilja Saku Kukonlehto Mika Pikkarainen Sami Manninen Date: 26.11.1999 Comments: 1)Laitoimme crosstablen 2)lisäsimme hidden ruudut hidden eli piirtamaan vain kerran 3)Lisäsimme näppäimet 4)Ja yhteyden pisteisiin testiversiion Version 0.4 By: Lasse Lilja Date: 29.11.1999 Comments: 1)Laitoin taustaäänien soittajan 2)Laitoin AI:n 3)Laitoin syönnin 4)Laitoin törmäykset 5)Laitoin vähäsen pisteet ja hp:t Version 0.5 By: Lasse Lilja Saku Kukonlehto Date: 1.12.1999 Comments: 1)Laitoimme tilanteen Version 0.6 By: Lasse Lilja Saku Kukonlehto Date: 3.12.1999 Comments: 1)Freezen jok pysayttaaa ukot 2)Ehdon osuikohon joka estaa homen tuhon 3) onspritemove playeriin enemysta ****************************************************************** ****************************************************************** ******************************************************************} unit PeliTausta; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,testicrosstablex,Kanta_sprite,Enemy, Pelaaja,Mplayer, AIX,randomnumbergenerator,Staattinen; {**********************************************************************} type TPeliTausta = class(TPanel) private FObjekti_lkm :Integer; //TaustaObjektien lkm FEnemy_lkm :Integer; //Enemy lkm FPisteet :integer; //pisteet FHitPoints :integer; //pisteet FObjekti_nimi:String; //TaustaObjektien nimi FTaustaAani: String; Noppa : TRandomNumberGenerator; Varaus : TVarausTaulukko; Koord : TVarausTaulukko; protected TaustaAanet: TMediaPlayer; Tausta_Palaset : TList; // Lista johon taustalle sijoitettavat objektit Enemies: TList; Player: TPelaaja; Ristikko: TTestiCrossTableX;//Tausta ristikko Aly: TAIX; procedure Osuiko(sender:TObject;x,y:integer); public constructor Create(AOwner:TComponent); override; destructor Destroy; override; procedure SetObjekti_lkm(i:integer); virtual; procedure SetEnemy_lkm(i:integer); virtual; procedure SetPisteet(i:integer); virtual; procedure SetHitPoints(i:integer); virtual; procedure SetObjekti_nimi(s:String); virtual; procedure SetTaustaAani(s:String); virtual; procedure TeeTaustaRand(Olkm,OScore,OImpulssi,Elkm: Integer; nimi: String); //TaustaAaninnimi procedure UusiObjektiTaustalle(x,y,Sc,Im:integer;kuvan_nimi:String);virtual; procedure UusiEnemyTaustalle(x,y:integer);Virtual; procedure UusiPlayerKentalle(x,y:integer;pelimies:Tpelaaja);Virtual; procedure NappainPainettu(Key :char); virtual; procedure VihollisenOhjailu(VaiTas:integer);virtual; function MuutaKoord(i:integer):integer;virtual; procedure Freeze;virtual; published property TaustaAani: String read FTaustaAani write SetTaustaAani; property Objekti_lkm: Integer read FObjekti_lkm write SetObjekti_lkm default 0; property Enemy_lkm: Integer read FEnemy_lkm write SetEnemy_lkm default 0; property Pisteet: Integer read FPisteet write SetPisteet default 0; property HitPoints: Integer read FHitPoints write SetHitPoints default 10; property Objekti_nimi: String read FObjekti_nimi write SetObjekti_nimi; end; //type {**********************************************************************} procedure Register; {**********************************************************************} implementation const RUUTU=24; // Tama maarittelee koordinaattimuunnoksen modulon {*********************************************************************** * KONSTRUKTORI * ***********************************************************************} constructor TPeliTausta.Create(AOwner:TComponent); begin {0} Inherited; {1} Tausta_Palaset:=TList.Create; {2} Enemies:=Tlist.create; {3} Player:=TPelaaja.create(self); {4} Ristikko:= TTestiCrossTableX.Create(self); {5} Aly:= TAIX.Create(self); {6} noppa:=TRandomNumberGenerator.Create(self); {AANET} TaustaAani:='.\aania\frog.wav'; if ( TaustaAanet <> NIL ) then TaustaAanet.Free; {7} TaustaAanet := TMediaplayer.Create(Self); TaustaAanet.Enabled := True; TaustaAanet.Visible := False; {default} DoubleBuffered:=True; Align:=alClient; Color:=clBlack; Caption:='Testing!'; Font.Color:=clYellow; Font.Size:=24; end; {*********************************************************************** * DESTRUKTORI * ***********************************************************************} destructor TPelitausta.Destroy; begin {7} TaustaAanet.free; {6} Noppa.Free; {5} Aly.Free; {4} If Assigned(Ristikko) then Ristikko.free; {3} If Assigned(Player) then player.free; {2} if Assigned(Enemies) then Enemies.Free; {1} If Assigned(Tausta_Palaset) then Tausta_Palaset.Free; {0} Inherited; end; {*********************************************************************** * Tehraan tausta * ***********************************************************************} procedure TPeliTausta.TeeTaustaRand(Olkm,OScore,OImpulssi,Elkm: Integer; nimi: String); var x,y,apu:integer; Lkm : array of integer; begin apu:=0; setLength(varaus,19,19);//randomin luku KoordKoko Setlength(Koord,Olkm); SetLength(Lkm,Olkm); for x:=0 to Olkm-1 do begin Lkm[x]:=Olkm; end; Koord:=Noppa.Coords(Lkm,Varaus); for y:=0 to High(Lkm) do begin apu := apu + lkm[0]; For x:=(apu - lkm[0]) to apu-1 Do begin UusiObjektiTaustalle(Koord[x][0],Koord[x][1],OScore,OImpulssi,nimi); end; end; UusiPlayerKentalle(1,1,player); hitpoints:=hitpoints; For x:= 0 to Elkm do begin UusiEnemyTaustalle(1,1); end; with ristikko do begin parent:=Self; Nelio3d:=False; Align:=alClient; NelioColor:=clBlack; BackColor:=clGray; LineColor:=clGray; visible:=true; SendToBack; {//Alla olevalla saa taustalle kuvan johon vaikka koordinaatit MapGridOn:=false; MapImageName:='.\kuvia\sumu.bmp'; NoMapImage:=false; } end;//with end; {*********************************************************************** * KOORMUUNNOS * ***********************************************************************} function TPeliTausta.MuutaKoord(i:integer) :integer; begin Result:= Round( (i-(i mod RUUTU)) /RUUTU ); end; {*********************************************************************** * UUSITAUSTAPALA * ***********************************************************************} procedure TPeliTausta.UusiObjektiTaustalle(x,y,SC,IM:integer;kuvan_nimi:string); Var Uusi:TStaattinen; begin Uusi:=TStaattinen.Create(Self); Tausta_Palaset.Add(Uusi); Uusi.Parent:=Self; Uusi.SpritenHORKuva:=kuvan_nimi; Uusi.Left:=(x*RUUTU)+1; Uusi.Top:=(y*RUUTU)+1; Uusi.Pisteet:=SC; Uusi.Impulssi:=IM; end; {*********************************************************************** * UUSIPLAYER * ***********************************************************************} procedure TPeliTausta.UusiPlayerKentalle(x, y: integer;pelimies:Tpelaaja); begin pelimies.Parent:=Self; pelimies.Vauhti:=Random(5)+2; pelimies.Suunta:=90*Random(4); pelimies.SpritenHORKuva:=('.\kuvia\pelaajaO.bmp'); pelimies.SpritenVERKuva:=('.\kuvia\PelaajaY.bmp'); pelimies.SpritenPALAAKuva:=('.\kuvia\PelaajaHAAV.bmp'); pelimies.SpritenKUOLIKuva:=('.\kuvia\PelaajaKUOL.bmp'); pelimies.NappainYlos:='Y'; pelimies.NappainAlas:='H'; pelimies.NappainVasen:='G'; pelimies.NappainOikea:='J'; pelimies.Left:=MuutaKoord(Random(432))*RUUTU; pelimies.Top:=MuutaKoord(Random(432))*RUUTU; pelimies.OnSpriteMove:=Osuiko; end; {*********************************************************************** * UUSIENEMY * ***********************************************************************} procedure TPeliTausta.UusiEnemyTaustalle(x,y:integer); Var Uusi:TEnemy; begin Uusi:=TEnemy.Create(Self); Enemies.Add(Uusi); Uusi.Parent:=Self; Uusi.Vauhti:=Random(4)+1; Uusi.Suunta:=90*Random(4); Uusi.SpritenHORKuva:=('.\kuvia\happo_mies.bmp'); Uusi.SpritenVERKuva:=('.\kuvia\happo_miesy.bmp'); Uusi.SpritenPALAAKuva:=('.\kuvia\happo_mies_vuotaa.bmp'); Uusi.SpritenKUOLIKuva:=('.\kuvia\happo_mies_kuoli.bmp'); Uusi.Left:=MuutaKoord(Random(432))*RUUTU; Uusi.Top:=MuutaKoord(Random(432))*RUUTU; Uusi.OnSpriteMove:=Osuiko; end; {**************************************************************************} procedure TPeliTausta.SetObjekti_lkm(i:integer); begin if ( i < 0 ) then FObjekti_lkm :=0 else FObjekti_lkm := i; end; {**************************************************************************} procedure TPeliTausta.SetEnemy_lkm(i:integer); begin if ( i < 0 ) then FEnemy_lkm :=0 else FEnemy_lkm := i; end; {**************************************************************************} procedure TPeliTausta.SetPisteet(i:integer); begin FPisteet := i; end; {**************************************************************************} procedure TPeliTausta.SetHitPoints(i:integer); begin if ( i < 0 ) then FHitPoints :=0 else FHitPoints := i; end; {**************************************************************************} procedure TPeliTausta.SetObjekti_nimi(s: String); begin if (s='') then FObjekti_nimi:='.\kuvia\pala2.bmp' else FObjekti_nimi := s; end; {**************************************************************************} procedure TPeliTausta.SetTaustaAani(S: String); begin FTaustaAani := S; end; {**************************************************************************} procedure TPeliTausta.NappainPainettu(Key: char); begin player.MikaNappain(key); end; {*********************************************************************** * AI * ***********************************************************************} procedure TPeliTausta.VihollisenOhjailu(VaiTas: integer); var looppi:integer; vihollinen:TEnemy; begin {AI joka antaa jokaiselle viholliselle uuden suunnan} if VaiTas = 0 then exit; for looppi:= Enemies.Count-1 downto 0 do begin vihollinen:=Enemies.Items[looppi]; vihollinen.Suunta:=Aly.MinneMenna(Vihollinen.Suunta,Vihollinen.Left,Vihollinen.Top, Player.Left,Player.Top) end; //for end; {**********************************************************************} // OSUIKO SINUUN SERKKUNI? {**********************************************************************} procedure TPeliTausta.Osuiko(sender: TObject; x, y: integer); Var PelaajaJ:TPelaaja; ObjektiI:TStaattinen; EnemyOsu: TEnemy; j : integer; NelioI,NelioJ,NelioIntr,NelioEnemyOsu: TRect; osuma : boolean; position:Tpoint; vari :TColor; begin {MAALAUS} position.y :=MuutaKoord(player.Top); position.x :=MuutaKoord(player.Left); vari:=clFuchsia; if (Ristikko.NoMapImage = True) and (position.x >= 0) and (position.y >= 0) then begin Ristikko.PaintANelio(vari, bsSolid, position); end; If Tausta_palaset.Count=0 then Exit; if not(Sender is TEnemy) then exit; EnemyOsu := Sender as TEnemy; NelioEnemyOsu.Left:=x; NelioEnemyOsu.Top:=y; NelioEnemyOsu.Right:=x-1+EnemyOsu.Width; NelioEnemyOsu.Bottom:=y-1+EnemyOsu.Height; osuma := false; PelaajaJ:= player; NelioJ.Left:=PelaajaJ.Left; NelioJ.Top:=PelaajaJ.Top; NelioJ.Right:=PelaajaJ.Left-1+PelaajaJ.Width; NelioJ.Bottom:=PelaajaJ.Top-1+PelaajaJ.Height; {KUN ENEMY ja PLAYER törmaa} if IntersectRect(NelioIntr,NelioEnemyOsu,NelioJ) then begin osuma := true; end; if ( osuma ) then begin HitPoints:=HitPoints-1; pisteet:=pisteet-1; case HitPoints of 1..2: PelaajaJ.tila:=4; 0: begin PelaajaJ.tila:=5; Tag:=1; end; end;//case end; for j:=Tausta_palaset.Count-1 downto 0 do begin ObjektiI:=Tausta_palaset.Items[j]; NelioI.Left:=ObjektiI.Left; NelioI.Top:=ObjektiI.Top; NelioI.Right:=ObjektiI.Left-1+ObjektiI.Width; NelioI.Bottom:=ObjektiI.Top-1+ObjektiI.Height; {KUN VIHOLLINEN JA OBJEKTIT TÖRMÄÄ} if IntersectRect(NelioIntr,NelioEnemyOsu,NelioI) then begin EnemyOsu.vauhti:=EnemyOsu.vauhti+ObjektiI.Impulssi; pisteet:=pisteet-ObjektiI.Pisteet; if not (ObjektiI.SpritenHORKuva='.\kuvia\space_home.bmp') then begin Tausta_palaset.Delete(j); ObjektiI.Free; end; end //if {KUN PELAAJA JA OBJEKTIT TÖRMÄÄ} else if IntersectRect(NelioIntr, NelioJ,NelioI) then begin TaustaAanet.Parent:=self; TaustaAanet.FileName:=TaustaAani; TaustaAanet.Open; TaustaAanet.play; PelaajaJ.vauhti:=PelaajaJ.vauhti+ObjektiI.Impulssi; pisteet:=pisteet+ObjektiI.pisteet; if(ObjektiI.SpritenHORKuva='.\kuvia\space_home.bmp') then tag:=2; Tausta_palaset.Delete(j); ObjektiI.Free; end; //IF end; //for end; {*********************************************************************** * FREEZE SPRITEILLE * ***********************************************************************} procedure TPeliTausta.Freeze; var i:integer; a:TPelaaja; b:TEnemy; begin a:=player; a.vauhti:=0; for i:=Enemies.Count-1 downto 0 do begin b:=enemies.items[i]; b.vauhti:=0; end; end; {*********************************************************************** * REKISTERI * ***********************************************************************} procedure Register; begin RegisterComponents('Silli', [TPeliTausta]); end; {*********************************************************************** *********************************************************************** ***********************************************************************} end.