CameraPick picking most recent entity

Blitz3D Forums/Blitz3D Programming/CameraPick picking most recent entity

Fuller(Posted 2006) [#1]
I have a little game where you click on fireworks and blow them up. But it's only picking the most recently created firework entity.
Example: 2 fireworks shoot up at a 10 loop delay between them.
And you try to click on the second one but it doesn't explode . Click on the first one first then it explodes and then you can explode the second one.

Code:
Print "Loading Includes..."

Include "Includes/DevilParticleSystem.bb"
Include "includes/LIB_Juicy_fonts.bb"

Print "Setting up Graphics..."

Graphics3D 800,600,32
SetBuffer BackBuffer()

Print "Creating Types..." 

ClearTextureFilters()

Type fire
Field xv#,yv#,zv#
Field s,score,r_ang#
End Type 

Type part
Field xv#,yv#,zv#
Field s
End Type 

Type em
Field ent
End Type 

Print "Creating Variables..."

Global level=1,stage=1,stagetime,fm,cam,l,f_tex,tmp1,tmp2,s_50,s_100,score,num_fires,mouse

Const YV_DECREASE#=.005

Print "Init Game..."

cam=CreateCamera()
MoveEntity cam,0,20,-20

InitParticles(cam)

fm=CreateMesh()
surf=CreateSurface(fm)
v0=AddVertex(surf,0,0,0,0,2)
v1=AddVertex(surf,0,2,0,0,0)
v2=AddVertex(surf,2,2,0,2,0)
v3=AddVertex(surf,2,0,0,2,2) 
AddTriangle(surf,v0,v1,v2) 
AddTriangle(surf,v0,v2,v3)
HideEntity fm

f_tex=LoadTexture("media/firework.jpg",4)
ScaleTexture f_tex,MeshWidth(fm),MeshHeight(fm)

back=LoadSprite("backgrounds/skyline01.jpg")
MoveEntity back,0,20,-18
ScaleSprite back,2,2

score_spr=LoadSprite("media/score.png")
MoveEntity score_spr,-1.5,18.7,-18
ScaleSprite score_spr,.4,.4

score_font=JF_Load_Font("includes/PinkShadow.png")

mouse=LoadImage("media/pointer.png")

Print "Loading Sprites..."

LoadScoreSprites()
LoadParticles()

l=CreateLight()
AmbientLight 255,255,255

Print "Successful Load"
Cls 
StageIntro(stage)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

While Not KeyDown(1)

U_Stage()
U_Fire()
U_Parts()

Cls 
UpdateParticles()
UpdateWorld
RenderWorld
DrawImage mouse,MouseX(),MouseY()
Jf_Text(score_font,200,GraphicsHeight()-100,score)
Flip

Wend  
FreeParticles()
End

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function U_Stage()

Select level 

Case 1

Select stage

Case 1

If stagetime=0 Then CreateFire(-3,0,0,.02,.5,0,100)
If stagetime=100 Then CreateFire(3,0,0,-.02,.5,0,50)
If stagetime=200 Then CreateFire(-3,0,0,.08,.5,0,50)
If stagetime=250 Then CreateFire(-10,0,0,.03,.5,0,50)
If stagetime=500 Then CreateFire(10,0,0,-.04,.55,0,50)
If stagetime=600 Then CreateFire(10,0,0,-.04,.55,0,50)
If stagetime=700 Then CreateFire(0,0,0,0,.35,0,50)
If stagetime=700 Then CreateFire(11,0,0,-.04,.45,0,50)
If stagetime=700 Then CreateFire(-11,0,0,.04,.45,0,50)
If stagetime=800 Then CreateFire(-15,0,0,.09,.55,0,50)
If stagetime=880 Then CreateFire(5,0,0,-.09,.55,0,50)
If stagetime=960 Then CreateFire(-5,0,0,.09,.55,0,50)
If stagetime>1200 And num_fires=0 Then WinStage() 

Case 2

If stagetime=10 Then CreateFire(0,0,0,0,.6,0,50)
If stagetime=100 Then CreateFire(-10,0,0,0,.5,0,50)
If stagetime=100 Then CreateFire(10,0,0,0,.5,0,50)


End Select 

End Select 

stagetime=stagetime+1

End Function 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function U_Fire()

For f.fire=Each fire

MoveEntity f\s,f\xv#,f\yv#,f\zv#
f\yv#=f\yv#-YV_DECREASE#

If MouseHit(1) Then 
If CameraPick(cam,MouseX(),MouseY())=f\s Then
CreateExplosion(f\s)
If f\score=50 CreatePart(f\s,s_50,f\score)
If f\score=100 CreatePart(f\s,s_100,f\score)
HideEntity f\s
Delete f
num_fires=num_fires-1
EndIf 
EndIf 

Next 

End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function U_Parts()

For p.part=Each part

Next 

End Function 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function CreateExplosion(ent)

e.em=New em
e\ent=CreateSprite()
PositionEntity e\ent,EntityX(ent)+(MeshWidth(ent)/2),EntityY(ent)+(MeshHeight(ent)/2),EntityZ(ent)
SetEmitter(e\ent,tmp1)
SetEmitter(e\ent,tmp2)
HideEntity e\ent
Delete e

End Function 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function LoadParticles()

;Template1 - Smoke
tmp1 = CreateTemplate()
SetTemplateEmitterBlend(tmp1, 1)
SetTemplateInterval(tmp1, 1)
SetTemplateEmitterLifeTime(tmp1, 10)
SetTemplateParticleLifeTime(tmp1, 50, 65)
SetTemplateTexture(tmp1, "Media\Smoke.png", 2)
SetTemplateOffset(tmp1, -.1, .1, -1.1, -.9,0,0)    ;-.1, .1)
SetTemplateVelocity(tmp1, -.1, .1, -.1, .1,0,0) ;-.01, .01)
SetTemplateRotation(tmp1, -3, 3)
SetTemplateAlpha(tmp1, .3)
SetTemplateAlphaVel(tmp1, True)
SetTemplateSize(tmp1, 1.5, 1.5, .7, 1.5)
;Smokefire
t0 = CreateTemplate()
SetTemplateEmitterBlend(t0, 3)
SetTemplateInterval(t0, 1)
SetTemplateParticlesPerInterval(t0, 3)
SetTemplateEmitterLifeTime(t0, 10)
SetTemplateParticleLifeTime(t0, 5, 10)
SetTemplateTexture(t0, "Media\Fire.jpg", 3)
SetTemplateOffset(t0, -.1, .1, -1.1, -.9,0,0); -.1, .1)
SetTemplateVelocity(t0, -.1, .1, -.1, .1,0,0); -.01, .01)
SetTemplateRotation(t0, -3, 3)
SetTemplateAlphaVel(t0, True)
SetTemplateSize(t0, .5, .5, .7, 1.5)
SetTemplateBrightness(t0, 3)
SetTemplateSubTemplate(tmp1, t0)

