Flex ActionScript 関連覚書などなど

8月7日、アップルストア一番町店にて開催された、仙台WEBクリエータ勉強会「dachas011」で発表をしてきました。
今回dachas011のテーマは、「仙台ムーブメントNOW」ということで仙台で活動している勉強会の一つとしてSendai.asを取り上げていただきました。

最近はAppleとAdobeでもにょもにょしているので、アップルストアでFlashの勉強会の話をするなんてアウェイ過ぎると思いましたが、いざ行ってみると暖かく迎えてもらえて本当に良かったです。

Sendai.asの紹介してきましたが、大事な事は、
「Sendai.as」なんて名前だけど、仙台以外の人にもぜひ来てもらいたいよ、ということ。そもそも僕は仙台に住んでないですし。
それから「Sendai.as」なんて名前だけど、ActionScriptだけじゃなく普通にFlashという範囲で活動しているよ、ということ。「Sendai.js」とかあるし、あんまり深く考えないで名づけちゃったけど、別にプログラマだけで集まろうということではないので。

あとは、勉強会といっても、何人かの発表があって、「おー」とか「わー」とか言いながらそれを見て、モチベーションあがって帰路につければそれでよし、くらいの感覚なので、軽い気持ちで参加してください。ということ。

僕以外の発表の方々の内容も、相当興味深いものだらけでした。
仙台にも勉強会や面白そうな活動がたくさんありますね。

先週の8月6日、Sendai.as#02を開催しました。
発表者の方々、参加してくれた方々お疲れ様でした。
それから東北工業大学の皆様、多数の発表から会場まで諸々ありがとうございました。

今回は会場に東北工業大学のご協力いただき、また多数の学生発表者にも参加いただきました。学生の方々に関しては、研究発表とは少し雰囲気も違ったので緊張されてしまったかもしれませんが、もっとゆるい気持ちで望んでもらえるようこれからもっとがんばりたいと思います。

新しいもの、面白いもの、きっと東北にはまだまだたくさんあると思いますので、また次回開催の際には、ぜひ皆さんご参加ください。
発表してみたいという方、随時募集中ですのでぜひご連絡を。
発表だけでなく、こんなの取り上げて欲しいとか、何かあればとりあえずはご連絡を。

今回のSendai.asについて詳細は以下です。
続きを読む

タイトルのとおりですが、Sendai.as#02開催します。

前回のブログ記事「居酒屋プレゼン大会 2010 Springに出席」から数ヶ月。
アレヨアレヨと事は進み、5月末にSendai.as#01として勉強会をスタートしました。
今月7月頭には、FlexUserGroup全国ツアーin仙台でも発表をして来ました。

そして来月の頭、2010年8月6日にSendai.as#02として、第二回目の勉強会を開催します。
様々な方々のご協力をいただきつつ、会場として東北工業大学長町キャンバスの一室を使わせていただくことになりました。社会人の方も学生の方も、奮ってご参加ください!
内容はまだ調整中ですが、Adobeの轟さん、FlexUserGroup仙台の取りまとめをされている野呂さん、そして会場となっている東北工業大学の学生さんなど、バラエティあふれる発表になる予定です。
詳細と参加受付はこちら(Sendai.as)でお願いします。

このブログでは第一回目の話も何も書いていないので、Sendai.asの趣旨と目標など(今更ながら)少しだけ説明します。

Sendai.asは仙台のActionScript勉強会という意味です。
まず「仙台」とありますが、これは東北の中でも一番人の集まりそうな場所ということでSendaiと名づけました。仙台の人限定ということではありませんので。山形や福島などなど仙台へ出られる方なら誰にでも参加してもらいたいと思っています。
ちなみに次回8月6日は、仙台七夕まつりです。
お祭りを見てからSendai.asに来てみても良いんじゃないでしょうか?>遠方の方

次に「as」とありますが、ActionScriptに限定しているわけではありません。
プログラムの話も、Flash系のデザインの話も、プログラムとデザインの協業の話でも、基本的には何でもアリです。とりあえず何か発表できそうなネタのある方、ぜひご連絡ください。何か聞きたいネタのある方ご連絡ください。Flash/Flex/ActionScript/AIRなどなど、何かしら興味のある方はぜひご参加ください。

それから勉強会というとお堅い感じがするかもしれませんが、実際あまり堅い物では無いと思います。
技術的な話、仕事/業務的な話もあると思いますが、その場で学んで理解して・・・なんてことはまずできません。こんなこともできるのか、とかあんなことをしてる人がいるのか、とか、参加してモチベーションが上がればそれで良しと思っています。
それから、同じ業種だったり同じことに興味を持つ人達で繋がりを持ったり、懇親会したりとか。
また、仕事だとなかなか難しいアソビゴコロを出す場としても活用してもらいたいと思います。

