|
|
|
@ -18,91 +18,76 @@ func angle(x1, y1, x2, y2 float64) float64 {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type fireInputSystem struct { |
|
|
|
|
player gohan.Entity |
|
|
|
|
Position *component.PositionComponent |
|
|
|
|
Weapon *component.WeaponComponent |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewFireInputSystem(player gohan.Entity) *fireInputSystem { |
|
|
|
|
return &fireInputSystem{ |
|
|
|
|
player: player, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (_ *fireInputSystem) Needs() []gohan.ComponentID { |
|
|
|
|
return []gohan.ComponentID{ |
|
|
|
|
component.PositionComponentID, |
|
|
|
|
component.WeaponComponentID, |
|
|
|
|
} |
|
|
|
|
func NewFireInputSystem() *fireInputSystem { |
|
|
|
|
return &fireInputSystem{} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *fireInputSystem) Uses() []gohan.ComponentID { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *fireInputSystem) fire(weapon *component.WeaponComponent, position *component.PositionComponent, fireAngle float64) { |
|
|
|
|
if time.Since(weapon.LastFire) < weapon.FireRate { |
|
|
|
|
func (s *fireInputSystem) fire(fireAngle float64) { |
|
|
|
|
if time.Since(s.Weapon.LastFire) < s.Weapon.FireRate { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
weapon.Ammo-- |
|
|
|
|
weapon.LastFire = time.Now() |
|
|
|
|
s.Weapon.Ammo-- |
|
|
|
|
s.Weapon.LastFire = time.Now() |
|
|
|
|
|
|
|
|
|
speedX := math.Cos(fireAngle) * -weapon.BulletSpeed |
|
|
|
|
speedY := math.Sin(fireAngle) * -weapon.BulletSpeed |
|
|
|
|
speedX := math.Cos(fireAngle) * -s.Weapon.BulletSpeed |
|
|
|
|
speedY := math.Sin(fireAngle) * -s.Weapon.BulletSpeed |
|
|
|
|
|
|
|
|
|
bullet := entity.NewBullet(position.X, position.Y, speedX, speedY) |
|
|
|
|
bullet := entity.NewBullet(s.Position.X, s.Position.Y, speedX, speedY) |
|
|
|
|
_ = bullet |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *fireInputSystem) Update(ctx *gohan.Context) error { |
|
|
|
|
position := component.Position(ctx) |
|
|
|
|
weapon := component.Weapon(ctx) |
|
|
|
|
|
|
|
|
|
if weapon.Ammo <= 0 { |
|
|
|
|
func (s *fireInputSystem) Update(entity gohan.Entity) error { |
|
|
|
|
if s.Weapon.Ammo <= 0 { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) { |
|
|
|
|
cursorX, cursorY := ebiten.CursorPosition() |
|
|
|
|
fireAngle := angle(position.X, position.Y, float64(cursorX), float64(cursorY)) |
|
|
|
|
fireAngle := angle(s.Position.X, s.Position.Y, float64(cursorX), float64(cursorY)) |
|
|
|
|
|
|
|
|
|
s.fire(weapon, position, fireAngle) |
|
|
|
|
s.fire(fireAngle) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonRight) { |
|
|
|
|
cursorX, cursorY := ebiten.CursorPosition() |
|
|
|
|
fireAngle := angle(position.X, position.Y, float64(cursorX), float64(cursorY)) |
|
|
|
|
fireAngle := angle(s.Position.X, s.Position.Y, float64(cursorX), float64(cursorY)) |
|
|
|
|
|
|
|
|
|
const div = 5 |
|
|
|
|
weapon.BulletSpeed /= div |
|
|
|
|
s.Weapon.BulletSpeed /= div |
|
|
|
|
for i := 0.0; i < 24; i++ { |
|
|
|
|
s.fire(weapon, position, fireAngle+i*(math.Pi/12)) |
|
|
|
|
weapon.LastFire = time.Time{} |
|
|
|
|
s.fire(fireAngle + i*(math.Pi/12)) |
|
|
|
|
s.Weapon.LastFire = time.Time{} |
|
|
|
|
} |
|
|
|
|
weapon.BulletSpeed *= div |
|
|
|
|
s.Weapon.BulletSpeed *= div |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch { |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyLeft) && ebiten.IsKeyPressed(ebiten.KeyUp): |
|
|
|
|
s.fire(weapon, position, math.Pi/4) |
|
|
|
|
s.fire(math.Pi / 4) |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyLeft) && ebiten.IsKeyPressed(ebiten.KeyDown): |
|
|
|
|
s.fire(weapon, position, -math.Pi/4) |
|
|
|
|
s.fire(-math.Pi / 4) |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyRight) && ebiten.IsKeyPressed(ebiten.KeyUp): |
|
|
|
|
s.fire(weapon, position, math.Pi*.75) |
|
|
|
|
s.fire(math.Pi * .75) |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyRight) && ebiten.IsKeyPressed(ebiten.KeyDown): |
|
|
|
|
s.fire(weapon, position, -math.Pi*.75) |
|
|
|
|
s.fire(-math.Pi * .75) |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyLeft): |
|
|
|
|
s.fire(weapon, position, 0) |
|
|
|
|
s.fire(0) |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyRight): |
|
|
|
|
s.fire(weapon, position, math.Pi) |
|
|
|
|
s.fire(math.Pi) |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyUp): |
|
|
|
|
s.fire(weapon, position, math.Pi/2) |
|
|
|
|
s.fire(math.Pi / 2) |
|
|
|
|
case ebiten.IsKeyPressed(ebiten.KeyDown): |
|
|
|
|
s.fire(weapon, position, -math.Pi/2) |
|
|
|
|
s.fire(-math.Pi / 2) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (_ *fireInputSystem) Draw(_ *gohan.Context, _ *ebiten.Image) error { |
|
|
|
|
return gohan.ErrSystemWithoutDraw |
|
|
|
|
func (_ *fireInputSystem) Draw(_ gohan.Entity, _ *ebiten.Image) error { |
|
|
|
|
return gohan.ErrUnregister |
|
|
|
|
} |
|
|
|
|