From 4ce8b89fdaf829546449c0d1acab14df80c49d95 Mon Sep 17 00:00:00 2001 From: whiteshark0 Date: Sat, 7 Apr 2007 12:58:11 +0000 Subject: Fixed some Bugs in Effect Engine: Perfect Note Stars was drawn 2 Times Golden Note Extra twinkling stops and is redrawn until next Sentece or Note at the End of the Golden Note. Redrawing of Golden Note Twinkles at the next Sentence git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@71 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/Classes/UGraphicClasses.pas | 99 ++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 31 deletions(-) (limited to 'Game/Code/Classes/UGraphicClasses.pas') diff --git a/Game/Code/Classes/UGraphicClasses.pas b/Game/Code/Classes/UGraphicClasses.pas index 66264334..34a964b2 100644 --- a/Game/Code/Classes/UGraphicClasses.pas +++ b/Game/Code/Classes/UGraphicClasses.pas @@ -29,8 +29,9 @@ type Particle : array of TParticle; LastTime : Cardinal; RecArray : Array of RectanglePositions; + TwinkleArray : Array[0..5] of PerfectNotePositions; // store position of last twinkle for every player PerfNoteArray : Array of PerfectNotePositions; - DelayAfterKillall : Integer; + KillallTime : Cardinal; // Timestamp set when Killall is called constructor Create; procedure Draw; @@ -40,7 +41,7 @@ type procedure KillAll(); procedure SaveGoldenStarsRec(Xtop, Ytop, Xbottom, Ybottom: Real); procedure SavePerfectNotePos(Xtop, Ytop: Real); - procedure GoldenNoteTwinkle(Top,Bottom,Right: Real); + procedure GoldenNoteTwinkle(Top,Bottom,Right: Real; Player: Integer); end; var GoldenRec : TEffectManager; @@ -48,6 +49,10 @@ var GoldenRec : TEffectManager; implementation uses sysutils, Windows,OpenGl12, UThemes, USkins, UGraphic, UDrawTexture, UTexture, math, dialogs; +const + KillallDelay: Integer = 100; + + //TParticle Constructor TParticle.Create(cX,cY: Real; cTex: Cardinal; cLive: Byte; cFrame : integer; cRecArrayIndex : Integer; cStarType : Integer); begin @@ -111,8 +116,15 @@ end; constructor TEffectManager.Create; +var c: Cardinal; begin LastTime := GetTickCount; + KillallTime := LastTime; + for c:=0 to 5 do + begin + TwinkleArray[c].xPos := 0; + TwinkleArray[c].yPos := 0; + end; end; @@ -214,27 +226,41 @@ if not(LastParticleIndex = -1) then end; procedure TEffectManager.KillAll(); +var c: Cardinal; begin //It's the kill all kennies rotuine while Length(Particle) > 0 do Kill(0); SetLength(RecArray,0); SetLength(PerfNoteArray,0); + for c:=0 to 5 do + begin + TwinkleArray[c].xPos:=0; + TwinkleArray[c].yPos:=0; + end; end; -procedure TeffectManager.GoldenNoteTwinkle(Top,Bottom,Right: Real); +procedure TeffectManager.GoldenNoteTwinkle(Top,Bottom,Right: Real; Player: Integer); //Twinkle stars while golden note hit +// this is called from UDraw.pas, SingDrawPlayerCzesc var C, P, XKatze, YKatze: Integer; + CurrentTime: Cardinal; begin - DelayAfterKillall:=10; // To be used later, for the screen change issue - For P := 0 to high(RecArray) do // Are we inside a GoldenNoteRectangle? - begin - if ((RecArray[P].xBottom >= Right) and - (RecArray[P].xTop <= Right) and - (RecArray[P].yTop <= (Top+Bottom)/2) and - (RecArray[P].yBottom >= (Top+Bottom)/2)) then + CurrentTime := GetTickCount; + //delay after Killall + if (CurrentTime > (KillallTime + KillallDelay)) then + // make sure we spawn only one time at one position + if (TwinkleArray[Player].xPos < Right) then + For P := 0 to high(RecArray) do // Are we inside a GoldenNoteRectangle? + begin + if ((RecArray[P].xBottom >= Right) and + (RecArray[P].xTop <= Right) and + (RecArray[P].yTop <= (Top+Bottom)/2) and + (RecArray[P].yBottom >= (Top+Bottom)/2)) then begin + TwinkleArray[Player].xPos:=Right; + for C := 1 to 8 do begin Ykatze := RandomRange(ceil(Top) , ceil(Bottom)); @@ -243,21 +269,26 @@ begin end; exit; // found a GoldenRec, did spawning stuff... done end; - end; + end; end; procedure TEffectManager.SaveGoldenStarsRec(Xtop, Ytop, Xbottom, Ybottom: Real); var P : Integer; // P like used in Positions NewIndex : Integer; + CurrentTime: Cardinal; begin - For P := 0 to high(RecArray) do // Do we already have that "new" position? - begin - if ((ceil(RecArray[P].xTop) = ceil(Xtop)) and (ceil(RecArray[P].yTop) = ceil(Ytop))) then - exit; // it's already in the array, so we don't have to create a new one - end; + CurrentTime := GetTickCount; + //delay after Killall + if (CurrentTime > (KillallTime + KillallDelay)) then + begin + For P := 0 to high(RecArray) do // Do we already have that "new" position? + begin + if ((ceil(RecArray[P].xTop) = ceil(Xtop)) and (ceil(RecArray[P].yTop) = ceil(Ytop))) then + exit; // it's already in the array, so we don't have to create a new one + end; -// we got a new position, add the new positions to our array + // we got a new position, add the new positions to our array NewIndex := Length(RecArray); SetLength(RecArray, NewIndex + 1); RecArray[NewIndex].xTop := Xtop; @@ -266,6 +297,7 @@ begin RecArray[NewIndex].yBottom := Ybottom; RecArray[NewIndex].TotalStarCount := ceil(Xbottom - Xtop) div 12 + 3; RecArray[NewIndex].CurrentStarCount := 0; + end; end; procedure TEffectManager.SavePerfectNotePos(Xtop, Ytop: Real); @@ -275,27 +307,32 @@ var RandomFrame : Integer; Xkatze, Ykatze : Integer; + CurrentTime: Cardinal; begin - For P := 0 to high(PerfNoteArray) do // Do we already have that "new" position? - begin - if ((ceil(PerfNoteArray[P].xPos) = ceil(Xtop)) and (ceil(PerfNoteArray[P].yPos) = ceil(Ytop))) then - exit; // it's already in the array, so we don't have to create a new one - end; + CurrentTime := GetTickCount; + //delay after Killall + if (CurrentTime > (KillallTime + KillallDelay)) then + begin + For P := 0 to high(PerfNoteArray) do // Do we already have that "new" position? + begin + if ((ceil(PerfNoteArray[P].xPos) = ceil(Xtop)) and (ceil(PerfNoteArray[P].yPos) = ceil(Ytop))) then + exit; // it's already in the array, so we don't have to create a new one + end; -// we got a new position, add the new positions to our array + // we got a new position, add the new positions to our array NewIndex := Length(PerfNoteArray); SetLength(PerfNoteArray, NewIndex + 1); PerfNoteArray[NewIndex].xPos := Xtop; PerfNoteArray[NewIndex].yPos := Ytop; - for P:= 0 to 2 do - begin - Xkatze := RandomRange(ceil(Xtop) - 5 , ceil(Xtop) + 10); - Ykatze := RandomRange(ceil(Ytop) - 5 , ceil(Ytop) + 10); - RandomFrame := RandomRange(0,14); - Spawn(Xkatze, Ykatze, Tex_Note_Perfect_Star.TexNum, 16 - RandomFrame, RandomFrame, -1, 2); - end; - + for P:= 0 to 2 do + begin + Xkatze := RandomRange(ceil(Xtop) - 5 , ceil(Xtop) + 10); + Ykatze := RandomRange(ceil(Ytop) - 5 , ceil(Ytop) + 10); + RandomFrame := RandomRange(0,14); + Spawn(Xkatze, Ykatze, Tex_Note_Perfect_Star.TexNum, 16 - RandomFrame, RandomFrame, -1, 2); + end; + end; end; end. -- cgit v1.2.3