まだ第二回目ですし、あまり細かいことは定まっていませんが、ある程度定期的に開いていければと思っています。まずは次回Sendai.as#02です。ご都合よろしければご参加ください。

なんと、二年ぶりの更新。
ご無沙汰してます。

一度書かなくなると、こうも書かずに期間が空いてしまうとは恐ろしいことです。

先週末のことですが、居酒屋プレゼン大会 2010 Springに出席してきました。
今回は自分も発表をしたので、これは良い機会。ブログに書いてみようと思い立ったわけです。

「居酒屋プレゼン大会 2010 Spring」は東北デベロッパーズコミュニティさん主催の飲み会です。
飲み会ですが参加者は思いの丈を発表することができるという優れものです。
しかも発表内容は基本自由という太っ腹です。

で、そんな懐の深いイベントで、
「Sendai.asをやりませんか?」というタイトルで発表してきました。
東京から宮城へ移って早1年。
思い返せば、東京にはFlash/ActionScript系の勉強会がたくさんありました。
宮城にだって有っても良いんじゃないですか?、と。

とは言え、近くにそういうFlash仲間もいないので完全手探りで口火を切ってきました。
いかがですか?ActionScriptもやるよ、というプログラマの方。
いかがですか?Flashも絡むよ、というデザイナの方。

それから、やったことは無いけどFlashに興味はあるよ、という方。
やってみませんか?

それに、やったことも無いしFlashに興味も無いよ、という方。
やってみたら楽しいかもしれませんよ?

とりあえず、一人ぼっちでさえなければやりたいと思っています。
やりたいとかやりたくないとか何かあればとりあえずご連絡ください。

ご意見などはこのブログのコメント欄や僕宛でメールをもらえたら嬉しいです。
もしくはツイッター「jintenken」へ。

追記4/28(ツイッターのアカウントは 「jinten_ken」 でした・・・)

ツイッターのアカウントはついさっき登録しました。
使い方がまだわからないので、とりあえず「なう」ってつぶやきました。

メモリリークをデバッグ(1)の続き。

実際にInstanceWatcherクラスを使ってみます。
ソースのオリジナルは、l4lさんの記事から。
続きを読む

あー、ずいぶん期間を空けてしまった。一度書くのをサボると、そのうち忘れていくんだよな~・・・。

l4lさんの記事などでも取り上げられてるんですが、
メモリやガベージコレクションの動きを監視したい!というような話です。

実行中のある瞬間に、いったいいくつのインスタンスが存在しているのかを確認しながら、
メモリリークを防ぎたい。と、多くの人が思っているはずです。多分。

で、上のl4lさんの記事やその大元のfladdictさんの記事の考えを元に、
こんなクラスを作って見ました。

続きを読む

最近は3dとか物理エンジンとか、グラフィックっぽいことばかりだったので、
少し違うことを。

JavaScript で形態素解析もどき
このあたりを参考に形態素解析もどきで遊んでみます。
続きを読む

前回記事 初めてのFOAMの続きです。

今回は多角形の表示をします。
FOAMの基本的な使い方は前回の記事を参考にしてください。

var rigid:RigidBody = new RigidBody([X位置], [Y位置], [サイズ], [頂点の座標配列]);
foam.addElement(rigid);

これが多角形を表示するコードです。
メソッドの引数はほかにもあるのでいろいろ調節はできるようですが、
まだ調査不足のためそのあたりはいずれ・・・。

今回のサンプルでのコードとしてはこのように書いています。

// 座標をランダムに決定。0-300で。(今回はswfのサイズが300×300なので)
var rnd_x:Number = Math.random() * 300;
var rnd_y:Number = Math.random() * 300;
// 多角形のサイズをランダムに決定。20-60。この数値は適当。
var rnd_size:Number = 20 + Math.random() * 40;
// 頂点数をランダムに決定。2-9。頂点数2なら直線、3なら三角形に。
var rnd_num_vertices:Number = 1 + Math.ceil(Math.random() * 8);
// createSymmetricPolygonメソッドで頂点座標の配列を返す。
var rigid_arr:Array = ShapeUtil.createSymmetricPolygon(rnd_num_vertices, rnd_size);
 
// RigidBodyインスタンスを生成し、foamエンジンへ追加。
var rigid:RigidBody = new RigidBody(rnd_x, rnd_y, rnd_size, rigid_arr);
foam.addElement(rigid);

簡単ですね。
ただ、ちょっと重いかな・・・。まだバージョン0.1.01だもんなぁ・・・。

デモはこちら
screenshot

