Code archives/Miscellaneous/Basic & Charged Jumping in 3D
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Ive read many topics on jumping this past couple years. Most of them had the same problem. When you press and hold the [JUMP] key, the character bounces like a jack rabbit. Well from help from the Blitz Community, and lots of tinkering, trial and error. I think I may have a solution. The object of jumping is to press the [JUMP] button for a single jump. Not multiple ones. --------------------------------------- ;if jumping is labeled as false check for collisions. If none you are still in the air, therefore, still jumping If jump=False If CountCollisions(player1)=0 jump=True velud=0 End If ;make sure your assending/desending is decreased constantly. Think of it as gravity velud=velud-1 ;check for collisions. If a collision is found vertically, you are no longer jumping. (Turn Jumping off) For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey jump=False velud=0-1 Exit ElseIf CollisionNY(player1,checkallcollisions)<0;-0.03125*sizey jump=True velud=0-1 Exit End If Next ;here's where things change. Instead of keydown. use keyhit and then do the vertical check again. without the vertical check, you may not jump when ou want to. If KeyHit(mjp) For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey jump=False velud=0-1 Exit End If Next ;if jumping is false set to true and set a velocity number. You should then be all set. If jump=False velud=8;8,11,14,16,18 (1-5 blocks respectfully) jump=True End If End If --------------------------------------- I hope this helps. Like i said, this is basic jumping without the jack-rabbit jumping when the jump button is pressed. Here is the charged jumping. -------------------------------------- ;while the charcter is falling check for collisions vertically. If you land on something reduce pull to -1, if you hit your head. do the same thing. It will stop the acceleration and start the deceleration. velud=veluD-1 For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey velud=-1 Exit ElseIf CollisionNY(player1,checkallcollisions)<0;-0.03125*sizey velud=-1 Exit End If Next ;if you press the [JUMP] button, do a single jump. (just like the other jump routine). If KeyHit(mjp) For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey velud=8 Exit End If Next End If ;if you charge the jump. increase the power of the jump when the [JUMP] button is released. Oh yeah, check for vertical collisions along the way. If KeyDown(mjp)=True tmpvud=tmpvud+1 If tmpvud>18 tmpvud=18 ElseIf KeyDown(mjp)=False For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey velud=tmpvud Exit End If Next tmpvud=-1 End If ---------------------------------------- Well that's it. There is now traditional jumping, and charged jumping. I didn't do the extended jumping like mario where you hold down the [jump] button to go higher. I didn't think it was needed after doing the chargedjumping routine. But I'm sure someone can figure it out now with jumping finally figured out completely. Traditional Jumping - Tap [JUMP] to jump: Based on any game with jumping. Charged Jumping - Tap [Jump] to jump, Hold & release [Jump] to charge jump: Based on Spider-Man 2 (PlayStation2) jumping. Mario Jumping - Not done, didn't think it's needed after the charged jumping. But it should be easy to figure out now with the other 2 Jump Routines as a starting point. | |||||
Global mup=200,MDN=208,mlt=203,mrt=205,mjp=57,mst=28 ;input user keys here before the program starts Color 255,255,255 For x=0 To 6 Cls Text 10, 0," Up:" Text 10,12," Down:" Text 10,24," Left:" Text 10,36,"Right:" Text 10,48," Jump:" Text 10,60,"Shoot:" If X<6 Text 10,84,"[ESC] Use Defaults" If x<6 Rect 58,x*12,8,12 If x>0 Text 58,0,mup If x>1 Text 58,12,mdn If x>2 Text 58,24,mlt If x>3 Text 58,36,mrt If x>4 Text 58,48,mjp If x>5 Text 58,60,mst If x=6 Text 10,84,"Press any key to continue..." .redo confirm=False FlushKeys Repeat For keyz=0 To 255 If KeyHit(keyz) If x=0 mup=keyz If x=1 mdn=keyz If x=2 mlt=keyz If x=3 mrt=keyz If x=4 mjp=keyz If x=5 mst=keyz confirm=True End If Next Until confirm=True If X<6 If MUP=1 Or MDN=1 Or MLT=1 Or MRT=1 Or MJP=1 Or MST=1 mup=200 MDN=208 mlt=203 mrt=205 mjp=57 mst=28 x=5 End If End If If x=0 If mup=15 Goto redo ElseIf x=1 If mdn= 15 Goto redo If mdn=mup Goto redo ElseIf x=2 If mlt= 15 Goto redo If mlt=mup Goto redo If mlt=mdn Goto redo ElseIf x=3 If mRt= 15 Goto redo If mRT=mup Goto redo If mRT=mdn Goto redo If mRT=mLT Goto redo ElseIf x=4 If mJP= 15 Goto redo If mJP=mup Goto redo If mJP=mdn Goto redo If mJP=mLT Goto redo If mJP=mRT Goto redo ElseIf x=5 If mST= 15 Goto redo If mST=mup Goto redo If mST=mdn Goto redo If mST=mLT Goto redo If mST=mRT Goto redo If mST=mJP Goto redo End If Next ;ADDED DATA--------------------------------------- RESTOREBMP ;CREATE CHARACTGER AND BULLET AND BEAM ;------------------------------------------------- Const PERIOD=32 ;(1024/PERIOD) = FPS (FRAMES PER SECOND) ;SET GRAPHICS MODE AND LOAD STUFF HERE. Graphics3D 640,480,16,3 Global TIME=MilliSecs()-PERIOD,ELAPSED,FRAMETICKS,TWEEN# ;TIME = CALCULATE TIME PERIOD ;ELLAPSE = TIME ELLAPSED (TIME PASSED) This changes throughout the program ;FRAMETICKS = How many frames have ellapsed (passe) ;TWEEN# = used to get inbetween frames ;ADDED DATA-------------------------------------------------------------------- Const CLSN_PLYR=1,CLSN_OBJS=2,CLSN_GRND=3 Collisions CLSN_PLYR,CLSN_OBJS,2,2 Collisions CLSN_PLYR,CLSN_GRND,2,2 AmbientLight 84,168,252 PLANE1TEX=CreateTexture(32,32) SetBuffer TextureBuffer(PLANE1TEX) Color 84,84,252 Rect 0,0,32,32 For ALLLINES=0 To 2 Color 42-(ALLLINES Mod 2)*42,42-(ALLLINES Mod 2)*42,210-(ALLLINES Mod 2)*42 Line ALLLINES,1,ALLLINES+29,30 Line ALLLINES,30,ALLLINES+29,1 Next Color 0,0,0 For ALLSQUARES=0 To 3 Rect ALLSQUARES/2*16,16*(ALLSQUARES Mod 2),16,16,0 Next Color 0,0,168 Line 0,0,31,31 Line 0,31,31,0 PLANE2TEX=CreateTexture(32,32) SetBuffer TextureBuffer(PLANE2TEX) Color 252,84,84 Rect 0,0,32,32 For ALLLINES=0 To 2 Color 210-(ALLLINES Mod 2)*42,42-(ALLLINES Mod 2)*42,42-(ALLLINES Mod 2)*42 Line ALLLINES,1,ALLLINES+29,30 Line ALLLINES,30,ALLLINES+29,1 Next Color 0,0,0 For ALLSQUARES=0 To 3 Rect ALLSQUARES/2*16,16*(ALLSQUARES Mod 2),16,16,0 Next Color 168,0,0 Line 0,0,31,31 Line 0,31,31,0 ;------------------------------------------------------------------------------ SetBuffer BackBuffer() ;Double buffering ;ADDED DATA-------------------------------------------------------------------- ;cubes cube=CreateCube() EntityColor cube,1,1,255 ScaleEntity cube,.5,.5,.5 PositionEntity cube,-5,1.5,0 EntityType cube,clsn_objs cube=CreateCube() EntityColor cube,255,1,1 ScaleEntity cube,.25*2,.25*2,.25*2 PositionEntity cube,0,.25*2,0 EntityType cube,clsn_objs cube=CreateCube() EntityColor cube,1,255,1 ScaleEntity cube,.25*6,.25*12,.25*6 PositionEntity cube,5,.25*12,0 EntityType cube,clsn_objs ;light btllight=CreateLight(2) PositionEntity btllight,0,10,0 ;charsize x,y sizex=16*1 sizey=16*1 plyrdir=0 ;player direction WALKSPEED=2 ;PLAYER'S WALKING SPEED player1=CreateSprite() plyr1tex=LoadAnimTexture("char1.bmp",7,32,32,0,2) EntityTexture player1,plyr1tex,0 SpriteViewMode player1,2 PositionEntity player1,0,5,0 ScaleSprite player1,0.03125*sizex,0.03125*sizey EntityRadius player1,0.0078125*sizex,0.015625*sizey EntityType player1,clsn_plyr ;delete when done---------- sphere=CreateSphere(32,player1) EntityAlpha sphere,.5 ScaleEntity sphere,0.0078125*sizex,0.015625*sizey,0.0078125*sizex PositionEntity sphere,0,0,0 ;-------------------------- ;player camera camera=CreateCamera(player1) CameraViewport camera,0,0,GraphicsWidth(),GraphicsHeight() CameraProjMode camera,2 PositionEntity camera,0,10,-10 RotateEntity camera,45,0,0 CameraZoom camera,.5 ;fixed camera smlcam=CreateCamera() CameraViewport smlcam,GraphicsWidth()*7/8,GraphicsHeight()*7/8,GraphicsWidth()/8,GraphicsHeight()/8 CameraProjMode smlcam,2 PositionEntity smlcam,3,10,-10 RotateEntity smlcam,45,0,0 CameraZoom smlcam,.5 ;battlefield btlcube=CreateCube() ScaleEntity btlcube,12,Float(1)/256,4 ScaleTexture plane1tex,Float(1)/24,Float(1)/8 EntityTexture btlcube,plane1tex PositionEntity btlcube,0,0,0 EntityType btlcube,clsn_grnd ;exitfield exitcube=CreateCube() ScaleEntity exitcube,12+8,Float(1)/256,4+8 ScaleTexture plane2tex,Float(1)/40,Float(1)/24 EntityTexture exitcube,plane2tex PositionEntity EXITcube,0,-Float(1)/256,0 EntityType EXITcube,clsn_grnd FLUSH ; FLUSH INPUTS ;------------------------------------------------------------------------------ ;BEGINNING OF PROGRAM Repeat ;WAIT FOR ELLAPSED TIME Repeat ELAPSED=MilliSecs()-TIME Until ELAPSED FRAMETICKS=ELAPSED/PERIOD ;how many 'frames' have elapsed Tween#=Float(elapsed Mod period)/Float(period) ;fractional remainder ;check each frame For checkticks=1 To frameticks time=time+period ;goto next time period If checkticks=frameticks Then CaptureWorld ; capture each frame in 3d world within time period ;place images/entties and inputs here-------------------------------------------- ;ADDED DATA---------------------------------- If jroutine=1;new jump routine stumped ;----------------------------original charge jump code ; velud=veluD-1 ; If CountCollisions(player1)>0 velud=-1 ; If KeyHit(mjp) ; If CountCollisions(player1)>0 velud=8;8,11,14,16,18 (1-5 blocks respectfully) ; End If ; If KeyDown(mjp)=True ; tmpvud=tmpvud+1 ; If tmpvud>18 tmpvud=18 ; ElseIf KeyDown(mjp)=False ; If CountCollisions(player1)>0 velud=tmpvud ; tmpvud=-1 ; End If ;------------------------------------------------------ velud=veluD-1 For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey velud=-1 Exit ElseIf CollisionNY(player1,checkallcollisions)<0;-0.03125*sizey velud=-1 Exit End If Next If KeyHit(mjp) For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey velud=8 Exit End If Next End If If KeyDown(mjp)=True tmpvud=tmpvud+1 If tmpvud>18 tmpvud=18 ElseIf KeyDown(mjp)=False For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey velud=tmpvud Exit End If Next tmpvud=-1 End If ElseIf jroutine=0;jump routine with help from blitz forum community If jump=False If CountCollisions(player1)=0 jump=True velud=0 End If velud=velud-1 For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey jump=False velud=-1 Exit ElseIf CollisionNY(player1,checkallcollisions)<0;-0.03125*sizey jump=True velud=-1 Exit End If Next If KeyHit(mjp) For checkallCollisions=1 To CountCollisions(player1) If CollisionNY(player1,checkallcollisions)>0;0.03125*sizey jump=False velud=-1 Exit End If Next If jump=False velud=8;8,11,14,16,18 (1-5 blocks respectfully) jump=True End If End If End If If KeyHit(15) jroutine=Not jroutine ;tab ;toggles jumping routines ;move up If KeyDown(mup)=True If CountCollisions(PLAYER1)=0 If VELNS=0 VELN=1 ElseIf CountCollisions(PLAYER1)>0 veln=veln+walkspeed If veln>5*walkspeed veln=5*walkspeed End If ElseIf KeyDown(mup)=False If CountCollisions(PLAYER1)>0 veln=veln-walkspeed If veln<0 veln=0 End If End If ;move down If KeyDown(mdn)=True If CountCollisions(PLAYER1)=0 If VELNS=0 VELS=1 ElseIf CountCollisions(PLAYER1)>0 vels=vels+walkspeed If vels>5*walkspeed vels=5*walkspeed End If ElseIf KeyDown(mdn)=False If CountCollisions(PLAYER1)>0 vels=vels-walkspeed If vels<0 vels=0 End If End If velns=veln-vels ;balances north(up) and south(down) movement ;move left If KeyDown(mlt)=True If CountCollisions(PLAYER1)=0 If VELWE=0 VELW=1 ElseIf CountCollisions(PLAYER1)>0 velw=velw+walkspeed If velw>5*walkspeed velw=5*walkspeed End If ElseIf KeyDown(mlt)=False If CountCollisions(PLAYER1)>0 velw=velw-walkspeed If velw<0 velw=0 End If End If ;move RIGHT If KeyDown(mrt)=True If CountCollisions(PLAYER1)=0 If VELWE=0 VELE=1 ElseIf CountCollisions(PLAYER1)>0 velE=velE+walkspeed If velE>5*walkspeed velE=5*walkspeed End If ElseIf KeyDown(mRT)=False If CountCollisions(PLAYER1)>0 velE=velE-walkspeed If velE<0 velE=0 End If End If velWE=velE-velW ;balances west(left) and east(right) movement If velwe<>0 tmpdir=-(Sgn(velwe)-1)/2 ;calculate char dir using valwe If tmpdir<>plyrdir plyrdir=tmpdir direction(player1,plyr1tex,tmpdir) End If ;CHARACTER MOVEMENT MoveEntity player1,Float(velwe)/160,Float(velud)/32,Float(velns)/160 ;-------------------------------------------- ;-------------------------------------------------------------------------------- UpdateWorld ;UPDATE YOUR 3D WORLD Next RenderWorld TWEEN# ; RENDERS CURRENT SCREEN FROM BACKGROUND BUFFER (INCLUDING TWEENING) ;ADDED TEXT--------------------------------------------------------- Color 255,255,255 Text 0, 0,EntityX(PLAYER1)+","+EntityY(PLAYER1)+","+EntityZ(PLAYER1) Text 0,10,VELNS+", "+VELWE+", "+VELUD Text 0,20,"[TAB] Toggle jumping: "+jroutine Text 20,30,"press [JUMP] to Jump." If jroutine=1 Text 20,40,"hold & release [JUMP] to ChargeJump" ;------------------------------------------------------------------- Flip ; show new screen update Until KeyHit(1) Or (EntityCollided(Player1,CLSN_GRND)=exitcube) Or (EntityY(player1)<-2 Or EntityY(player1)>11);END MAIN LOOP ;CLEAN UP STUFF time=0 elapsed=0 frameticks=0 tween#=0 checkticks=0 ClearWorld ;remove entities, brushes, textures from memory (anything missed) ClearCollisions ;clear all collisions from memory EndGraphics flush Function DIRECTION(SPR,TEX,FRM);CHANGE IMAGE ON SPRITE EntityTexture SPR,TEX,FRM End Function Function flush() ;flush all inputs from memory FlushKeys ;clear keyboard presses FlushMouse ;clear mouse clicks FlushJoy ;clear joystick presses End Function Function restorebmp() ;set gfxmode Graphics 320,240,16,3 ;Create Image tmp=CreateImage(64,32) ;set buffer to image SetBuffer ImageBuffer(tmp) ;if char1.bmp doesn't exist... make it If FileType("char1.bmp")=2 DeleteDir "char1.bmp" If FileType("char1.bmp")=0 Cls Restore char For v=0 To 31 For h=0 To 31 Read c If c>0 Color (c-1)*84+7*(c=1),(c-1)*84+7*(c=1),(c-1)*84+7*(c=1) Plot h,v Plot 63-h,v End If Next Next SaveImage tmp,"char1.bmp" End If ;if laser1.bmp doesn't exist... make it If FileType("laser1.bmp")=2 DeleteDir "laser1.bmp" If FileType("laser1.bmp")=0 Cls For c=0 To 3 Color c*63+63,c*63+63,c*63+63 Rect 8,c+12,16,7-2*c Rect c+12+32,8,7-2*c,16 Next SaveImage tmp,"laser1.bmp" End If ;if bullet1.bmp doesn't exist... make it If FileType("bullet1.bmp")=2 DeleteDir "bullet1.bmp" If FileType("bullet1.bmp")=0 Cls For c=0 To 3 Color c*63+63,c*63+63,c*63+63 Oval c*3/2+8,c*3/2+8,16-2*(c*3/2),16-2*(c*3/2) Oval c+2+32+8,c+2+8,16-2*(c+2),16-2*(c+2) Next SaveImage tmp,"bullet1.bmp" End If End Function .char Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,4,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,1,2,4,4,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,1,4,4,4,4,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,1,4,4,1,4,4,4,1,2,2,1,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,1,3,3,1,1,4,1,4,3,2,2,1,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,1,2,2,2,1,4,1,1,3,2,2,1,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,1,2,2,2,1,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,1,3,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
Comments
| ||
AWESOME!!!!!!!!!! ((O)_(O)) |
| ||
I hope this helps everyone. It would be cool to hear if anyone used these jump routines. |
| ||
How did you make the player image? |
| ||
Its in the Data statement. Then look at the routine RestoreBMP. It is pretty straight forward. Well, it is to me. If you need a further explanation, let me know. |
| ||
It is very cool to be able to actually make a character image from code. Nice work! :) |
| ||
Thanks. It really isnt that hard to do so. I plan on making backup image files like that. You know just incase files are missing. I do know that happens from time to time. |
| ||
I have an update for the jumping routines. When i looked over the code it appears i didnot need a "jump" variable. i changed into this: and it works the same exact way. Talk about removing some sensless code huh? Well below is the full update. I am still keeping the original code (at the start of the archive thread) just in case if it is easier to understand. |
| ||
This is the best example of jumping code I have ever seen. Brilliant work. Keep it up. |
| ||
The basics should work for 2d jumping as well. |
Code Archives Forum