Quote: "Same problem with the extended version I'm afraid."
I guess that means you can play the extended version (just trying to clarify).
I get what you mean about the collision. The flippers are handled in the loop well after the ball collision and movement occur, so there should be no "overlap" as far as that is concerned (I learned that lesson the hard way). This should mean that the flippers are treated like any other wall in most respects except one:
1) If the ball has passed the center-point of the flipper's next position.
So that's where I need to look. I add in a positive z-momentum to the ball when a collision with a flipper is detected - but it may not be enough. I'll try for an update tonight. Thanks again Ric!
Edit: Please give this a try. The trick I used to get the ball to move so fast is to do 3 move-frames per single sync frame. This is a frame-per-frame version - so it plays a lot slower. I am still not getting a pass-through. Let me know the specifics of the pass-through if you can. Thanks.
Sync On:Sync Rate 60:Autocam Off:Global n#:Global cFlag as Integer:Global LimbMatrix As Integer:Global EyeVector As Integer:Global LookAtVector As Integer:Global LookUpVector As Integer:Global DropDown as Integer:Global dd as Integer:Global tx#:Global ty#:Global tz#:Global MaxArry as Integer:Global Score as Integer:Dim KickFlag(1) as Float:Dim Kick(5):Dim cFlag(0) as Integer:Dim n(0) as Float
Dim PreLimb(0):LimbMatrix=6:EyeVector=3:LookAtVector=4:LookUpVector=5:For i = 1 to 6: r=Make Vector3(i):Next i:r = Make Matrix4( LimbMatrix ):Make Object Sphere 1,6,8,8:Prepare_Limb(1,0,3):Delete Object 1:Make Object Sphere 1,6,15,15:Set Object Collision To Spheres 1:Make Object Box 2,100,5,120:Make Object Box 3,20,11,5:Offset Limb 3,0,8,0,0:Make Mesh From Object 3,3:Delete Object 3:Add Limb 2,1,3
Prepare_Limb(2,1,.001):Offset Limb 2,1,-20,2.6,-50:Rotate Limb 2,1,0,30,0:Color Limb 2,1,Rgb(50,50,100):Add Limb 2,2,3:Prepare_Limb(2,2,.001):Offset Limb 2,2,20,2.6,-50:Rotate Limb 2,2,0,-210,0:Color Limb 2,2,Rgb(50,50,100):Add_Limb(2,7,10,120,-50,3,0,0,0,0):Add_Limb(2,7,10,120,50,3,0,0,0,0):Add_Limb(2,100,10,7,0,3,60,0,0,0):Add_Limb(2,4,6,4,0,3,30,0,42,0):Add_Limb(2,4,6,4,-9,3,20,0,45,0):Add_Limb(2,4,6,4,9,3,20,0,48,0):Add_Limb(2,18,8,4,-30,3,-45,0,20,0):Add_Limb(2,18,8,4,30,3,-45,0,-200,0):Add_Limb(2,6,6,6,-47,3,-30,0,45,0):Add_Limb(2,6,6,6,47,3,-30,0,45,0):rr=Add_Limb(2,2,8,7,20,3,35,0,0,0)
Add_Limb(2,2,8,7,29,3,34,0,0,0):Add_Limb(2,2,8,7,38,3,33,0,0,0):Add_Limb(2,21,8,3,-31,3,-27,0,40,0):Add_Limb(2,21,8,3,31,3,-27,0,-220,0):dd=Add_Limb(2,20,8,4,-30,2.4,53,0,0,0):Add_Limb(2,5,7,5,-36,3,-41,0,20,0):Add_Limb(2,5,7,5,36,3,-41,0,-200,0):l=Add_Limb(2,100,.1,120,0,8.5,0,0,0,0):Hide Limb 2,l:Color Limb 2,0,RGB(100,100,254):Set Object Collision Off 2:Position Camera 0,70,-80:Point Camera 0,0,0:Make Object Sphere 3,9:Scale Object 3,100,40,100:Make Mesh From Object 3,3:Delete Object 3:Pitch Object Up 2,3:For i = 0 to 2:Make Object 11+i,3,0
Position Object 11+i,Limb Position X(2,6+i),Limb Position Y(2,6+i)+2.0,Limb Position Z(2,6+i):Set Object Collision To Spheres 11+i:Color Object 11+i,Rgb(255,0,0):Next i:Make Object Box 14,17,7,1:Position Object 14,Limb Position X(2,16)+1.2,Limb Position Y(2,16)+.1,Limb Position Z(2,16)+1.2:Rotate Object 14,0,40,0:Set Object Collision To Boxes 14:Color Object 14,rgb(255,0,0):Clone Object 15,14:Position Object 15,Limb Position X(2,17)-1.2,Limb Position Y(2,17)+.1,Limb Position Z(2,17)+1.2:Rotate Object 15,0,-220,0:Set Object Collision To Boxes 15:Color Object 15,rgb(255,0,0):For i = 1 to 3:Make Object Box 15+i,.5,.5,4:Position Object 15+i,16+(i*9),Limb Position Y(2,rr+(i-1))+1,36-i:Color Object 15+i,0:Set Object Collision To Boxes 15+i:Next i
For i = 1 to 3:Make Object Box 18+i,4,6.5,2:Position Object 18+i,-40+(i*5),Limb Position Y(2,dd),51:Color Object 18+i,Rgb(255,0,0):Set Object Collision To Boxes 18+i:Next i:Position Object 1,0,-20,40:Do:Balls=0:Score=0:Do:If ReturnKey() And Object Position Y(1)<-20:Balls=Balls+1:Position Object 1,35,6,45:Set Vector3 2,-(Rnd(20.0)/10.0)-.5,0,0:Endif:tx#=Object Position X(1):ty#=Object Position Y(1):tz#=Object Position Z(1):If SpaceKey()
Position Object 2,0,0,.5:Else:Position Object 2,0,0,0:Endif:LV3#=Length Vector3(2):If LV3#>2.9:Scale Vector3 2,2,2.9/LV3#:Endif:Position Object 1,Object Position X(1)+X Vector3(2),Object Position Y(1)+Y Vector3(2)-.2,Object Position Z(1)+Z Vector3(2):Kickers():c=Check_Collision(1,0,2,1,0):Position Object 1,X Vector3(20), Y Vector3(20), Z Vector3(20):Set Vector3 2,(Object Position X(1)-tx#),(Object Position Y(1)-ty#),(Object Position Z(1)-tz#):Flipper(1):Flipper(2):Sync_Flag=(Sync_Flag<3)+(Sync_Flag<2)+(SyncFlag<1):If Sync_Flag<5:Set Cursor 0,0:Print "Score: ";Score:Print "Ball: ";Balls
Sync:Endif:if Balls=5 And Object Position Y(1)<-19:Exit:Endif:Loop:Wait 300:Clear Entry Buffer:Do:Set Cursor 0,0:Print "Score: ";Score:Print "Ball: ";Balls:Print:Print "Game Over. Press Any Key":If Inkey$()<>"":Exit:Endif:Sync:Loop:Loop
Function Flipper(side):ks=(side=1)*29+(side=2)*157:ang#=(side=1)*30+(side=2)*-210:If KickFlag(side-1)<60 and (KeyState(ks) or KickFlag(side-1)>0):KickFlag(side-1)=KickFlag(side-1)+7:Rotate Limb 2,side,0,ang#-KickFlag(side-1)*((side=1)-(side=2)),0:c=Check_Collision(2,side,1,1,0):If c:Set Vector3 2,X Vector3(2),Y Vector3(2),.5+(Z Vector3(2)*(Z Vector3(2)>0)):Position Object 1,Object Position X(1)+X Vector3(2)*.15,Object Position Y(1)+Y Vector3(2)*.15,Object Position Z(1)+Z Vector3(2):Endif:Endif:If KickFlag(side-1)>59 and KeyState(ks)=0:KickFlag(side-1)=0:Rotate Limb 2,side,0,ang#,0:Endif
Endfunction:Function Kickers():k=Object Collision(1,0):Select k:Case 11,12,13:If Kick(k-11)<1:dx#=(Object Position X(1)-Object Position X(k))*.2+X Vector3(2)*.1:dy#=(Object Position Y(1)-Object Position Y(k))*.2+Y Vector3(2)*.15:dz#=(Object Position Z(1)-Object Position Z(k))*.2+Z Vector3(2)*.1:Position Object 1,Object Position X(1)-dx#,Object Position Y(1)-dy#,Object Position Z(1)-dz#:tx#=Object Position X(1):ty#=Object Position Y(1):tz#=Object Position Z(1):Position Object 1,Object Position X(1)+dx#,Object Position Y(1)+dy#,Object Position Z(1)+dz#:Kick(k-11)=7:Score=Score+10:Set Object Emissive k,Rgb(255,100,100):Endif:EndCase:Case 14
Position Object 1,Object Position X(1)-(1.5+X Vector3(2)*.2),Object Position Y(1),Object Position Z(1)-(1.5+Z Vector3(2)*.2):tx#=Object Position X(1):ty#=Object Position Y(1):tz#=Object Position Z(1):Position Object 1,Object Position X(1)+(1.5+X Vector3(2)*.2),Object Position Y(1),Object Position Z(1)+(1.5+Z Vector3(2)*.2):Set Object Emissive 14,Rgb(255,100,100):Kick(3)=7:Score = Score + 1:EndCase:Case 15:Position Object 1,Object Position X(1)+(1.5+X Vector3(2)*.2),Object Position Y(1),Object Position Z(1)-(1.5+Z Vector3(2)*.2):tx#=Object Position X(1):ty#=Object Position Y(1):tz#=Object Position Z(1):Position Object 1,Object Position X(1)-(1.5+X Vector3(2)*.2),Object Position Y(1),Object Position Z(1)+(1.5+Z Vector3(2)*.2):Set Object Emissive 15,Rgb(255,100,100):Kick(4)=7:Score = Score + 1:EndCase:Case 16,17,18
Score = Score + 2:EndCase:Case 19,20,21:Position Object 1,Object Position X(1),Object Position Y(1),Object Position Z(1)+(1.5+Z Vector3(2)*.2):tx#=Object Position X(1):ty#=Object Position Y(1):tz#=Object Position Z(1):Position Object 1,Object Position X(1),Object Position Y(1),Object Position Z(1)-(1.5+Z Vector3(2)*.2):Position Object k,0,-10,0:DropDown=DropDown+1:Kick(4)=7:Score = Score + 10:EndCase:EndSelect:For i = 11 to 15:Kick(i-11)=Kick(i-11)-(Kick(i-11)>0):If Kick(i-11)=1:Set Object Emissive i,0:Endif:A_Constant
EndFunction:Function Add_Limb(ObjectID,sx#,sy#,sz#,px#,py#,pz#,ax#,ay#,az#):Make Object Box 3,sx#,sy#,sz#:Make Mesh From Object 3,3:Delete Object 3:i=1:Do:If Limb Exist(ObjectID,i)=0:Exit:Endif:i=i+1:Loop:Add Limb ObjectID,i,3:Offset Limb ObjectID,i,px#,py#,pz#:Rotate Limb ObjectID,i,ax#,ay#,az#
EndFunction i:Function Prepare_Limb(ObjectID,LimbID,C_Factor#):arry=ObjectID*20+LimbID:max=1:If MaxArry>1:For i = 1 to MaxArry:If max<PreLimb(i):max=PreLimb(i):Endif:Next i:Endif:If MaxArry<arry:MaxArry=arry:Dim PreLimb(arry) as Integer:PreLimb(arry)=1
Dim LMX(arry,max) as Float:Dim LMY(arry,max) as Float:Dim LMZ(arry,max) as Float:Endif:Lock VertexData for Limb ObjectID,LimbID:VIC=Get Vertexdata Index Count():n=0:LMX(arry,n)=Get VertexData Position X(Get IndexData(0)):LMY(arry,n)=Get VertexData Position Y(Get IndexData(0)):LMZ(arry,n)=Get VertexData Position Z(Get IndexData(0)):c#=C_Factor#*C_Factor#:n=1:For i = 1 to VIC:tx#=Get VertexData Position X(Get IndexData(i)):ty#=Get VertexData Position Y(Get IndexData(i)):tz#=Get VertexData Position Z(Get IndexData(i)):flag=0:For j=1 to n:d#=((tx#-LMX(array,j))*(tx#-LMX(array,j))+(ty#-LMY(array,j))*(ty#-LMY(array,j))+(tz#-LMZ(array,j))*(tz#-LMZ(array,j))):if d#<c# or (tx#=LMX(arry,0) and ty#=LMY(arry,0) and tz#=LMZ(arry,0))
flag=1:Exit:Endif:Next j:If flag=0:n=n+1:If n>max:max=n:PreLimb(arry)=n:Dim LMX(arry,n) as Float:Dim LMY(arry,n) as Float:Dim LMZ(arry,n) as Float:Endif:LMX(arry,n)=tx#:LMY(arry,n)=ty#:LMZ(arry,n)=tz#:Endif:Next i:PreLimb(arry)=n:Unlock VertexData
Endfunction:Function LimbMatrix4(ResultMatrix, Object, Limb):AX#=Limb Direction X( Object, Limb ) : AY#=Limb Direction Y( Object, Limb ) : AZ#=Limb Direction Z( Object, Limb ):CX#=Cos(AX#) : SX#=Sin(AX#) : CY#=Cos(AY#) : SY#=Sin(AY#) : CZ#=Cos(AZ#) : SZ#=Sin(AZ#):Set Vector3 EyeVector, Limb Position X( Object, Limb), Limb Position Y( Object, Limb), Limb Position Z( Object, Limb):Set Vector3 LookAtVector, -1.0*SZ#*(-1.0*SX#)+CZ#*SY#*CX#+Limb Position X(Object,Limb), CZ#*(-1.0*SX#)+SZ#*SY#*CX#+Limb Position Y(Object,Limb), CY#*CX#+Limb Position Z(Object,Limb):Set Vector3 LookUpVector, -SZ#*CX#+CZ#*SY#*SX#, CZ#*CX#+SZ#*SY#*SX#, CY#*SX#:Build LookAt LHMatrix4 ResultMatrix, EyeVector, LookAtVector, LookUpVector:r=Inverse Matrix4( ResultMatrix, ResultMatrix ):#Constant A_Constant :Next i:DropDown=DropDown+(DropDown>2):If DropDown>10:Score=Score + 100:DropDown=0:For i = 1 to 3:Position Object 18+i,-40+(i*5),Limb Position Y(2,dd),51:Next i:Endif
EndFunction:Function Check_Collision(ObjectID as DWord,LimbID as DWord,TargetID as DWord,accuracy#,cycles):arry=ObjectID*20+LimbID:r=Make Vector3(arry):if Array Count(cflag(0))<arry:Dim cFlag(arry) as Integer:Dim n(arry) as Float:Endif:LimbMatrix4(LimbMatrix, ObjectID, LimbID):st=1.0/accuracy#:MC=PreLimb(arry):If cFlag(arry)=0:n(arry)=1:Set Vector3 arry,Limb Position X(ObjectID,LimbID),Limb Position Y(ObjectID,LimbID),Limb Position Z(ObjectID,LimbID):Else:if n(arry)>1:n(arry)=2:Set Vector3 arry,X Vector3(arry)+Limb Position X(ObjectID,LimbID),Y Vector3(arry)+Limb Position Y(ObjectID,LimbID),Z Vector3(arry)+Limb Position Z(ObjectID,LimbID):Endif:Endif
For i = 0+cFlag(arry) to MC step st:Set Vector3 1,LMX(arry,i),LMY(arry,i),LMZ(arry,i):Transform Coords Vector3 1, 1, LimbMatrix:d#=Intersect Object(TargetID,Limb Position X(ObjectID,LimbID),Limb Position Y(ObjectID,LimbID),Limb Position Z(ObjectID,LimbID),X Vector3(1),Y Vector3(1),Z Vector3(1)):if d#>0:Set Vector3 1,X Vector3(1)-Limb Position X(ObjectID,LimbID),Y Vector3(1)-Limb Position Y(ObjectID,LimbID),Z Vector3(1)-Limb Position Z(ObjectID,LimbID):d2#=Length Vector3(1):id2#=d2#-d#:Multiply Vector3 1,-(id2#/d2#):Set Vector3 arry,X Vector3(arry)+(Limb Position X(ObjectID,LimbID)+X Vector3(1))*id2#,Y Vector3(arry)+(Limb Position Y(ObjectID,LimbID)+Y Vector3(1))*id2#,Z Vector3(arry)+(Limb Position Z(ObjectID,LimbID)+Z Vector3(1))*id2#:n(arry)=n(arry)+id2#:Endif:Next i:cFlag(arry)=cFlag(arry)+1:if cFlag(arry)>cycles:cFlag(arry)=0:Endif:Set Vector3 arry,X Vector3(arry)/n(arry),Y Vector3(arry)/n(arry),Z Vector3(arry)/n(arry):Hit=(n(arry)>1)
EndFunction Hit
`Thanks to Dmitry K for the LimbMartix4() function!
"Droids don't rip your arms off when they lose." -H. Solo
REALITY II