Help with collisions
Blitz3D Forums/Blitz3D Beginners Area/Help with collisions
| ||
Hi. I hope help me with a trouble of collisions. Here my code:Graphics3D 640,480,16,1 SetBuffer BackBuffer() Const FPS=60 global rayo,platillo,enem,metal,secuencia x_flot1=0 y_flot1=-0.25 camara=CreateCamera() CameraRange camara,0.05,10 luz=CreateLight() platillo=LoadAnimMesh("platillo.b3d") ScaleEntity platillo,0.04,0.08,0.08 RotateEntity platillo,0,90,0 PositionEntity platillo,0,-0.2,0.5 ExtractAnimSeq(platillo,0,40);Secuencia 1 ExtractAnimSeq(platillo,40,60);Secuencia 2 secuencia=1 animate platillo,1,1,secuencia,0 rayo=loadsprite("rayo.bmp") hideentity rayo enem=loadmesh("enemigo.b3d") hideentity enem metal=loadtexture("metal.bmp") If KeyHit(32) Then crea_disparo() SoundVolume sonido_laser,0.5 PlaySound sonido_laser endif Type disparo Field tipo Field vel# End Type Function crea_disparo() ray.disparo=New disparo ray\tipo=CopyEntity(rayo) ScaleSprite ray\tipo,0.02,0.02 EntityType ray\tipo,1 EntityRadius ray\tipo,0.02 If secuencia=1 Then PositionEntity ray\tipo,EntityX(platillo)+0.05,EntityY(platillo)+0.015,EntityZ(platillo) ray\vel=0.05 ElseIf secuencia=2 Then PositionEntity ray\tipo,EntityX(platillo)-0.05,EntityY(platillo)+0.015,EntityZ(platillo) ray\vel=-0.05 EndIf End Function Function mueve_destruye_disparo() For ray.disparo=Each disparo MoveEntity ray\tipo,ray\vel,0,0 If EntityX(ray\tipo)>EntityX(platillo)+1 Or EntityX(ray\tipo)<EntityX(platillo)-1 Then FreeEntity ray\tipo Delete ray EndIf Next End Function Function destruye_disparo() For ray.disparo=Each disparo If EntityCollided(ray\tipo,3) Then FreeEntity ray\tipo Delete ray EndIf Next end function Type flotilla1 Field tipo Field vel# End Type Function crea_flotilla1() For i=1 To 5 flot1.flotilla1=New flotilla1 x_flot1=Rnd(1,2)*p_flot1 flot1\tipo=CopyEntity(enem) ScaleEntity flot1\tipo,0.08,0.08,0.08 PositionEntity flot1\tipo,x_flot1,y_flot1,0.5 EntityTexture flot1\tipo,metal,0,1 NameEntity flot1\tipo,i EntityType flot1\tipo,3 EntityBox flot1\tipo,-0.04,-0.04,-0.04,0.08,0.08,0.08 y_flot1=y_flot1+0.1 flot1\vel=0.01*v_flot1 v_flot1=v_flot1*-1 p_flot1=p_flot1*-1 Next End Function crea_flotilla1() Function repos_flotilla1() For flot1.flotilla1=Each flotilla1 If EntityX(flot1\tipo)>0.6 Or EntityCollided(flot1\tipo,1) Then If EntityName(flot1\tipo)=1 Then PositionEntity flot1\tipo,Rnd(-1.3,-0.6),-0.25,0.5 EndIf If EntityName(flot1\tipo)=3 Then PositionEntity flot1\tipo,Rnd(-1.3,-0.6),0,0.5 EndIf If EntityName(flot1\tipo)=5 Then PositionEntity flot1\tipo,Rnd(-1.3,-0.6),0.25,0.5 EndIf EndIf If EntityX(flot1\tipo)<-0.6 Or EntityCollided(flot1\tipo,1) Then If EntityName(flot1\tipo)=2 Then PositionEntity flot1\tipo,Rnd(1.3,0.6),-0.125,0.5 EndIf If EntityName(flot1\tipo)=4 Then PositionEntity flot1\tipo,Rnd(1.3,0.6),0.125,0.5 EndIf EndIf Next End Function Function mueve_flotilla1() For flot1.flotilla1=Each flotilla1 MoveEntity flot1\tipo,flot1\vel,0,0 Next End Function period=1000/FPS time=MilliSecs()-period Collisions 1,3,3,1 While Not KeyHit(1) Repeat elapsed=MilliSecs()-time Until elapsed ticks=elapsed/period tween#=Float(elapsed Mod period)/Float(period) For k=1 To ticks repos_flotilla1() If k=ticks Then CaptureWorld time=time+period mueve_flotilla1() mueve_destruye_disparo() destruye_disparo() updateworld next RenderWorld tween Flip wend End the first time (before return to start position) , all work fine: http://img129.imageshack.us/img129/9248/img1kb5.th.jpg after return to start position, laser collides with enemy, but enemy is in another side :-( http://img353.imageshack.us/img353/4147/img2jf1.th.jpg What´s wrong. :-( Thank you very much to help me. :-) |
| ||
Without the media, I find it difficult to help out. The problem you're describing however, could be collision related. When you 'warp' an entity, that is, re-position it with PositionEntity, it still responds to collisions. To avoid this, use ResetEntity after repositioning. |
| ||
I tried it but does not work... :-( Please help meeee! |
| ||
Try the resetentity or ( hideentity / positionentity / showentity ) and comment out the rendertweening code to see if that works. I've heard about strange things happening with re-positioning and render-tweening although there have been a few good solutions posted if you do a search. Other than that post the code without the need for external media - just use cubes and the like. |
| ||
I've heard about strange things happening with re-positioning and render-tweening although there have been a few good solutions posted if you do a search. Nop, not is the command Render tween. Here is the code an can try you it. ;Javier Ramírez... Graphics3D 640,480,16,1 SetBuffer BackBuffer() Global platillo,txt_plat,x#,y#,v,p,disp y=-0.3 v=1 p=-1 camara=CreateCamera() CameraRange camara,0.01,10 luz=CreateLight() platillo=CreateSphere() ScaleEntity platillo,0.03,0.03,0.015 PositionEntity platillo,0,-0.18,0.5 ;PositionEntity platillo,0,0.12,0.5 Type balas Field tipo End Type Function crea_balas() bal.balas=New balas bal\tipo=CreateSphere() ScaleEntity bal\tipo,0.01,0.01,0.01 PositionEntity bal\tipo,EntityX(platillo),EntityY(platillo),EntityZ(platillo) EntityType bal\tipo,1 EntityRadius bal\tipo,0.01 End Function Function mueve_balas() For bal.balas=Each balas MoveEntity bal\tipo,-0.02,0,0 If EntityX(bal\tipo)<-0.5 Or EntityCollided(bal\tipo,3) Then FreeEntity bal\tipo Delete bal EndIf Next End Function Function movimientos_disparo() ;If EntityY(platillo)<0.3 Then ; If KeyDown(200) Then MoveEntity platillo,0,0.01,0 ;EndIf ;If EntityY(platillo)>-0.3 Then ; If KeyDown(208) Then MoveEntity platillo,0,-0.01,0 ;EndIf ;If EntityX(platillo)>-0.4 Then ; If KeyDown(203) Then MoveEntity platillo,-0.01,0,0 ;EndIf ;If EntityX(platillo)<0.4 Then ; If KeyDown(205) Then MoveEntity platillo,0.01,0,0 ;EndIf If KeyHit(32) Then crea_balas() EndIf End Function Type enemigos Field tipo[5] Field vel#[5] Field ex[5] Field tv[5] End Type Function crea_enemigos() enem.enemigos=New enemigos For i=1 To 5 x=Rnd(1,2)*p enem\tipo[i]=CreateCube() ScaleEntity enem\tipo[i],0.04,0.04,0.04 PositionEntity enem\tipo[i],x,y,0.5 EntityType enem\tipo[i],3 EntityBox enem\tipo[i],-0.02,-0.02,-0.02,0.04,0.04,0.04 y=y+0.15 enem\vel[i]=0.01*v v=v*-1 p=p*-1 Next End Function crea_enemigos() Function mueve_enemigos() For enem.enemigos=Each enemigos For i=1 To 5 MoveEntity enem\tipo[i],enem\vel[i],0,0 Next If EntityX(enem\tipo[1])>0.6 Or EntityCollided(enem\tipo[1],1) Then PositionEntity enem\tipo[1],Rnd(-1.3,-0.6),-0.3,0.5 ResetEntity enem\tipo[1] EndIf If EntityX(enem\tipo[3])>0.6 Or EntityCollided(enem\tipo[3],1) Then PositionEntity enem\tipo[3],Rnd(-1.3,-0.6),0,0.5 ResetEntity enem\tipo[3] EndIf If EntityX(enem\tipo[5])>0.6 Or EntityCollided(enem\tipo[5],1) Then PositionEntity enem\tipo[5],Rnd(-1.3,-0.6),0.3,0.5 ResetEntity enem\tipo[5] EndIf If EntityX(enem\tipo[2])<-0.6 Or EntityCollided(enem\tipo[2],1) Then ;HideEntity enem\tipo[2] PositionEntity enem\tipo[2],Rnd(0.6,1.3),-0.15,0.5 ResetEntity enem\tipo[2] ;ShowEntity enem\tipo[2] EndIf If EntityX(enem\tipo[4])<-0.6 Or EntityCollided(enem\tipo[4],1) Then ;HideEntity enem\tipo[4] PositionEntity enem\tipo[4],Rnd(0.6,1.3),0.15,0.5 ResetEntity enem\tipo[4] ;ShowEntity enem\tipo[4] EndIf Next End Function Collisions 1,3,3,1 ;With this don´t work good :-(. it´s a bug? ;Collisions 1,3,2,1 ;With this, work fine! :-) but... why? While Not KeyHit(1) movimientos_disparo() mueve_balas() mueve_enemigos() UpdateWorld RenderWorld Text 10,20,"Posición Y: " + EntityY(platillo) Flip Wend End the solution is "Collisions 1,3,2,1" but....Why?. I think that then is a bug with entitybox and collisions. Gracias. :-) |
| ||
Nae bother Yoda! |