;Template2 - Explosion
tmp2 = CreateTemplate()
SetTemplateEmitterBlend(tmp2, 3)
SetTemplateInterval(tmp2, 1)
SetTemplateParticlesPerInterval(tmp2, 30)
SetTemplateEmitterLifeTime(tmp2, 1)
SetTemplateParticleLifeTime(tmp2, 70, 85)
SetTemplateTexture(tmp2, "Media\Spark.jpg", 3)
SetTemplateOffset(tmp2, -.2, .2, -.2, .2,0,0); -.2, .2)
SetTemplateVelocity(tmp2, -.1, .1, -.1, .2,0,0) ;-.1, .1)
SetTemplateAlignToFall(tmp2, True, 45)
SetTemplateGravity(tmp2, .0015)
SetTemplateAlphaVel(tmp2, True)
SetTemplateSize(tmp2, .45, .1)
SetTemplateColors(tmp2, $FF0000, $FF0000)
SetTemplateBrightness(tmp2, 8)
;Blue explosion
t0 = CreateTemplate()
SetTemplateEmitterBlend(t0, 3)
SetTemplateInterval(t0, 1)
SetTemplateParticlesPerInterval(t0, 30)
SetTemplateEmitterLifeTime(t0, 1)
SetTemplateParticleLifeTime(t0, 70, 85)
SetTemplateTexture(t0, "Media\Spark.jpg", 3)
SetTemplateOffset(t0, -.2, .2, -.2, .2,0,0); -.2, .2)
SetTemplateVelocity(t0, -.1, .1, -.1, .2,0,0); -.1, .1)
SetTemplateAlignToFall(t0, True, 45)
SetTemplateGravity(t0, .0015)
SetTemplateAlphaVel(t0, True)
SetTemplateSize(t0, .45, .1)
SetTemplateColors(t0, $0000FF, $0000FF)
SetTemplateBrightness(t0, 8)
SetTemplateSubTemplate(tmp2, t0)
;Yellow
t0 = CreateTemplate()
SetTemplateEmitterBlend(t0, 3)
SetTemplateInterval(t0, 1)
SetTemplateParticlesPerInterval(t0, 70)
SetTemplateEmitterLifeTime(t0, 1)
SetTemplateParticleLifeTime(t0, 40, 85)
SetTemplateTexture(t0, "Media\Spark.jpg", 3)
SetTemplateOffset(t0, -.2, .2, -.2, .2,0,0); -.2, .2)
SetTemplateVelocity(t0, -.05, .05, -.03, .1,0,0); -.05, .05)
SetTemplateGravity(t0, .00125)
SetTemplateAlphaVel(t0, True)
SetTemplateSize(t0, .3, .3)
SetTemplateBrightness(t0, 3)
SetTemplateSubTemplate(tmp2, t0)

