Simple little Rectangle movement?

Blitz3D Forums/Blitz3D Beginners Area/Simple little Rectangle movement?

Apollonius(Posted 2003) [#1]
While Not KeyHit(1)

TileImage(Grass)
; Square Char
Rect Rx, Ry, 50, 50, False
;UP
If KeyHit(17) Then
Rx = Rx - 3
EndIf
;Down
If KeyHit(31) Then
Rx = Rx + 3
EndIf
;left
If KeyHit(30) Then
Ry = Ry - 3
EndIf
;right
If KeyHit(32) Then
Ry = Ry + 3
EndIf

Flip:Cls

Wend
End


I tryed to make the rect move but it wont budge..


WolRon(Posted 2003) [#2]
Are you drawing to the backbuffer? What's the current drawing color?

With keyhit, you must press the key multiple times to get it to move multiple distances.


Apollonius(Posted 2003) [#3]
the usual white? I guess, I press the key multiple time still doesnt move at all


CGV(Posted 2003) [#4]
I tried your code and it worked fine except the keys are a bit confused.

You're using the W key to move left,
the S key to move right,
the A key to move up and,
the D key to move down.

Are these the keys you meant to assign to those directions?


Apollonius(Posted 2003) [#5]
No :O
W = up
S = Down
A = Left
D = Right

I started the program before fixing the key and they worked!!!! but now it doesnt work when i fixed the key... theres something wrong..


Apollonius(Posted 2003) [#6]
Seems to work now :o

fun, my first game lol!
I call it FLY THE CUBE!!
While Not KeyHit(1)

TileImage(Grass)
; Square Char
Color 255,255,255
Rect Rx, Ry, 50, 50, False
Color 0,0,0
Rect Rx+1, Ry+1, 50-2, 50-2, True
;UP
If KeyDown(17) Then ; W
Ry = Ry - 3
EndIf
;Down
If KeyDown(31) Then ; S
Ry = Ry + 3
EndIf
;left
If KeyDown(30) Then ; A
Rx = Rx - 3
EndIf
;right
If KeyDown(32) Then ; D
Rx = Rx + 3
EndIf

Flip:Cls

Wend
End



Paradox7(Posted 2003) [#7]
I hold the Copywright to "FLY THE CUBE"!!! you stole my game! and patented secret source code ;P


Apollonius(Posted 2003) [#8]
LOL!


GameCoder(Posted 2003) [#9]
Hey Kaisuo, This was posted on BlitzCoder.com by Nebula. Its a wonderfully commented, simple to understand tutorial on how to make a basic basic platformer. Its invaluable to noobs.

; (Coded by Nebula)
; (date :  02-2001)(update : 04-2001)
; (Commented in 12-2003)
; Visit <A HREF="http://www.geocities.com\nebula_rve" TARGET=_blank>www.geocities.com\nebula_rve</A> for more examples
; Visit <A HREF="http://hardcorecoder.com" TARGET=_blank>http://hardcorecoder.com</A> for DaCodez
;
;


Function Introduction()
;
; Small Platform Example - Re-documented in 2003
;
;
;
;
;
End Function

Graphics 640,480
SetBuffer BackBuffer()

;
; Load 2 images. One being the 'dude' that will be controlled by the player. The other 'tile'
; will be used to draw the game playing field.
;
Global dude = CreateImage(32,32);LoadImage("dude.bmp")
Global tile = CreateImage(32,32);LoadImage("tile.bmp")
;
SetBuffer ImageBuffer(dude)
ClsColor 255,255,255
Cls
SetBuffer ImageBuffer(tile)
ClsColor 100,100,100
Cls
SetBuffer BackBuffer()
ClsColor 0,0,0

;
; Create two arrays that are required to display the map. The 'map' array will hold each tile that is drawn/displayed
; on the screen.
 ;The map1$ array hold the level information. This array is a string because the levels are stored inside this
 ; sourcecode as text. Using text means more then 10 characters can be used to build the screen.
Dim map(19,14)
Dim map1$(14)

;
; Here the regular global game values are set up. Being global means these variables can be accesed from
; anywhere inside the program.
; dudex = holds the character x position. The x position is the most left position of the sprite/image.
; dude7 = holds the character y position. This means the most top position of the sprite.
; Jump = holds TRue when the player jumped and holds false when not or when landed.
; jumptimer# = a float value that is used to time/adjust the speed at which the jumping and
; 						falling happens.
;
Global dudex
Global dudey
Global jump
Global jumptimer#

; Start location - The player will begin at this position when the game starts.
dudex = 200
dudey = 320

;
; Here the level is set up. Each array string hold a number of lines.
; With the 1 value we will tell the program that there is a wall/floor there
; and with 0 we tell that there is nothing there that should be drawn.
;
 map1$(0) = "1111111111111111111"
 map1$(1) = "1000000000000000001"
 map1$(2) = "1000000000000000001"
 map1$(3) = "1000001111111111001"
 map1$(4) = "1000000000000000001"
 map1$(5) = "1111110000000000001"
 map1$(6) = "1000000000000000001"
 map1$(7) = "1111111100000000001"
 map1$(8) = "1000000000000000001"
 map1$(9) = "1000000011111111111"
map1$(10) = "1000000000000000001"
map1$(11) = "1111111000000000001"
map1$(12) = "1000000000000000001"
map1$(13) = "1000000001111111111"
map1$(14) = "1111111111111111111"

;
; Using strings inside game loops for quickly reading information is not the fastest method.
; By converting these values into integers they will become much faster.
; Blitz automatically converts string integers into integers. Using other strings than numbers
; requires special code.
;
;
;
For y=0 To 14 ; 14 = the number of vertical tiles that can fit in the screenmode.  The map array is based on this.
	For x=0 To 19 ; 19 is the number of horizontal tiles that can fit in the screenmode.
		n = Mid(map1$(y),x+1,1)
		map(x,y)=Int(n)
	Next
Next

;
; This is the game loop. It exits when the escape key is pressed (keydown(1) = true)
;
While KeyDown(1) = False 
	Cls
	drawmap() ; draw the graphics
	movedude(); read the players movement
	checkjump() ; update the code that controls the jump
	drawsprite() ; draw the player
	Flip
Wend

End

Function movedude()
	;
	; This function contains all code to move the player inside the game level.
	;
	;

	;
	; Keydown 203 tells the left cursor key is pressed. When it is pressed a local variable is initiated that will tell
	; the code below that the key is pressed. Same goes with the 205 keycode which is the right cursor key.
	;
	If KeyDown(203)=True Then moveleft=True
	If KeyDown(205)=True Then moveright=True
	
	; border checking
	;
	; The width of a tile in this example is 32 pixels. This means our player which x position is the most left
	; position of the player graphic would touch a wall when he is on the screen position of 32. Going below
	; this position would mean he is inside a wall. This is why we will not allow him to go below 32.
	; By resetting the previously set value we ensure he will not go thru a wall.
	;
	; The right side position of the screen is the number of tiles that can fit in the graphicsmode. Seeing this
	; can be calculated by dividing the screenwidth and the tilewidth we know it is 20 tiles. Blitz however
	; also uses Zero as a number so this means we should substract 1 from the actual number a calculator would give.
	; When knowing the player width is also 32 and his draw coordinates are from the most left this means we should
	; substract another 1 to get the correct position. This example leaves one 32 pixel space open to the right which
	; means another substraction. This space could be used for game info ect.
	; 17*32 will return the location of the outer wall of this map.
	;
	If dudex<32 Then moveleft=False
	If dudex>(17*32) Then moveright=False
	
	; movement x with or without jumping
	;
	; In this example we can jump thru platforms above the player. This is done by checking for collisions when
	; the player is NOT jumping. This way he can move to the left and right and thru objects while going up.
	; When he is not jumping the collision is checked and will the land on the first tile below him.
	; The actual falling back on a tile is done in the jump function.
	; The collision works by checking the array using the player coordinates. By dividing these with the
	; width and height of a tile the array position gets returned. The array holds 1 for a tile. So by
	; checking this value and not seing it we allow the player to move around.
	;
	; No gravity means checking collision. And Gravity means freedom in horizontal movement.
	;
	;
	If jump=False Then
		If Not map(dudex/32,dudey/32)=1 Then
			If moveleft=True Then dudex=dudex-4
		End If
		If Not map((dudex+32)/32,dudey/32) = 1 Then
			If moveright=True Then dudex=dudex+4
		End If
	Else
		If moveleft=True Then dudex=dudex-3
		If moveright=True Then dudex=dudex+3
	EndIf	
End Function

Function checkjump()
	; The keydown 57 signals the space key is being pressed. When this happens
	; the code then checks to see if no jump is actually in progress. If it is and it is not
	; check then the player would keep moving up until he is out of the screen and this
	; will cause the compiler to return a error(array out of bounds).
	; When the player is not jumping the jump variable is set to TRUE and the jumptimer(or height)
	; is set to its value. 
	;
	If KeyDown(57)=True 
		If jump=False 
			jump=True 
			jumptimer=8
		End If
	End If

	;
	; While the character is in a jump a number of things should happen. Gravity has the effect
	; that once you take off the ground the speed at which you travel decreases until it becomes
	; negative(falling down). This happens slowly but incremental (ea speed+1 until 0 and speed-1 until ground)
	; The code below uses a float value. Floats are integers divided into integers. The amount of integers in a float
	; can be very high or low just like regular numbers. The jumptimer with which the jump is measured uses
	; a value of .33. Which is 1/3 of the number 1.
	; Above the jumpforce is set to 8. The speed starts at 8 pixels going up every cycle and decreases by
	; .33 every cycle until it becomes negative and means the player wil start to move down. This also happens
	; with .33 per cycle and thus emulates gravity. ea The player will stop for a while in the air and slowly start
	; to fall down;
	; Once a tile below the player is found (player coordinates divided by the tileheight and one extra to compensate
	; for the height of the player) the gravity is disabled.
	; Because the player is falling down using large chunks he would end up inside a tile. This is why once a collision
	; happens the coordinates are 'RESET'' to the tile that it collides with. This will ensure no errors happen.
	; Do remember that once the speed of the falling gets above the tileheight he will fall thru no matter what. This
	; can be avoided by limiting the falling speed to a maximum. Like 8 for instance.
	;

	;
	; Here we go up
	;
	;
	; If we are in the progress of a jump
	If jump=True Then
		; decrease the jumptimer
		jumptimer=jumptimer-0.33
		; move the y axis of the dude
		dudey=dudey-jumptimer
		; if the jumptimer is below zero
		If jumptimer=<0 Then 
			; If we are on a floor
			If map((dudex+16)/32,(dudey+32)/32) = 1 Then
				; stopp falling
				jump=False
				; Align the player with the floor
				tempy = dudey/32
				dudey = tempy*32
			End If
		End If			
	End If

	;
	; To ensure the player fall down from platforms a extra piece of code is required. By checking collision
	; with tiles every cycle and setting the jump value to true when no collision is happening the player will
	; start to fall. The falling can be done by puttin the jumptimer to ZERO. This means in stead of going up
	; when it is 8 he wil go up by ZERO And Then decrease down Until a collision happens(Floor).
	;
	; The jump flag is false so the player is on a tile.
	; If No collision 
	; Fall down.
	;
	If jump=False Then
		If Not map((dudex+16)/32,(dudey+32)/32) = 1 Then
			jump=True : jumptimer=0
		End If
	End If
	
	; don't allow the dude To get stuck in the ceiling
	;
	; The top of the player is the y coordinate of the player. This because of the way blitz draws its
	; default sprites. By checking if the player y coordinate is less then zero it can be seen when
	; the player is about to leave the visible screen. By resetting this value to in this case 5 he will never
	; be able to leave the screen. The jump variable will also be SET to ensure the player will start to fall
	; down. This again by setting the fallingtimer(or gravity) to ZERO.
	;
	If dudey < 0 Then
		dudey = 5
		jump=True : jumptimer=0
	EndIf
	
End Function

Function drawsprite()
	;
	; The regular draw command.
	;
	DrawImage dude,dudex,dudey
End Function

Function drawmap()
;
; This routine draw the entire visible playing map. The width and height
; of the graphicsscreen are known and the width and height of the tiles are.
; Then by using a nested loop and checking when the map array contains a tile (1)
; the program draws it. The location of the tile can be calculated by taking the
; width or height and multiplying it with the nested loop value.
;
;
	For y=0 To 14
		For x=0 To 19
			If map(x,y)=1 Then
				DrawImage tile,x*32,y*32
			End If
		Next
	Next
End Function




Apollonius(Posted 2003) [#10]
Thanks just learned Image Buffer lol how to use them anyway :)