83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
|
|
package grid
|
||
|
|
|
||
|
|
import (
|
||
|
|
"openquell/components"
|
||
|
|
. "openquell/config"
|
||
|
|
)
|
||
|
|
|
||
|
|
func (grid *Grid) GetSolidNeighborPosition(
|
||
|
|
position *components.Position,
|
||
|
|
velocity *components.Velocity,
|
||
|
|
solid bool) (bool, *components.Position) {
|
||
|
|
|
||
|
|
if !solid {
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// set to true, if we are already on the last tile in the current
|
||
|
|
// direction, i.e. on the edge of the grid
|
||
|
|
edge := true
|
||
|
|
neighborpos := position.Point()
|
||
|
|
|
||
|
|
switch velocity.Direction {
|
||
|
|
case East:
|
||
|
|
if neighborpos.X < grid.TilesX {
|
||
|
|
neighborpos.X++
|
||
|
|
edge = false
|
||
|
|
}
|
||
|
|
case West:
|
||
|
|
if neighborpos.X > 0 {
|
||
|
|
neighborpos.X--
|
||
|
|
edge = false
|
||
|
|
}
|
||
|
|
case South:
|
||
|
|
if neighborpos.Y < grid.TilesY {
|
||
|
|
neighborpos.Y++
|
||
|
|
edge = false
|
||
|
|
}
|
||
|
|
case North:
|
||
|
|
if neighborpos.Y > 0 {
|
||
|
|
neighborpos.Y--
|
||
|
|
edge = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
newpos := components.NewPosition(neighborpos, grid.Tilesize)
|
||
|
|
|
||
|
|
if !edge && grid.Map[neighborpos].Solid {
|
||
|
|
return true, newpos
|
||
|
|
}
|
||
|
|
|
||
|
|
return false, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (grid *Grid) BumpEdge(
|
||
|
|
pos *components.Position,
|
||
|
|
velocity *components.Velocity) (bool, *components.Position) {
|
||
|
|
|
||
|
|
x := pos.X + velocity.Data.X
|
||
|
|
y := pos.Y + velocity.Data.Y
|
||
|
|
|
||
|
|
if x < 0 || x > grid.Width-grid.Tilesize || y < 0 || y > grid.Height-grid.Tilesize {
|
||
|
|
newpos := &components.Position{}
|
||
|
|
X := pos.X
|
||
|
|
Y := pos.Y
|
||
|
|
|
||
|
|
switch velocity.Direction {
|
||
|
|
case East:
|
||
|
|
X = 0
|
||
|
|
case West:
|
||
|
|
X = grid.Width - grid.Tilesize
|
||
|
|
case South:
|
||
|
|
Y = 0
|
||
|
|
case North:
|
||
|
|
Y = grid.Height - grid.Tilesize
|
||
|
|
}
|
||
|
|
|
||
|
|
newpos.Update(X, Y, grid.Tilesize)
|
||
|
|
return true, newpos
|
||
|
|
}
|
||
|
|
|
||
|
|
return false, nil
|
||
|
|
}
|