mirror of
https://iceshrimp.dev/Crimekillz/jointrashposs.git
synced 2024-11-24 09:49:06 +01:00
85 lines
2.1 KiB
TypeScript
85 lines
2.1 KiB
TypeScript
import * as THREE from 'three';
|
|
import * as Calc from './utils/calc';
|
|
import * as Ease from './utils/ease';
|
|
import { Loader } from './loader';
|
|
import { System } from './system';
|
|
|
|
export class Drop {
|
|
private loader: Loader;
|
|
private system: System;
|
|
|
|
private array: Drop[];
|
|
private group: THREE.Object3D;
|
|
private x: number;
|
|
private y: number;
|
|
private z: number;
|
|
private size: number;
|
|
private color: number;
|
|
private opacity: number;
|
|
private strength: number;
|
|
private yBase: number;
|
|
|
|
private progress: number = 0;
|
|
private rate: number = 0.01;
|
|
|
|
private geometry: System['boxGeometry'];
|
|
private material: THREE.MeshBasicMaterial;
|
|
private mesh: THREE.Mesh;
|
|
|
|
constructor(config, system) {
|
|
this.system = system;
|
|
this.loader = this.system.loader;
|
|
|
|
this.array = config.array;
|
|
this.group = config.group;
|
|
this.x = config.x;
|
|
this.y = config.y;
|
|
this.z = config.z;
|
|
this.size = config.size;
|
|
this.color = config.color;
|
|
this.opacity = config.opacity;
|
|
this.strength = config.strength;
|
|
|
|
this.yBase = config.y;
|
|
|
|
this.createMesh();
|
|
}
|
|
|
|
createMesh() {
|
|
this.geometry = this.system.boxGeometry;
|
|
|
|
this.material = new THREE.MeshBasicMaterial({
|
|
color: this.color,
|
|
transparent: true,
|
|
opacity: this.opacity,
|
|
depthTest: false,
|
|
precision: 'lowp'
|
|
});
|
|
|
|
this.mesh = new THREE.Mesh(this.geometry, this.material);
|
|
|
|
this.mesh.position.x = this.x;
|
|
this.mesh.position.y = this.y;
|
|
this.mesh.position.z = this.z;
|
|
|
|
this.mesh.scale.set(this.size, this.size, this.size);
|
|
|
|
this.group.add(this.mesh);
|
|
}
|
|
|
|
update(i) {
|
|
this.progress += this.rate * this.loader.deltaTimeNormal;
|
|
this.mesh.position.y = this.yBase - Ease.inExpo(this.progress, 0, 1, 1) * this.yBase;
|
|
this.mesh.scale.set(this.size, this.size + this.size * 16 * Ease.inExpo(this.progress, 0, 1, 1), this.size);
|
|
this.mesh.material.opacity = Ease.inExpo(this.progress, 0, 1, 1);
|
|
|
|
if(this.progress >= 1) {
|
|
this.geometry.dispose();
|
|
this.material.dispose();
|
|
this.group.remove(this.mesh);
|
|
this.array.splice(i, 1);
|
|
this.system.createRipple(this.mesh.position.x, this.mesh.position.z, this.strength);
|
|
}
|
|
}
|
|
}
|