End Function 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function CreateFire(x#,y#,z#,xv#,yv#,zv#=0,score_addition) 

f.fire=New fire
f\s=CopyEntity(fm)
f\xv#=xv#
f\yv#=yv#
f\zv#=zv#
f\score=score_addition
EntityTexture f\s,f_tex
PositionEntity f\s,x#,y#,z#-2
RotateEntity f\s,0,0,-f\xv#*200 
EntityPickMode f\s,2
num_fires=num_fires+1

End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function CreatePart(ent,score_spr,add_to_score)

p.part=New part
p\s=CreateSprite()
PositionEntity p\s,EntityX(ent),EntityY(ent),EntityZ(ent)-.5
SetEmitter(p\s,score_spr)
HideEntity(p\s)
Delete p
score=score+add_to_score

End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function FirePicked()

For f.fire=Each fire

If CameraPick(cam,MouseX(),MouseY())=f\s And MouseHit(1) Then Return f\s:Else Return 0

Next

End Function  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function LoadScoreSprites()

s_50 = CreateTemplate()
SetTemplateEmitterBlend(s_50, 1)
SetTemplateInterval(s_50, 5)
SetTemplateEmitterLifeTime(s_50, 5)
SetTemplateParticleLifeTime(s_50, 130, 145)
SetTemplateTexture(s_50, "Media\s_50.png", 2, 1)
SetTemplateOffset(s_50, -.3, .3, -.3, .3, -.3, .3)
SetTemplateVelocity(s_50, -.02, .02, -.02, -.04, -0.02, -0.07)
SetTemplateSize(s_50, 1, 1, 1, 1)
SetTemplateSizeVel(s_50, .01, 1)
SetTemplateAlpha(s_50, .9)
SetTemplateAlphaVel(s_50, True)

s_100 = CreateTemplate()
SetTemplateEmitterBlend(s_100, 1)
SetTemplateInterval(s_100, 5)
SetTemplateEmitterLifeTime(s_100, 5)
SetTemplateParticleLifeTime(s_100, 130, 145)
SetTemplateTexture(s_100, "Media\s_100.png", 2, 1)
SetTemplateOffset(s_100, -.3, .3, -.3, .3, -.3, .3)
SetTemplateVelocity(s_100, -.02, .02, -.02, -.04, -0.02, -0.07)
SetTemplateSize(s_100, 1, 1, 1, 1)
SetTemplateSizeVel(s_100, .01, 1)
SetTemplateAlpha(s_100, .9)
SetTemplateAlphaVel(s_100, True)

End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Function StageIntro(num$)

Local start,dir,ang#

FlushKeys()
FlushMouse()

inspr=LoadSprite("media/stage"+num$+".png",4)
MoveEntity inspr,0,20,-18.5
SpriteViewMode inspr,2

Repeat 

start=start+1

If GetKey()<>0 Or start=400 Or GetMouse()<>0 Then Exit 

If dir=1 Then ang#=ang#+.2
If dir=0 Then ang#=ang#-.2
If ang#<-3 Then dir=1
If ang#>3 Then dir=0
RotateEntity inspr,0,ang#,0 

UpdateWorld
RenderWorld
Flip

Forever

HideEntity inspr
FlushMouse()
FlushKeys()

FreeEntity inspr 

End Function

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  

Function WinStage()

Local start,dir,ang#

FlushKeys()
FlushMouse()

clspr=LoadSprite("media/stage_cleared.png",4)
MoveEntity clspr,0,20,-18.5
SpriteViewMode clspr,2

Repeat 

start=start+1

If GetKey()<>0 Or start=400 Or GetMouse()<>0 Then Exit 

If dir=1 Then ang#=ang#+.2
If dir=0 Then ang#=ang#-.2
If ang#<-3 Then dir=1
If ang#>3 Then dir=0
RotateEntity clspr,0,ang#,0 

UpdateWorld
RenderWorld
Flip

Forever

HideEntity clspr
FlushMouse()
FlushKeys()

FreeEntity clspr
stagetime=0
stage=stage+1

End Function 


If you need the media, just say so. Though its just some basic text and sprites.


b32(Posted 2006) [#2]
The problem is using MouseHit() in a loop. It will only read the mouse once. Either use MouseDown or (better) store MouseHit in a variable before the start of the For..Next loop.


Fuller(Posted 2006) [#3]
Thanks a bundle!


Rook Zimbabwe(Posted 2006) [#4]
Just a side suggestion... code looks good by the way...

bram is right, if mousehit() is in the main body of the program it will check whenever the button is pressed... If you assigned a GLOBAL VARIABLE to that even you could always hit the function to CHECK that variable against last firework made...

a suggestion, not being critical.

You have mastered {code} {/code} (where you used [ instead of { )

If you used {codebox} {/codebox} it would simplify and shrink this forum load a mite

:)


Fuller(Posted 2006) [#5]
Yeah I should of used the codebox.