mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-26 09:49:07 -07:00
more versions added
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package com.alternativagame.engine3d.material {
|
||||
import com.alternativagame.engine3d.Math3D;
|
||||
import com.alternativagame.type.RGB;
|
||||
|
||||
import flash.display.BitmapData;
|
||||
import flash.geom.Point;
|
||||
|
||||
public class SpriteMaterial extends ObjectMaterial {
|
||||
|
||||
// Массив фаз
|
||||
private var states:Array = new Array();
|
||||
|
||||
// Сглаженность
|
||||
public var smoothing:Boolean;
|
||||
|
||||
// Цвет самосвечения материала
|
||||
public var selfIllumination:RGB = new RGB();
|
||||
|
||||
// Флаги искажения спрайта
|
||||
public var scale:Boolean;
|
||||
public var rotate:Boolean;
|
||||
|
||||
public function SpriteMaterial(smoothing:Boolean = false, scale:Boolean = false, rotate:Boolean = false) {
|
||||
this.smoothing = smoothing;
|
||||
this.scale = scale;
|
||||
this.rotate = rotate;
|
||||
}
|
||||
|
||||
public function setPhase(bitmapData:BitmapData, pivot:Point = null, state:String = "default", pitch:Number = 0, yaw:Number = 0):void {
|
||||
|
||||
// Добавляем состояние, если надо
|
||||
if (states[state] == undefined) {
|
||||
states[state] = new Array();
|
||||
}
|
||||
|
||||
states[state].push(new SpritePhase(bitmapData, pivot, pitch, yaw));
|
||||
}
|
||||
|
||||
// Возвращает фазу
|
||||
public function getPhase(state:String = "default", pitch:Number = 0, yaw:Number = 0):SpritePhase {
|
||||
var res:SpritePhase = null;
|
||||
|
||||
// Проверка на наличие состояние
|
||||
if (states[state] != undefined) {
|
||||
var phases:Array = states[state];
|
||||
var num:uint = phases.length;
|
||||
|
||||
var i:uint;
|
||||
var phase:SpritePhase;
|
||||
var resPitch:Number;
|
||||
var currentDiff:Number;
|
||||
|
||||
// Находим ближайший pitch
|
||||
var minDiff:Number = Number.MAX_VALUE;
|
||||
for (i = 0; i < num; i++) {
|
||||
phase = phases[i];
|
||||
currentDiff = Math.abs(phase.pitch - pitch);
|
||||
if (currentDiff < minDiff) {
|
||||
minDiff = currentDiff;
|
||||
resPitch = phase.pitch;
|
||||
}
|
||||
}
|
||||
|
||||
// Находим ближайший yaw и сохраняем результат
|
||||
minDiff = Number.MAX_VALUE;
|
||||
for (i = 0; i < num; i++) {
|
||||
phase = phases[i];
|
||||
if (phase.pitch == resPitch) {
|
||||
currentDiff = Math.abs(Math3D.deltaAngle(phase.yaw, yaw));
|
||||
if (currentDiff < minDiff) {
|
||||
minDiff = currentDiff;
|
||||
res = phase;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клон
|
||||
override public function clone():Material {
|
||||
var res:SpriteMaterial = new SpriteMaterial();
|
||||
cloneParams(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
// Клонировать параметры
|
||||
override protected function cloneParams(material:*):void {
|
||||
var mat:SpriteMaterial = SpriteMaterial(material);
|
||||
super.cloneParams(mat);
|
||||
mat.smoothing = smoothing;
|
||||
mat.selfIllumination = selfIllumination.clone();
|
||||
mat.scale = scale;
|
||||
mat.rotate = rotate;
|
||||
for (var state:String in states) {
|
||||
for (var i:uint = 0; i < states[state].length; i++) {
|
||||
var phase:SpritePhase = states[state][i];
|
||||
mat.setPhase(phase.bitmapData, phase.pivot.clone(), state, phase.pitch, phase.yaw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user