@ -18,91 +18,76 @@ func angle(x1, y1, x2, y2 float64) float64 {
@@ -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
}
w eapon. Ammo --
w eapon. LastFire = time . Now ( )
s . Weapon . Ammo --
s . Weapon . LastFire = time . Now ( )
speedX := math . Cos ( fireAngle ) * - w eapon. BulletSpeed
speedY := math . Sin ( fireAngle ) * - w eapon. BulletSpeed
speedX := math . Cos ( fireAngle ) * - s . W eapon. BulletSpeed
speedY := math . Sin ( fireAngle ) * - s . W eapon. BulletSpeed
bullet := entity . NewBullet ( p osition. X , p osition. Y , speedX , speedY )
bullet := entity . NewBullet ( s . P osition. X , s . P osition. 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 ( p osition. X , p osition. Y , float64 ( cursorX ) , float64 ( cursorY ) )
fireAngle := angle ( s . P osition. X , s . P osition. Y , float64 ( cursorX ) , float64 ( cursorY ) )
s . fire ( weapon , position , fireAngle )
s . fire ( fireAngle )
}
if ebiten . IsMouseButtonPressed ( ebiten . MouseButtonRight ) {
cursorX , cursorY := ebiten . CursorPosition ( )
fireAngle := angle ( p osition. X , p osition. Y , float64 ( cursorX ) , float64 ( cursorY ) )
fireAngle := angle ( s . P osition. X , s . P osition. Y , float64 ( cursorX ) , float64 ( cursorY ) )
const div = 5
w eapon. BulletSpeed /= div
s . W eapon. BulletSpeed /= div
for i := 0.0 ; i < 24 ; i ++ {
s . fire ( weapon , position , fireAngle + i * ( math . Pi / 12 ) )
w eapon. LastFire = time . Time { }
s . fire ( fireAngle + i * ( math . Pi / 12 ) )
s . W eapon. LastFire = time . Time { }
}
w eapon. BulletSpeed *= div
s . W eapon. 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
}