Files
dusk/assets/testscene.js
T
2026-06-07 21:27:59 -05:00

74 lines
2.1 KiB
JavaScript

// Copyright (c) 2026 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
var scene = {};
var player = require('player.js');
var assets = AssetBatch([
{ path: 'test.png', type: Asset.TYPE_TEXTURE, format: Texture.FORMAT_RGBA }
]);
// Pokemon DS-style camera: ~34 degrees elevation (atan(6/9)).
// CAM_HEIGHT / CAM_DIST ratio controls the tilt - keep it under 0.7 for
// the characteristically shallow DS angle.
const CAM_HEIGHT = 6;
const CAM_DIST = 9;
var cam, camPos;
var floorEntity;
function updateCamera() {
var pp = player.getPosition().worldPosition;
// Position is offset above and behind the player; lookAt the exact player
// world position so the player projects to the center pixel every frame.
camPos.localPosition = new Vec3(pp.x, pp.y + CAM_HEIGHT, pp.z + CAM_DIST);
camPos.lookAt(new Vec3(pp.x, pp.y, pp.z));
}
scene.init = async function() {
assets.lock();
await assets.loaded();
var texEntry = assets.entry(0);
// Camera
cam = Entity.create();
camPos = cam.add(Component.POSITION);
cam.add(Component.CAMERA);
// Floor - infinite static plane at Y=0. Rendered as a large flat blue
// slab using the default SHADER_MATERIAL (no texture needed).
floorEntity = Entity.create();
var floorPos = floorEntity.add(Component.POSITION);
var floorPhysics = floorEntity.add(Component.PHYSICS);
floorPhysics.bodyType = Physics.STATIC;
floorPhysics.shape = Physics.SHAPE_PLANE;
var floorR = floorEntity.add(Component.RENDERABLE);
floorR.color = Color.BLUE;
floorPos.localScale = new Vec3(16, 0.2, 16);
floorPos.localPosition = new Vec3(0, -0.1, 0);
// Player - spawns 1 unit above the floor so physics drops it cleanly.
player.create(texEntry);
// Initialise camera at the correct angle from the player's spawn position.
updateCamera();
};
scene.update = function() {
player.update();
updateCamera();
};
scene.dispose = function() {
player.dispose();
Entity.dispose(floorEntity);
Entity.dispose(cam);
assets.unlock();
};
module.exports = scene;