:::: MENU ::::

C.a.T!

CATch a TAIL!

Japanese sub culture and tech.

  • 4月 10 / 2010
  • 0
apple, flash

AppleのFlash締め出し

f:id:clover-leaf:20100410113408p:image

iPhoneアプリは、XCodeとそのサポート言語以外で開発しちゃダメというライセンス条項が突然追加された件。

締め出すということは、今までのAppleの戦略からしてそんなに不自然じゃないし、それで今成功しているのだからとやかく言える話じゃない。

ただ、タイミングとかやり方がフェアじゃない。

AdobeがiPhoneアプリのPublishをサポートすることを目玉機能として発表したのは随分前だ。

そして来週大々的にリリースされるはずだった。

なぜこのタイミングなのか。

何か、AdobeのFlashチーム、自分を含むテスター達が頑張っている姿を上から観ていて、「完成だ!祝杯をあげよう!」という声を聞いてから、「今日からうちは青汁しか出しません。」とニヤニヤしながら言われた気分だ。

またも、犠牲になるのは開発者であり、ユーザなわけだ。

Appleにとっちゃこんなことしても今さら開発者がiPhoneを無視できないの分かっているので、我々は圧倒的な力の前に泣くしかないんだけど。

  • 2月 25 / 2010
  • 0
apple, flash

Flash CS5 で作った iPhone アプリ kulock をリリースしました

f:id:clover-leaf:20100225225536p:image
もうだいぶ経ってしまったのですが、少し前に kulock という iPhone アプリをリリースしました。
うわさの Flash CS5 のベータ版で開発したものです。

NDAがあるので、どんなツールなのかなどは書けませんが、ワークフロー的には普通にAIRアプリ作るのとほとんど変わりません。
それゆえ Flash に慣れていると、Objective-C でシコシコ書くよりははるかに速く開発できます。
今回出したアプリだと数時間で開発できました。
1週間ぐらい会社でお昼休みを使って開発したので5、6時間ってとこです。
これはなかなか魅力的。

プロモ系のアプリなんかをどんどん作ったりできそうだなー、と思ってます。
それこそ月に何本もリリースすることもうまくワークフロー作ればできそうなので、ちょっとチャレンジしてみてもいいかな。

時間ができたらもう少し真面目に考えたものを開発します。
  • 5月 11 / 2009
  • 0
flash

マクロスFのシェリルのCGっぽいのをFlashで書く

f:id:clover-leaf:20090511021420j:image

こういうやつ。

ライブシーンとかでたまに出てくる映像エフェクト。

なんかカッコいいよねぇ。

これをPaperVision3Dで、基本的なところを書くとこんな感じ。

SherylEffect (要FlashPlayer10)

ソースはこんな感じ。

package {
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import org.papervision3d.core.math.NumberUV;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
[SWF(width="800", height="500",backgroundColor="0x000000")]
public class SherylEffect extends BasicView {
private static var NUM_FACES_W:uint = 10;
private static var NUM_FACES_H:uint = 10;
private var basePlane:DisplayObject3D;
private var texture:BitmapFileMaterial;
private var sizeW:Number;
private var sizeH:Number;
private var planes:Array;
public function SherylEffect() {
super(0,0,true,true,"Target");
init();
}
private function init():void {
stage.frameRate = 60;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.MEDIUM;
camera.x = 0;
camera.y = 0;
camera.z = -1200;
camera.fov = 35;
this.basePlane = new DisplayObject3D();
scene.addChild(this.basePlane);
createFaces();
startRendering();
}
override protected function onRenderTick(event:Event=null):void {
this.basePlane.yaw(1);
if (this.planes.length == NUM_FACES_W * NUM_FACES_H) {
movePlanes();
}
super.onRenderTick(event);
}
private function movePlanes():void {
for (var i:uint = 0; i < NUM_FACES_H; i++) {
for (var j:uint = 0; j < NUM_FACES_W; j++) {
var plane:Plane = this.planes[i * NUM_FACES_W + j];
plane.x = (this.sizeW + .2 * Math.abs(this.basePlane.rotationY) * j;
plane.y = (this.sizeH + .2 * Math.abs(this.basePlane.rotationY) - texture.bitmap.height / 2) * i;
}
}
}
private function createFaces():void {
this.texture = new BitmapFileMaterial("penpen.png");
texture.doubleSided = true;
this.planes = new Array();
BitmapFileMaterial.callback = onLoadTexture;
}
private function onLoadTexture():void {
this.sizeW = texture.bitmap.width / NUM_FACES_W;
this.sizeH = texture.bitmap.height / NUM_FACES_H;
for (var i:uint = 0; i < NUM_FACES_H; i++) {
for (var j:uint = 0; j < NUM_FACES_W; j++) {
var plane:Plane = new Plane(texture, this.sizeW, this.sizeH);
this.basePlane.addChild(plane);
plane.x = this.sizeW * j;
plane.y = this.sizeH * i - texture.bitmap.height / 2;
plane.z = 0;
plane.geometry.faces[0].uv = [new NumberUV(sizeW * j / texture.bitmap.width,
sizeH * i / texture.bitmap.height),
new NumberUV(sizeW * (j + 1) / texture.bitmap.width,
sizeH * i / texture.bitmap.height),
new NumberUV(sizeW * j / texture.bitmap.width,
sizeH * (i + 1) / texture.bitmap.height)];
plane.geometry.faces[1].uv = [new NumberUV(sizeW * (j + 1) / texture.bitmap.width,
sizeH * (i + 1) / texture.bitmap.height),
new NumberUV(sizeW * j / texture.bitmap.width,
sizeH * (i + 1) / texture.bitmap.height),
new NumberUV(sizeW * (j + 1) / texture.bitmap.width,
sizeH * i / texture.bitmap.height)];
this.planes.push(plane);
}
}
}
}
}

ポイントは、後半のonLoadTextureでグルグルfor分で回しているところです。

テクスチャとして使うpenpen.pngを分割して、個別のPlaneオブジェクトに貼りつけています。

plane.geometry.faces[0].uvが1枚の四角のうち左下半分を、plane.geometry.faces[1].uvが右上半分のポリゴンを表現します。

ここで指定しているNumberUVの配列は、左下半分のポリゴンが、左下, 右下, 左上、右上半分のポリゴンが、右上, 左上, 右下のポイントを指定しています。

これは、0から1までの値で表現するため、全部テクスチャのサイズで割ります。

これを分割数分ぐるぐる回して、テクスチャをざくざく分割しちゃいます。

んで、movePlanesで書いているように、フレーム毎にそれぞれのPlaneをplane.x、plane.yプロパティを調整してちょっとずつづらすと、分割したテクスチャがばらけてそれっぽいエフェクトになります。

z位置も調整するとよりそれっぽい動きになると思います。

こういう整然と動くエフェクトって単純だけど好き。

なんかカッコいいよねぇ。