jumping and collision
Blitz3D Forums/Blitz3D Programming/jumping and collision| 
 | ||
| hello.  I am trying to do jumping and collision in my little engine here.  I got the pxp scrolling and the camera.  every attempt i did for jumping gave me errors.  Not thinking i deleted the jumping stuff i did. anyways how would i go about doing the code for jumping and collision? here is the source 
;MAP ARRAY
Dim LEVELMAP(19,14)
;WINDOW RESOLUTION CONSTANTS
Const RESX=320,RESY=240,RESD=16,RESS=3
;SET GRAPHICS RESOLUTION[X,Y] COLORDEPTH[16,24,32-BIT],SCREENMODE[0=FULLSCREEN,1=WINDOW,2=SCALEDWINDOW]
Graphics RESX,RESY,RESD,RESS
;DOUBLE BUFFERING
SetBuffer BackBuffer()
;TILE GRAPHICS - SET TO BE USED THROUGHOUT THE WHOLE PROGRAM
Global TYLES
;RESTORE BUILT IN TEST MAP. WILL BE CHANGED AS TEST GROUNDS PROGRESS.
Restore BUILTINMAP
For Y=0 To 14
For X=0 To 19
Read LEVELMAP(X,Y)
Next
Next
;TILE SIZE [SQUARE=LENGTH & WIDTH ARE THE SAME]
Const TILESIZE=32
;TOTAL TILES SHOWN ON SCREEN HORIZONTAL[X] AND VERTICAL[Y]
Const MAXTILEX=160/TILESIZE
Const MAXTILEY=160/TILESIZE
;LOAD TILES
TYLES=CreateImage(32,32)
SetBuffer ImageBuffer(tyles)
Color 0,128,0
Rect 0,0,100,100
SetBuffer BackBuffer()
Global PLAYERX,PLAYERY
playerx=64
playery=96
;BEGIN LOOP
Repeat
	Cls
	UPDATESCREEN PLAYERX,PLAYERY
	Color 0,0,0
	Text 0,15, (PLAYERX-1)/32
	Text 15,0, (PLAYERY-1)/32
	Text 30,15, (PLAYERX)/32+1
	Text 15,30, (PLAYERY)/32+1
	Text 0,45,PLAYERX/32+","+PLAYERY/32
	Text 0,60,(PLAYERX+31)/32+","+(PLAYERY+31)/32
	Flip
	;LEFT
	If KeyDown(203) PLAYERX=PLAYERX-1*(PLAYERX>0)
	;RIGHT
	If KeyDown(205) PLAYERX=PLAYERX+1*(PLAYERX+32<640)
	;UP
	If KeyDown(200) PLAYERY=PLAYERY-1*(PLAYERY>0)
	;DOWN
	If KeyDown(208) PLAYERY=PLAYERY+1*(PLAYERY+32<480)
;END LOOP IF [ESC] IS PRESSED
Until KeyHit(1)
;FREE TILES FROM MEMORY
FreeImage TYLES TYLES=0
;QUIT GRAPHICS MODE
EndGraphics
;END PROGRAM
End
Function UPDATESCREEN(PROMPTX,PROMPTY)
	;CALCULATING CAMERA'S TOP-LEFT CORNER.
	CAMERAX=promptX-64
	CAMERAY=promptY-64
	;TOP LEFT CORNER
	If CAMERAX<0 Then CAMERAX=0
	If CAMERAY<0 Then CAMERAY=0
	;BOTTOM RIGHT CORNER
	If CAMERAY>15*TILESIZE-1-160 Then CAMERAY=15*TILESIZE-0-160
	If CAMERAX>20*TILESIZE-1-160 Then CAMERAX=20*TILESIZE-0-160
	;CLEAR SCREEN
	Cls
	;DRAW MAP
	For Y=CAMERAY/TILESIZE To CAMERAY/TILESIZE+MAXTILEY-(CAMERAY Mod 32=0)
		For X=CAMERAX/TILESIZE To CAMERAX/TILESIZE+MAXTILEX-(CAMERAX Mod 32=0)
			TILEINT=LEVELMAP(X,Y)-1
			If TILEINT>=0 Then DrawImage TYLES,X*32-CAMERAX+80,Y*32-CAMERAY+40,TILEINT
			;TILENUMBER (DELETE WHEN DONE)
			Color 0,128,128
			Text X*32-CAMERAX+1+80+8,Y*32-CAMERAY+1+40+10,(TILEINT+1)
		Next
	Next
	;PLAYER POSITION
	Color 0,0,255
	Rect promptX+80-CAMERAX,promptY+40-CAMERAY,32,32
	Color 0,0,0
	Text 10,10,CAMERAY+MAXTILEY*TILESIZE-(CAMERAY Mod 32=0)
	;screen boudaries.
	Color 255,255,255
	Rect 0,0,80,240
	Rect 240,0,80,240
	Rect 0,0,320,40
	Rect 0,200,320,40
