50 lines
1.3 KiB
ActionScript 3
50 lines
1.3 KiB
ActionScript 3
// Class-based entity script: one `EntityScript` instance per entity.
|
|
// Implements Init/Update/Shutdown so the engine will instantiate it per-entity.
|
|
|
|
class EntityScript
|
|
{
|
|
float baseX;
|
|
float baseY;
|
|
float baseZ;
|
|
[group["Movement"]][desc["Phase accumulator for the sine wave"]][editable][range[0,1]]float phase;
|
|
|
|
// per-instance movement parameters (can be tuned per-entity)
|
|
[group["Movement"]][desc["Bounce height"]][editable][range[0,10]]float amplitude = 2.5f;
|
|
[group["Movement"]][desc["Cycles per second"]][editable][range[0,10]]float speed = 2.5f;
|
|
|
|
[group["State"]][desc["Debug animation state"]][editable][options[Idle,Walk,Run]] int state = 0;
|
|
|
|
EntityScript()
|
|
{
|
|
baseX = 0.0f;
|
|
baseY = 0.0f;
|
|
baseZ = 0.0f;
|
|
phase = 0.0f;
|
|
}
|
|
|
|
void Init(uint entity)
|
|
{
|
|
if (!ECS::IsValid(entity)) return;
|
|
if (!ECS::HasTransform(entity))
|
|
ECS::AddTransform(entity, 0.0f, 0.0f, 0.0f);
|
|
|
|
ECS::GetPosition(entity, baseX, baseY, baseZ);
|
|
phase = 0.0f;
|
|
}
|
|
|
|
void Update(uint entity, float dt)
|
|
{
|
|
if (!ECS::IsValid(entity)) return;
|
|
if (!ECS::HasTransform(entity)) return;
|
|
|
|
phase += dt;
|
|
float offset = Math::Sin(phase * speed + float(entity) * 0.1f) * amplitude;
|
|
ECS::SetPosition(entity, baseX, baseY + offset, baseZ);
|
|
}
|
|
|
|
void Shutdown(uint entity)
|
|
{
|
|
// nothing to clean up per-instance for this simple example
|
|
}
|
|
}
|