waves/public/assets/g/burgerandfrights/js/entities/scarecrow.class.js
2025-04-09 17:11:14 -05:00

88 lines
2.2 KiB
JavaScript

/**
* @file scarecrow.class.js
* @version 1.0.0
*/
import Entity from '../framework/entity.class.js';
import Utility from '../game/utility.class.js';
import * as THREE from '../lib/three.js/three.module.js';
export default class Scarecrow extends Entity {
static _init() {
Scarecrow._tmpV30 = new THREE.Vector3();
}
constructor(context, scene, options = Object.create(null)) {
options.updatePriority = 6;
super(context, scene, options);
const tScene = scene.getThreeScene();
const road = scene.findEntityOfType('Road');
const segment = road.getSegmentInstance('ForestField');
this._scarecrow = segment.mesh.getObjectByName('Scarecrow');
this._scarecrow.traverse(obj => {
obj.matrixAutoUpdate = true;
obj.material = Utility.replaceMaterial(obj.material);
});
this._player = scene.findEntityOfType('Player');
this._sceneName = null;
}
reset(context) {
this._sceneName = null;
this._scarecrow.rotation.set(0, -Math.PI / 2, 0);
}
update(context) {
super.update(context);
if (this._sceneName === null) {
return;
}
switch (this._sceneName) {
case 'stare_near':
this._scarecrow.lookAt(this._player.getGroup().getWorldPosition(Scarecrow._tmpV30));
break;
}
}
playScene(context, sceneName) {
this.reset(context);
this._sceneName = sceneName;
switch (sceneName) {
case 'stare_very_far':
case 'stare_far':
case 'stare_medium':
case 'stare_near':
case 'gone':
this._scarecrow.position.y = 1;
this._scarecrow.position.x =
sceneName === 'stare_very_far' ? 13
: sceneName === 'stare_far' ? 10
: sceneName === 'stare_medium' ? 8
: sceneName === 'gone' ? 50 : 7;
break;
default:
throw new Error(`Scarecrow scene "${sceneName}" does not exist`);
}
}
}
Scarecrow._init();
Scarecrow.p_register();