Hi,
I decided to try and make a 2D game for a change... More likely to finish it I guess
I'm making a platformer, and it's all going well apart from the collisions. It's hard to explain, but run it and you'll see what I mean.
Shift click to make a tile unwalkable, arrow keys to move.
Executable and media attached if you cba to compile
Global Width
Global Height
Width = Desktop Width()
Height = Desktop Height()
Set Display Mode Width, Height, 32, 1
Set Window Off
Hide Mouse
Sync On
Sync Rate 60
Dim EntityMaxYSpeed(10000)
Dim EntityYSpeed(10000)
Dim EntityXSpeed(10000)
Dim EntityMaxXSpeed(10000)
Dim EntityXAcceleration(10000)
Dim EntityDynamic(10000)
Dim EntityCollision(10000)
Dim EntityGrounded(10000)
Global Gravity# = 1.5
Dim TileSprite(1000, 1000)
Dim TileCollision(1000, 1000)
If ShiftKey() = 0
TileImage = Find Free Image()
Load Image "Files\Sprites\GUI\Tile.BMP", TileImage
For X = 0 To Width / 20
For Y = 0 To Height / 20
TileSprite(X, Y) = Find Free Sprite()
Sprite TileSprite(X, Y), X * 20, Y * 20, TileImage
Set Sprite Priority TileSprite(X, Y), 1
`Offset Sprite TileSprite(X, Y), Sprite Width(TileSprite(X, Y)) / 2, Sprite Height(TileSprite(X, Y)) / 2
Next Y
Next X
MouseTileImage = Find Free Image()
Load Image "Files\Sprites\GUI\MouseTile.BMP", MouseTileImage
MouseTile = Find Free Sprite()
Sprite MouseTile, 0, 0, MouseTileImage
Set Sprite Priority MouseTile, 2
Show Mouse
Global ShowGrid = 1
Endif
PlayerImage = Find Free Image()
Load Image "Files\Sprites\Characters\Player.BMP", PlayerImage
Global Player
Player = Find Free Sprite()
Sprite Player, 100, 100, PlayerImage
EntityMaxYSpeed(Player) = 30
EntityDynamic(Player) = 1
EntityCollision(Player) = 1
EntityMaxXSpeed(Player) = 10
EntityXAcceleration(Player) = 2
Offset Sprite Player, Sprite Width(Player) / 2, Sprite Height(Player) / 2
GroundImage = Find Free Image()
Load Image "Files\Sprites\Scenery\Floor.BMP", GroundImage
Global Ground
Ground = Find Free Sprite()
Sprite Ground, 0, Height - 60, GroundImage
EntityDynamic(Ground) = 0
EntityCollision(Ground) = 1
Do
Cls
Gosub PlayerHandler
Gosub GravityHandler
Gosub DebugCode
Sync
Loop
GravityHandler:
For Entity = 1 To 10000
If Sprite Exist(Entity)
If EntityDynamic(Entity) = 1
TempAngle# = Sprite Angle(Entity)
Rotate Sprite Entity, 180
Inc EntityYSpeed(Entity), Gravity#
If EntityYSpeed(Entity) > EntityMaxYSpeed(Entity) Then EntityYSpeed(Entity) = EntityMaxYSpeed(Entity)
Move Sprite Entity, EntityYSpeed(Entity)
Rotate Sprite Entity, TempAngle#
If EntityColliding(Entity)
Rotate Sprite Entity, 0
Move Sprite Entity, EntityYSpeed(Entity)
Rotate Sprite Entity, TempAngle#
EntityYSpeed(Entity) = 0
EntityGrounded(Entity) = 1
Endif
Endif
Else
Exit
Endif
Next Entity
Return
PlayerHandler:
If UpKey() And EntityGrounded(Player) = 1
EntityYSpeed(Player) = -(Sprite Height(Player) / 4)
EntityGrounded(Player) = 0
Endif
If Rightkey()
Inc EntityXSpeed(Player), EntityXAcceleration(Player)
If EntityXSpeed(Player) > EntityMaxXSpeed(Player) Then EntityXSpeed(Player) = EntityMaxXSpeed(Player)
If EntityXSpeed(Player) < -EntityMaxXSpeed(Player) Then EntityXSpeed(Player) = -EntityMaxXSpeed(Player)
Endif
If Leftkey()
Dec EntityXSpeed(Player), EntityXAcceleration(Player)
If EntityXSpeed(Player) > EntityMaxXSpeed(Player) Then EntityXSpeed(Player) = EntityMaxXSpeed(Player)
If EntityXSpeed(Player) < -EntityMaxXSpeed(Player) Then EntityXSpeed(Player) = -EntityMaxXSpeed(Player)
Endif
If Rightkey() = 0 And Leftkey() = 0
If EntityXSpeed(Player) > 0 Then Dec EntityXSpeed(Player), EntityXAcceleration(Player)
If EntityXSpeed(Player) < 0 Then Inc EntityXSpeed(Player), EntityXAcceleration(Player)
Endif
Rotate Sprite Player, 90
Move Sprite Player, EntityXSpeed(Player)
If EntityColliding(Player)
Rotate Sprite Player, 270
Move Sprite Player, EntityXSpeed(Player)
EntityXSpeed(Player) = 0
Endif
Rotate Sprite Player, 0
Return
DebugCode:
Ink RGB(220, 220, 220), 0
Text 1, 1, "FPS: " + Str$(Screen FPS())
MouseTileX = Mousex() / 20
MouseTileY = Mousey() / 20
If ShowGrid = 1
Sprite MouseTile, MouseTileX * 20, MouseTileY * 20, MouseTileImage
For X = 0 To Width / 20
For Y = 0 To Height / 20
If TileCollision(X, Y) = 1 Then Dot (X * 20) + 10, (Y * 20) + 10
Next Y
Next X
Endif
If Shiftkey() And Mouseclick() = 1
TileCollision(MouseTileX, MouseTileY) = 1
Endif
Return
Function EntityColliding(Entity)
Colliding = 0
If Sprite Exist(Entity)
For OtherEntity = 1 To 10000
If Sprite Exist(OtherEntity)
If Sprite Collision(Entity, OtherEntity) > 0 And EntityCollision(OtherEntity) = 1 And OtherEntity <> Entity
Colliding = 1
Exit
Endif
Else
Exit
Endif
Next OtherEntity
Endif
For X = 0 To Width / 20
For Y = 0 To Height / 20
If TileCollision(X, Y) = 1
If Sprite Collision(Entity, TileSprite(X, Y)) = 1 Then Colliding = 1
Endif
Next Y
Next X
Endfunction Colliding
-Matt
Position Object Game Master1330, Object Position X(Reader), Object Position Y(Reader), Object Position Z(Reader) - 5
Hide Object Game Master1330