ソースコード全体は以下。
続きを読む

最近はBox2DFlashAS3と言うのがはやっているようですね。今更いろいろやろうにも出遅れた感が否めないので、ここはあえて違う物理エンジンをいじってみようと思います。

今回触ってみたのは、FOAMという物理エンジンです。
バージョンは0.1.01。まだまだ開発版ということですかね。

ではでは、初めてなので、まずは使い方から。

必要なものは、Foamクラスのインスタンスです。

private var foam:Foam = new Foam();
addChild(foam);

しかも、FoamクラスはSpriteクラスを継承しているため、描画もしてくれます。
なので、addChildしておきます。

foam.addGlobalForceGenerator(new Gravity(new Vector(0, 0.3)));

Gravityクラスが重力になるようです。(まだ調査しきれてません・・・)
これを、先ほどのfoamインスタンスのメソッド、addGlobalForceGeneratorに渡します。
これで、重力発生です。

続いて、オブジェクトを配置します。
FormインスタンスのメソッドaddElementに、ISimulatableインターフェースなインスタンスを渡してやります。
円形や多角形、ベジェ曲線などがISimulatableインターフェースをimplementsしたクラスとして提供されています。
今回は円形と四角を使ったサンプルを作ってみました。

デモはこちら。screenshot

ソースは以下。

/**
* FOAM sample1
* @author jinten.net
*/
package  {
	import flash.display.*;
	import org.generalrelativity.foam.dynamics.element.body.*;
	import org.generalrelativity.foam.dynamics.enum.Simplification;
	import org.generalrelativity.foam.dynamics.force.Gravity;
	import org.generalrelativity.foam.Foam;
	import org.generalrelativity.foam.math.Vector;
	import org.generalrelativity.foam.util.ShapeUtil;
 
	[SWF(width="300", height="300")]
	public class FoamSample1 extends Sprite {
 
		private const W:Number = 300;
		private const H:Number = 300;
 
		private var foam:Foam;
 
		public function FoamSample1() {
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.BOTTOM;
 
			//FOAMインスタンスの生成
			foam = new Foam();
			addChild(foam);
 
			//オブジェクトのドラッグ有効化
			foam.useMouseDragger(true);
 
			foam.addGlobalForceGenerator(new Gravity(new Vector(0, 0.3)));
 
			//circle
			foam.addElement(new Circle(100, 100, 30));
			foam.addElement(new Circle(200, 100, 30));
 
			var wall_arr:Array;
			//ground
			wall_arr = ShapeUtil.createRectangle(W, 20);
			foam.addElement(new RigidBody(W/2, 0, Simplification.INFINITE_MASS, wall_arr));
			foam.addElement(new RigidBody(W/2, H, Simplification.INFINITE_MASS, wall_arr));
			//wall
			wall_arr = ShapeUtil.createRectangle(20, H);
			foam.addElement(new RigidBody(0, H/2, Simplification.INFINITE_MASS, wall_arr));
			foam.addElement(new RigidBody(W, H/2, Simplification.INFINITE_MASS, wall_arr));
 
			foam.simulate();
		}
	}
}

flashrodさんの記事から、メソッドへの引数の渡し方について。

public function swap(a:Object, b:Object):void {
    var tmp:Object = a;
    a = b;
    b = tmp;
}

こんなメソッドを定義して、

var a:Object = {
    value: "abc",
    toString: function():String { return this.value; }
};
var b:Object = {
    value: "xyz",
    toString: function():String { return this.value; }
};
swap(a, b);
trace("a=", a);
trace("b=", b);

こんな感じで実行しても、

a= xyz
b= abc

こうならない。というお話。

ならないだろうとわかってはいるんですが、
言われてみれば参照渡しと言うならできるはず。
こういうところで説明ができない時点で、
なんとなく感覚でやってしまってるんだろうなぁ、と反省しなくては・・・。

結論としては、俗に言う「参照の値渡し」というやつなんですね。

C/C++で書くなら、

#include <stdio .h>
 
void swap(int* a, int* b){
	int* tmp = a;
	a = b;
	b = a;
}
 
int main(){
	int a = 1;
	int b = 2;
 
	printf("a=%d b=%d\n", a, b);
	swap(&a, &b);
	printf("a=%d b=%d\n", a, b);
 
  return 0;
}</stdio>

と、まぁ参照というより、ポインタ使ってるっぽい感じのイメージでいいんですかね。多分。
とりあえず、自分的には理解できてすっきり。

細かい言葉のあやみたいなところではあるんですが、
いつかこういったささいな部分ではまって、時間を無駄にするかもしれないし。
勉強になりました。

他のキーワードで検索 »