1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2025-02-10 02:26:29 -05:00
OpenDiablo2/d2core/d2components/interactive.go
gravestench e6d418fdb2 Adding input system, mouse cursor scene, interactive component
* added `d2common/d2input`, copied input vector logic from hellspawner
* added an `InteractiveComponent` which contains input vector, enable
flag, and callback function
* Added an InputSystem which handles input logic and iterates over
entities with interactive components
* added a mouse cursor scene for rendering the mouse cursor
* made the trademark sprite disappear when left mouse is clicked
* various other small bugfixes in scene systems
2020-12-07 12:44:11 -08:00

52 lines
1.5 KiB
Go

package d2components
import (
"github.com/gravestench/akara"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2input"
)
// static check that Interactive implements Component
var _ akara.Component = &Interactive{}
func noop() bool {
return false
}
// Interactive is used to flag file entities with a file type
type Interactive struct {
Enabled bool
*d2input.InputVector
Callback func() (preventPropagation bool)
}
// New returns a Interactive component. By default, it contains a nil instance.
func (*Interactive) New() akara.Component {
return &Interactive{
Enabled: true,
InputVector: d2input.NewInputVector(),
Callback: noop,
}
}
// InteractiveFactory is a wrapper for the generic component factory that returns Interactive component instances.
// This can be embedded inside of a system to give them the methods for adding, retrieving, and removing a Interactive.
type InteractiveFactory struct {
Interactive *akara.ComponentFactory
}
// AddInteractive adds a Interactive component to the given entity and returns it
func (m *InteractiveFactory) AddInteractive(id akara.EID) *Interactive {
return m.Interactive.Add(id).(*Interactive)
}
// GetInteractive returns the Interactive component for the given entity, and a bool for whether or not it exists
func (m *InteractiveFactory) GetInteractive(id akara.EID) (*Interactive, bool) {
component, found := m.Interactive.Get(id)
if !found {
return nil, found
}
return component.(*Interactive), found
}