need help "object dose not exist"
Blitz3D Forums/Blitz3D Beginners Area/need help "object dose not exist"
| ||
| Gday all. I am making a very simple game where targets are launched into the air & you have to shoot them. I have made the targets pickable & set collisions on them. Here is the function i am useing. Function update_target() For t.target = Each target t\targetv#=t\targetv#-.0025 MoveEntity t\piv,t\xv#,t\targetv#,0 TurnEntity t\mesh,0,t\rot#,0 EntityPickMode t\mesh,2 If picked=t\mesh score=score+10 create_puff() FreeEntity picked Delete t.target picked=CameraPick(camera,1024/2,768/2) EndIf If EntityCollided (t\piv,plane_col) miss=miss+1 FreeEntity t\piv Delete t.target EndIf Next End Function When i added in the "entity collided" section to the function, the game ends when i pick the target & i keep geting "Object dose not exist" I get the same thing if i put the "entity collided" before the "picked" code, except i get the error when the target collides with the plane. I know the reason why it is doing this. I was hopeing someone could help me out with a way around it. Thanks |
| ||
| Are "picked" and "miss" globally defined? The code you've posted is not helpful! |
| ||
| yep Picked & miss are both global. Here is the whole Code. Main Loop
Graphics3D 1024,768,0,1
SetBuffer BackBuffer()
Global camera
Global cam_x#,cam_z#,cam_pitch#,cam_yaw#
Global targetpiv,launcher,target1
Global picked
Global targettimer=MilliSecs()
Global time=3000
Global puff,tgthit
Global my_font = jf_load_font("Fonts\myfont.png")
Global my_fontr = jf_load_font("fonts\myfontred.png")
Global Score=0
Global Miss=0
Global plane_col=1
Global target_col=2
Type target
Field targetv#,mesh,rot#,piv,xv#
End Type
Type targetpuff
Field alpha#,puffsprite
End Type
light=CreateLight()
RotateEntity light,45,0,0
camera=CreateCamera()
PositionEntity camera,0,5,-5
CameraClsColor camera,0,200,255
CameraFogMode camera,1
CameraFogColor camera,0,200,255
CameraFogRange camera,100,500
plane=CreatePlane()
PositionEntity plane,0,-.1,0
EntityColor plane,0,0,0
EntityType plane,plane_col
terrain=LoadAnimMesh("terrain/myterrain2.x")
PositionEntity terrain,-250,0,-100
loadmeshes()
loadsprites()
Collisions target_col,plane_col,2,1
sight=LoadSprite("sprites/sight.tga",2,camera)
PositionEntity sight,0,0,1.5
ScaleSprite sight,.05,.05
SeedRnd MilliSecs()
While Not KeyDown (1)
If MilliSecs() > targettimer+time Then
create_target()
targettimer=MilliSecs()
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mxspd#=MouseXSpeed()*.2
myspd#=MouseYSpeed()*.2
MoveMouse 1024/2, 768/2
campitch=campitch+myspd
If campitch<-85 Then campitch=-85
If campitch>85 Then campitch=85
camyaw=camyaw-mxspd
If camyaw<-70 Then camyaw=-70
If camyaw>70 Then camyaw=70
RotateEntity camera,campitch,camyaw,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If MouseHit(1)
picked=CameraPick(camera,1024/2,768/2)
End If
update_target()
update_puff()
UpdateWorld
RenderWorld
jf_text(my_font,10,0,"Score: "+ Score)
jf_text(my_fontr,10,100,"Miss: "+miss)
Flip
Wend
Include "shootnrangefunctions.bb"
Include "Fonts\LIB_juicy_fonts.bb"
End
Functions
Function loadmeshes()
launcher=LoadMesh("models\launcher1.x")
PositionEntity launcher,0,1.5,20
targetpiv=CreatePivot()
HideEntity targetpiv
EntityType targetpiv,target_col
target1=LoadMesh("models\target1.x")
HideEntity target1
ScaleEntity target1,1,1,.5
launcher=LoadMesh("models\launcher1.x")
PositionEntity launcher,0,1.5,20
End Function
Function loadsprites()
puff=LoadSprite("sprites/puff.tga",2)
ScaleSprite puff,2,2
HideEntity puff
tgthit=LoadSprite("sprites/tgthit.tga",2)
ScaleSprite tgthit,2,2
HideEntity tgthit
End Function
Function create_puff()
a.targetpuff=New targetpuff
a\puffsprite= CopyEntity (puff)
a\alpha#=1
End Function
Function update_puff()
For a.targetpuff = Each targetpuff
PositionEntity a\puffsprite,PickedX(),PickedY(),PickedZ()
a\alpha#=a\alpha#-.05
EntityAlpha a\puffsprite,a\alpha#
If a\alpha=<0 Then
FreeEntity a\puffsprite
Delete a.targetpuff
EndIf
Next
End Function
Function create_target()
t.target=New target
t\piv=CopyEntity (targetpiv)
PositionEntity t\piv,EntityX(launcher),EntityY(launcher),EntityZ(launcher)
t\mesh=CopyEntity (target1,t\piv)
t\targetv#=Rnd(.25,.35)
t\rot#=Rnd(1.5,2)
t\xv#=Rnd(-.2,.2)
End Function
Function update_target()
For t.target = Each target
t\targetv#=t\targetv#-.0025
MoveEntity t\piv,t\xv#,t\targetv#,0
TurnEntity t\mesh,0,t\rot#,0
EntityPickMode t\mesh,2
If picked=t\mesh
score=score+10
create_puff()
FreeEntity picked
Delete t.target
picked=CameraPick(camera,1024/2,768/2)
EndIf
If EntityCollided (t\piv,plane_col)
miss=miss+1
FreeEntity t\piv
Delete t.target
EndIf
Next
End Function
Cheers |
| ||
If picked=t\mesh score=score+10 create_puff() FreeEntity picked Delete t.target picked=CameraPick(camera,1024/2,768/2) EndIf If EntityCollided (t\piv,plane_col) miss=miss+1 FreeEntity t\piv Delete t.target EndIf If both If blocks get executed then you are attempting to use a t.target which has just been deleted. This seems to be the most likely culprit. |
| ||
| I would agree with Floyd, and go further and say that is definitely the culprit. You either need to restructure your logic a bit better in that section, or check if t.target is null before entering the second if statement. |
| ||
| Replacing the EndIf/If with an ElseIf, might also do the job? |
| ||
or useIf handle(t) <> 0 ;Do stuff here EndIf That checks to see if your type object thing still exists. So if you delete "t" you can use that to check :) |
| ||
| HA HA.... SUCCESS!!!!! Thanks heaps everyone. :) |
| ||
| Gday all. Am SOOOO close to finishing my first game but need help with a pause function. I am able to pause the game & show the pause screen successfully. The only problem i now have is that the targets are launched with the millisecs() & when the game is paused it appears the millisecs() keep going & when i return back to the main game a target is launched straight away. Any sugestions on how to prevent this would be greatly appreciated. here is the pause code & function.
If KeyHit(25) Then paused=True
If paused = True Then game_paused()
Function game_paused()
FlushKeys
black =LoadImage("screens/fade.jpg")
paused = False
While Not KeyDown(0)
DrawBlock black,0,0
jf_Text(my_fontyr,200,300,"Game Paused.")
jf_Text(my_fontyrsml,50,400,"Press P to continue or Q to quit.")
If KeyHit(25) Cls :FreeImage black :FlushKeys :Return
If KeyHit(16) End
Flip
Wend
End Function
the code at the top of the post is still the main framework i am working around so refer to that if needed. Thanks :) |
| ||
| Can anyone please help. This is the only thing left to do to finish my game. |
| ||
When unpausing, set "targettimer" to MilliSecs() in your game_paused function:If KeyHit(25) Cls :FreeImage black :FlushKeys :targettimer = MilliSecs() :Return |
| ||
I am guessing you have something like this:if millisecs() > timetolaunchtarget then .... and other stuff goes in here endif All you need to do is store the value of millisecs() when the pause is issued, and then when the pause is over add the difference between "pausedattime" and millisecs() to "timetolaunchtarget" |
| ||
| You have a variable called targettime which I assume is used for launch decisions. When you are about to pause the game check the current time and compute elapsedtime = Millisecs() - tartgettime. This will be a very small number, for example 5 would mean 5 milliseconds have elapsed since tartgettime was set. This is the situation you want to restore when play resumes. So when the game resumes you set targettime = Millisecs() - elapsedtime and continue as if the pause never happened. |
| ||
| You could do it this way too, but if the elapsed time was 2990ms before you paused, then the next target will be launched 10ms after unpausing the game, which is not what you want. I would just reset the timer (targettimer = MilliSecs()), so you have the full 3 seconds after unpausing before the next target gets launched. |
| ||
| Thanks heaps everyone. I have now completed my first game in B3d. Now to start geting bigger & better. :) |