Parameritized projectile parabola

This commit is contained in:
Ian Gulliver
2021-05-11 06:04:41 +00:00
parent 42babc7dbd
commit 49e6a73c13
8 changed files with 41 additions and 62 deletions

View File

@@ -5,14 +5,24 @@ import { TileFactory } from './tile_factory.js';
export class ProjectileTileFactory extends TileFactory {
source_tile_factory: AnimatableTileFactory;
target_relative_x: number;
target_relative_y: number;
spin: number;
speed: number;
tile_factory: TileFactory;
constructor(tile_factory: AnimatableTileFactory) {
constructor(tile_factory: AnimatableTileFactory, target_relative_x: number, target_relative_y: number, spin: number, speed: number) {
super(tile_factory.layer_name, tile_factory.width, tile_factory.height);
this.source_tile_factory = tile_factory;
this.target_relative_x = target_relative_x;
this.target_relative_y = target_relative_y;
this.spin = spin;
this.speed = speed;
const copy = tile_factory.copy();
const distance = Math.sqrt(target_relative_x ** 2 + target_relative_y ** 2);
copy.add_animation(
'launch-x',
@@ -25,12 +35,12 @@ export class ProjectileTileFactory extends TileFactory {
},
{
'offset': 1.0,
'left': '1000%',
'transform': 'rotate(720deg)',
'left': `${target_relative_x / tile_factory.width * 100}%`,
'transform': `rotate(${Math.sign(target_relative_x) * distance * spin * 10}deg)`,
},
],
{
'duration': 1500,
'duration': distance * (1 / speed) * 100,
'iterations': 1,
},
);
@@ -46,15 +56,15 @@ export class ProjectileTileFactory extends TileFactory {
{
'offset': 0.50,
'easing': 'cubic-bezier(0.33, 0.00, 0.66, 0.33)',
'top': '-500%',
'top': `-500%`,
},
{
'offset': 1.0,
'top': '0',
'top': `${target_relative_y / tile_factory.height * 100}%`,
},
],
{
'duration': 1500,
'duration': distance * (1 / speed) * 100,
'iterations': 1,
},
);
@@ -70,6 +80,12 @@ export class ProjectileTileFactory extends TileFactory {
}
copy(): ProjectileTileFactory {
return new ProjectileTileFactory(this.source_tile_factory);
return new ProjectileTileFactory(
this.source_tile_factory,
this.target_relative_x,
this.target_relative_y,
this.spin,
this.speed,
);
}
}