Files
CodenameEngine/source/funkin/system/XMLSprite.hx
T
2022-12-13 22:51:54 +01:00

110 lines
3.4 KiB
Haxe

package funkin.system;
import flixel.math.FlxMatrix;
import flixel.math.FlxRect;
import flixel.math.FlxPoint;
import flixel.FlxCamera;
import flixel.math.FlxMath;
import funkin.interfaces.IBeatReceiver;
import flixel.FlxSprite;
@:enum
abstract XMLAnimType(Int) {
var NONE = 0;
var BEAT = 1;
var LOOP = 2;
public static function fromString(str:String, def:XMLAnimType = NONE) {
return switch(str.trim().toLowerCase()) {
case "none": NONE;
case "beat" | "onbeat": BEAT;
case "loop": LOOP;
default: def;
}
}
}
class XMLSprite extends FlxSprite implements IBeatReceiver {
public var spriteAnimType:XMLAnimType = NONE;
public var beatAnims:Array<String> = [];
public var name:String;
public var zoomFactor:Float = 1;
public var initialZoom:Float = 1;
public override function update(elapsed:Float) {
super.update(elapsed);
}
public function beatHit(curBeat:Int) {
if (beatAnims.length > 0) {
var anim = beatAnims[FlxMath.wrap(curBeat, 0, beatAnims.length-1)];
if (anim != null && anim != "null" && anim != "none")
animation.play(anim);
}
}
public function stepHit(curBeat:Int) {}
public override function getScreenBounds(?newRect:FlxRect, ?camera:FlxCamera):FlxRect {
__doPreZoomScaleProcedure(camera);
var r = super.getScreenBounds(newRect, camera);
__doPostZoomScaleProcedure();
return r;
}
public override function drawComplex(camera:FlxCamera) {
super.drawComplex(camera);
}
public override function doAdditionalMatrixStuff(matrix:FlxMatrix, camera:FlxCamera) {
super.doAdditionalMatrixStuff(matrix, camera);
matrix.translate(-camera.width / 2, -camera.height / 2);
var requestedZoom = FlxMath.lerp(1, camera.zoom, zoomFactor);
var diff = requestedZoom / camera.zoom;
matrix.scale(diff, diff);
matrix.translate(camera.width / 2, camera.height / 2);
}
public override function getScreenPosition(?point:FlxPoint, ?Camera:FlxCamera):FlxPoint {
if (__shouldDoScaleProcedure()) {
__oldScale = FlxPoint.get(scrollFactor.x, scrollFactor.y);
var requestedZoom = FlxMath.lerp(initialZoom, camera.zoom, zoomFactor);
var diff = requestedZoom / camera.zoom;
scrollFactor.scale(1/diff);
var r = super.getScreenPosition(point, Camera);
scrollFactor.set(__oldScale.x, __oldScale.y);
__oldScale.put();
__oldScale = null;
return r;
}
return super.getScreenPosition(point, Camera);
}
// SCALING FUNCS
#if REGION
private inline function __shouldDoScaleProcedure()
return zoomFactor != 1;
var __oldScale:FlxPoint;
var __skipZoomProcedure:Bool = false;
private function __doPreZoomScaleProcedure(camera:FlxCamera) {
if (__skipZoomProcedure = !__shouldDoScaleProcedure()) return;
__oldScale = FlxPoint.get(scale.x, scale.y);
var requestedZoom = FlxMath.lerp(initialZoom, camera.zoom, zoomFactor);
var diff = requestedZoom / camera.zoom;
scale.scale(diff);
}
private function __doPostZoomScaleProcedure() {
if (__skipZoomProcedure) return;
scale.set(__oldScale.x, __oldScale.y);
__oldScale.put();
__oldScale = null;
}
#end
}