おいしいAS3 -5ページ目

XMLクラス、使えないなぁ…

SVGをXMLで読み込んで処理しようと思ったんだけど
AS3のXMLクラスは閉じタグなしのタグに対応してないのね

<rect/>とか開始タグとして扱われてしまって
あとのやつが全部ひとまとめにされる

XHTMLに準拠した表記じゃないのか

新しいFXG形式のほうはきれいに
全部閉じタグがあるXMLになってるので
こっちなら簡単に処理できそう

でもHTML5とかEPUBで注目されてるのはSVGなんだよなぁ…

簡単ColorTransform生成

放置し過ぎたけど久々更新

CalcクラスにColorTransform生成用の関数追加しました




public static function ctf(H:Number=0,S:Number=0,V:Number=100,B:Number=0,A:Number=100):Color{
var rtn:Color=new Color()
S=Math.max(Math.min(S,100),-100)/100
V=Math.max(Math.min(V,100),-100)/100
B=Math.max(Math.min(B,100),-100)/100
A=Math.max(Math.min(A,100),0)/100
var t:Number=Math.min(Math.abs(B),1)
function r(n){return Math.min(1,Math.max(0,Math.abs(Math.abs(n%360)/60-3)-1))}
rtn.redMultiplier=(1-S+r(H)*S)*V*(1-t)
rtn.greenMultiplier=(1-S+r(H-120)*S)*V*(1-t)
rtn.blueMultiplier=(1-S+r(H+120)*S)*V*(1-t)
rtn.redOffset=rtn.greenOffset=rtn.blueOffset=Math.max(0,B*255)
rtn.alphaMultiplier=A
return rtn
}





Calcクラスの中に書いてあるとして

myMC.transform.colorTransform=Calc.ctf(....)

みたいなカンジに使用

50%フェードしたい時
Calc.ctf(0,0,100,0,50)

50%明るくしたい時
Calc.ctf(0,0,100,50)

50%暗くしたい時
Calc.ctf(0,0,100,-50)
Calc.ctf(0,0,50)

ちょっと黄緑っぽくしたい時
Calc.ctf(90,50)


ColorTransform生成とかいいながら、
不必要にサブクラスのColor返してるのは気にしない

HSVBとかが引数になってるけどColorMatrixFilterみたいに
色相、彩度を調整できるわけではもちろんないです
抽出する色を指定してるカンジです

ところでColorMatrixFilterって色調補正に使用するための
補助クラスがちゃんと用意されてるんですね(→fl.motion.AdjustColor)
知らずに自分で作っちゃいましたよ

Gradientクラス

$おいしいAS3

点と点を結ぶグラデーションのマトリックスを作る
色配列とα値配列、位置配列の数をあわせる
円形グラデーションでfocalが特定の点に来るようにするとか
グラデーションを使うならそろえておきたい機能のクラスです


/*
■使い方

グラデーション描画に必要なプロパティを生成
格納するためのクラスです

■パブリックプロパティ

type
colors
alphas
ratios
box
focal

startPoint
focalPoint
endPoint

■パブリックメソッド
Gradient(タイプ、色配列、α値配列、位置配列、始点、終点、焦点)
update() colors、alphas、ratiosの配列の長さをそろえ、boxを計算し直します

linearBox(始点、終点) 始点から終点までを結ぶ線形のグラデーション用のマトリックスを生成します
radialBox(始点、終点) 始点を中心とする円形グラデーション用のマトリックスを生成します
*/

package simplizer.graphic{

import flash.geom.Matrix
import flash.geom.Point

public class Gradient {

public var type:String

public var colors:Colors
public var alphas:Numbers
public var ratios:Numbers

public var box:Matrix

public var focal:Number

public var startPoint:Point
public var focalPoint:Point
public var endPoint:Point

private var buffer:Array=[null,null,null]

public function Gradient(tp:String=null,clrs:Array=null,alps:Array=null,rats:Array=null,startPnt:Point=null,endPnt:Point=null,focalPnt:Point=null) {

clrs=clrs||[0x88FFFF,0xFF88FF,0xFFFF88]
alps=alps||[1,0]
rats=rats||[0,255]

type=tp||"linear"
colors=Colors.fromArray(clrs)
alphas=Numbers.fromArray(alps)
ratios=Numbers.fromArray(rats)
startPoint=startPnt||new Point(50,50)
endPoint=endPnt||new Point(50,100)
focalPoint=focalPnt||new Point(50,100)
buffer[0]=startPoint.clone()
buffer[1]=focalPoint.clone()
buffer[2]=endPoint.clone()
box=(type=="linear")?(linearBox(startPoint,endPoint)):(radialBox(startPoint,endPoint))
update()
}
public function update(){
if(!(colors.length==alphas.length==ratios.length)){
var len=Calc.getComMul(Calc.getComMul(colors.length-1,alphas.length-1),ratios.length-1)+1
colors=Colors.fromArray(colors).expand(len)
alphas=Numbers.fromArray(alphas).expand(len)
ratios=Numbers.fromArray(ratios).expand(len)
}
if(!(buffer[0].equals(startPoint)&&buffer[1].equals(focalPoint)&&buffer[2].equals(endPoint))){
if(type=="linear"){
box=linearBox(startPoint,endPoint)
}else{
var mtx=new Matrix()
var dst=Point.distance(startPoint,endPoint)
var drc=Math.atan2(focalPoint.y-startPoint.y,focalPoint.x-startPoint.x)
mtx.createGradientBox(dst*2,dst*2,0,-dst,-dst)
mtx.rotate(drc)
mtx.translate(startPoint.x,startPoint.y)
focal=Math.min(Math.max(Point.distance(focalPoint,startPoint)/dst,-1),1)
box=mtx
}
}
}


public static function linearBox(orgPnt:Point,endPnt:Point):Matrix{
var rtn:Matrix=new Matrix()
var vec=endPnt.subtract(orgPnt)
var dst=vec.length
var drc=Math.atan2(vec.y,vec.x)
rtn.createGradientBox(dst,dst,0,0,0)
rtn.rotate(drc)
rtn.translate(orgPnt.x,orgPnt.y)
return rtn
}
public static function radialBox(orgPnt:Point,endPnt:Point):Matrix{
var rtn:Matrix=new Matrix()
var vec=endPnt.subtract(orgPnt)
var dst=vec.length
var drc=Math.atan2(vec.y,vec.x)
rtn.createGradientBox(dst*2,dst*2,0,-dst,-dst)
rtn.rotate(drc)
rtn.translate(orgPnt.x,orgPnt.y)
return rtn
}


}

}