End Function
;BUILTIN MAP TO BE LOADED
.BUILTINMAP
Data 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;1
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;2
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;3
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1;4
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1;5
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1;6
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1;7
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1;8
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1;9
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;0
Data 1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1;11
Data 1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1;12
Data 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1;13
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;14
    ;0 1 2 3 4 5 6 7 8 910111213141516171819
i hope someone could help me out. | 
| 
 | ||
| Well,  I here's something that doesn't work right, but may give an idea how to proceed. Note that as conceived your tunnel at x=18 will be difficult to enter, since the character has to line up perfectly in the x direction before it will allow entry. Sorry I don't have time to work on this more now... Replace the control lines with these: ;LEFT If KeyDown(203) PLAYERX=PLAYERX-1*(PLAYERX>0) If LEVELMAP(PLAYERX/32,PLAYERY/32)<>0 Then PLAYERX=PLAYERX+1*(PLAYERX>0) EndIf ;RIGHT If KeyDown(205) PLAYERX=PLAYERX+1*(PLAYERX+32<640) If LEVELMAP((PLAYERX)/32+1,PLAYERY/32)<>0 Or LEVELMAP(PLAYERX/32,PLAYERY/32+1)<>0 Or LEVELMAP(PLAYERX/32+1,PLAYERY/32+1)<> 0 Then PLAYERX=PLAYERX-1*(PLAYERX>0) EndIf ;UP If KeyDown(200) PLAYERY=PLAYERY-1*(PLAYERY>0) If LEVELMAP(PLAYERX/32,PLAYERY/32)<>0 Then PLAYERY=PLAYERY+1*(PLAYERY>0) EndIf ;DOWN If KeyDown(208) PLAYERY=PLAYERY+1*(PLAYERY+32<480) If LEVELMAP(PLAYERX/32,(PLAYERY-1)/32+1)<>0 Or LEVELMAP(PLAYERX/32+1,PLAYERY/32)<>0 Or LEVELMAP(PLAYERX/32+1,PLAYERY/32+1)<> 0 Then PLAYERY=PLAYERY-1*(PLAYERY>0) EndIf | 
| 
 | ||
| Thnx I wlll definitely give this a try. Ill see what happens and go from there. | 
| 
 | ||
| thnx for the help on collision Axel Wheeler. I used the basic code and did a few changes as well. here it is i added PLYRSPEED. and a custom size character box. Im going to attempt jumping tomorrow. | 
| 
 | ||
| Cool.  Good luck! | 
| 
 | ||
| well i did more testing with the player movement (code in previous post) when i tried using different speeds my player(box) did a stupid bouncing thing. Therefore i did some changes with the movement again. I had to do smoe changes in a few places. Just to make it simpler for when i wanted to change something.  Oh ya i forgot i managed to make it so that i could change the camerasize too. that took some tweaking too. I never really got 2 work on the jumping yet since i found the collision prob. so here is all the code (again). now the only thing i h8 is the loop for the speed outside of the movement keys. What it is now I tried it on the inside of each movement... What i tried before to fix the problem Then of course i tested it lots. and when i went down the 1 tile column, pressing down&right or starting on the right and pressing down&left, sometimes it would totally skip that column even when the players dimensions were at 32x32 when i tested it out like the code is now it seemed to work perfectly. and b4 the  For CHECKSPEED=1 To MAXSPEED stuff i did do the  playerx=playerx+plyrspeed code but then i got the array out of bounds thing there too. (especially on playerspeed=3) The reason why i am doing all these checks is that i want the movements as perfect as possible before i start on jumping. i also want to make different sizes of characters besides everything being 32x32 and lower. i'd like some to be 48x48. or even 64x64. That is also why i revised the code to let the user change the camerasize. BTW i will definitely need lots of luck doing the jumping. If anyone has any ideas of how to do it. plz let me know. or even how to cleanup the movements a bit too. I would greatly appreciate it. |