Entity Component System framework for Ebitengine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
1.4 KiB

8 months ago
//go:build example
// +build example
package system
import (
"code.rocketnine.space/tslocum/gohan"
"code.rocketnine.space/tslocum/gohan/examples/twinstick/component"
8 months ago
"github.com/hajimehoshi/ebiten/v2"
)
type MovementSystem struct {
ScreenW, ScreenH float64
Player gohan.Entity
8 months ago
}
func (_ *MovementSystem) Components() []gohan.ComponentID {
return []gohan.ComponentID{
component.PositionComponentID,
component.VelocityComponentID,
}
8 months ago
}
func (s *MovementSystem) Update(ctx *gohan.Context) error {
position := component.Position(ctx)
velocity := component.Velocity(ctx)
8 months ago
bullet := ctx.Entity != s.Player
8 months ago
// Check for collision.
if position.X+velocity.X < 16 {
if bullet {
ctx.RemoveEntity()
return nil
}
position.X = 16
velocity.X = 0
} else if position.X+velocity.X > s.ScreenW-16 {
if bullet {
ctx.RemoveEntity()
return nil
}
position.X = s.ScreenW - 16
velocity.X = 0
}
if position.Y+velocity.Y < 16 {
if bullet {
ctx.RemoveEntity()
return nil
8 months ago
}
position.Y = 16
velocity.Y = 0
} else if position.Y+velocity.Y > s.ScreenH-16 {
if bullet {
ctx.RemoveEntity()
return nil
8 months ago
}
position.Y = s.ScreenH - 16
velocity.Y = 0
8 months ago
}
position.X, position.Y = position.X+velocity.X, position.Y+velocity.Y
if !bullet {
8 months ago
velocity.X *= 0.95
velocity.Y *= 0.95
}
return nil
}
func (_ *MovementSystem) Draw(ctx *gohan.Context, _ *ebiten.Image) error {
8 months ago
return gohan.ErrSystemWithoutDraw
}