2021-11-19 04:13:28 +00:00
|
|
|
//go:build example
|
|
|
|
// +build example
|
|
|
|
|
|
|
|
package system
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"code.rocketnine.space/tslocum/gohan"
|
2021-11-22 02:48:54 +00:00
|
|
|
"code.rocketnine.space/tslocum/gohan/examples/twinstick/component"
|
|
|
|
"code.rocketnine.space/tslocum/gohan/examples/twinstick/entity"
|
2021-11-19 04:13:28 +00:00
|
|
|
"github.com/hajimehoshi/ebiten/v2"
|
|
|
|
)
|
|
|
|
|
|
|
|
func angle(x1, y1, x2, y2 float64) float64 {
|
|
|
|
return math.Atan2(y1-y2, x1-x2)
|
|
|
|
}
|
|
|
|
|
|
|
|
type fireInputSystem struct {
|
2022-02-03 06:27:29 +00:00
|
|
|
Position *component.Position
|
|
|
|
Weapon *component.Weapon
|
2021-11-19 04:13:28 +00:00
|
|
|
}
|
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
func NewFireInputSystem() *fireInputSystem {
|
|
|
|
return &fireInputSystem{}
|
2021-11-19 04:13:28 +00:00
|
|
|
}
|
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
func (s *fireInputSystem) fire(fireAngle float64) {
|
|
|
|
if time.Since(s.Weapon.LastFire) < s.Weapon.FireRate {
|
2021-11-19 04:13:28 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
s.Weapon.Ammo--
|
|
|
|
s.Weapon.LastFire = time.Now()
|
2021-11-19 04:13:28 +00:00
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
speedX := math.Cos(fireAngle) * -s.Weapon.BulletSpeed
|
|
|
|
speedY := math.Sin(fireAngle) * -s.Weapon.BulletSpeed
|
2021-11-19 04:13:28 +00:00
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
bullet := entity.NewBullet(s.Position.X, s.Position.Y, speedX, speedY)
|
2021-11-19 04:13:28 +00:00
|
|
|
_ = bullet
|
|
|
|
}
|
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
func (s *fireInputSystem) Update(entity gohan.Entity) error {
|
|
|
|
if s.Weapon.Ammo <= 0 {
|
2021-11-19 04:13:28 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
|
|
|
|
cursorX, cursorY := ebiten.CursorPosition()
|
2022-02-01 04:07:55 +00:00
|
|
|
fireAngle := angle(s.Position.X, s.Position.Y, float64(cursorX), float64(cursorY))
|
2021-11-22 02:48:54 +00:00
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(fireAngle)
|
2021-11-19 04:13:28 +00:00
|
|
|
}
|
|
|
|
|
2021-11-22 02:48:54 +00:00
|
|
|
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonRight) {
|
|
|
|
cursorX, cursorY := ebiten.CursorPosition()
|
2022-02-01 04:07:55 +00:00
|
|
|
fireAngle := angle(s.Position.X, s.Position.Y, float64(cursorX), float64(cursorY))
|
2021-11-22 02:48:54 +00:00
|
|
|
|
|
|
|
const div = 5
|
2022-02-01 04:07:55 +00:00
|
|
|
s.Weapon.BulletSpeed /= div
|
2021-11-22 02:48:54 +00:00
|
|
|
for i := 0.0; i < 24; i++ {
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(fireAngle + i*(math.Pi/12))
|
|
|
|
s.Weapon.LastFire = time.Time{}
|
2021-11-22 02:48:54 +00:00
|
|
|
}
|
2022-02-01 04:07:55 +00:00
|
|
|
s.Weapon.BulletSpeed *= div
|
2021-11-22 02:48:54 +00:00
|
|
|
}
|
|
|
|
|
2021-11-19 04:13:28 +00:00
|
|
|
switch {
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyLeft) && ebiten.IsKeyPressed(ebiten.KeyUp):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(math.Pi / 4)
|
2021-11-19 04:13:28 +00:00
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyLeft) && ebiten.IsKeyPressed(ebiten.KeyDown):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(-math.Pi / 4)
|
2021-11-19 04:13:28 +00:00
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyRight) && ebiten.IsKeyPressed(ebiten.KeyUp):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(math.Pi * .75)
|
2021-11-19 04:13:28 +00:00
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyRight) && ebiten.IsKeyPressed(ebiten.KeyDown):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(-math.Pi * .75)
|
2021-11-19 04:13:28 +00:00
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyLeft):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(0)
|
2021-11-19 04:13:28 +00:00
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyRight):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(math.Pi)
|
2021-11-19 04:13:28 +00:00
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyUp):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(math.Pi / 2)
|
2021-11-19 04:13:28 +00:00
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyDown):
|
2022-02-01 04:07:55 +00:00
|
|
|
s.fire(-math.Pi / 2)
|
2021-11-19 04:13:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-02-01 04:07:55 +00:00
|
|
|
func (_ *fireInputSystem) Draw(_ gohan.Entity, _ *ebiten.Image) error {
|
|
|
|
return gohan.ErrUnregister
|
2021-11-19 04:13:28 +00:00
|
|
|
}
|