111 lines
3.1 KiB
Go
111 lines
3.1 KiB
Go
package game
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"gitea.boner.be/bdnugget/goonscape/game/mock"
|
|
"gitea.boner.be/bdnugget/goonscape/types"
|
|
rl "github.com/gen2brain/raylib-go/raylib"
|
|
)
|
|
|
|
// InputHandler abstracts raylib input functions for testing
|
|
type InputHandler interface {
|
|
IsKeyPressed(key int32) bool
|
|
IsKeyDown(key int32) bool
|
|
IsMouseButtonPressed(button int32) bool
|
|
GetMousePosition() rl.Vector2
|
|
GetMouseRay(mousePos rl.Vector2, camera rl.Camera3D) rl.Ray
|
|
GetMouseWheelMove() float32
|
|
GetCharPressed() rune
|
|
}
|
|
|
|
// RaylibInput implements InputHandler using actual raylib functions
|
|
type RaylibInput struct{}
|
|
|
|
func (r *RaylibInput) IsKeyPressed(key int32) bool { return rl.IsKeyPressed(key) }
|
|
func (r *RaylibInput) IsKeyDown(key int32) bool { return rl.IsKeyDown(key) }
|
|
func (r *RaylibInput) IsMouseButtonPressed(button int32) bool {
|
|
return rl.IsMouseButtonPressed(rl.MouseButton(button))
|
|
}
|
|
func (r *RaylibInput) GetMousePosition() rl.Vector2 { return rl.GetMousePosition() }
|
|
func (r *RaylibInput) GetMouseRay(mousePos rl.Vector2, camera rl.Camera3D) rl.Ray {
|
|
return rl.GetMouseRay(mousePos, camera)
|
|
}
|
|
func (r *RaylibInput) GetMouseWheelMove() float32 { return rl.GetMouseWheelMove() }
|
|
func (r *RaylibInput) GetCharPressed() rune { return rl.GetCharPressed() }
|
|
|
|
// MockInput implements InputHandler using our mock functions
|
|
type MockInput struct{}
|
|
|
|
func (m *MockInput) IsKeyPressed(key int32) bool {
|
|
if mock.IsKeyPressed == nil {
|
|
return false
|
|
}
|
|
return mock.IsKeyPressed(key)
|
|
}
|
|
|
|
func (m *MockInput) IsKeyDown(key int32) bool {
|
|
if mock.IsKeyDown == nil {
|
|
return false
|
|
}
|
|
return mock.IsKeyDown(key)
|
|
}
|
|
|
|
func (m *MockInput) IsMouseButtonPressed(button int32) bool {
|
|
if mock.IsMouseButtonPressed == nil {
|
|
return false
|
|
}
|
|
return mock.IsMouseButtonPressed(button)
|
|
}
|
|
|
|
func (m *MockInput) GetMousePosition() rl.Vector2 {
|
|
if mock.GetMousePosition == nil {
|
|
return rl.Vector2{}
|
|
}
|
|
return mock.GetMousePosition()
|
|
}
|
|
|
|
func (m *MockInput) GetMouseRay(mousePos rl.Vector2, camera rl.Camera3D) rl.Ray {
|
|
if mock.GetMouseRay == nil {
|
|
return rl.Ray{}
|
|
}
|
|
return mock.GetMouseRay(mousePos, camera)
|
|
}
|
|
|
|
func (m *MockInput) GetMouseWheelMove() float32 {
|
|
if mock.GetMouseWheelMove == nil {
|
|
return 0
|
|
}
|
|
return mock.GetMouseWheelMove()
|
|
}
|
|
|
|
func (m *MockInput) GetCharPressed() rune {
|
|
if mock.GetCharPressed == nil {
|
|
return 0
|
|
}
|
|
return mock.GetCharPressed()
|
|
}
|
|
|
|
func (g *Game) GetTileAtMouse() (types.Tile, bool) {
|
|
if !g.input.IsMouseButtonPressed(toInt32(rl.MouseLeftButton)) {
|
|
return types.Tile{}, false
|
|
}
|
|
mouse := g.input.GetMousePosition()
|
|
ray := g.input.GetMouseRay(mouse, g.Camera)
|
|
|
|
for x := 0; x < types.MapWidth; x++ {
|
|
for y := 0; y < types.MapHeight; y++ {
|
|
tile := GetTile(x, y)
|
|
tilePos := rl.NewVector3(float32(x*types.TileSize), tile.Height*types.TileHeight, float32(y*types.TileSize))
|
|
boxMin := rl.Vector3Subtract(tilePos, rl.NewVector3(types.TileSize/2, types.TileHeight/2, types.TileSize/2))
|
|
boxMax := rl.Vector3Add(tilePos, rl.NewVector3(types.TileSize/2, types.TileHeight/2, types.TileSize/2))
|
|
|
|
if RayIntersectsBox(ray, boxMin, boxMax) {
|
|
fmt.Printf("Clicked: %d, %d\n", tile.X, tile.Y)
|
|
return tile, true
|
|
}
|
|
}
|
|
}
|
|
return types.Tile{}, false
|
|
}
|