2010年12月30日木曜日

クロージャでaddEventListenerしたEventをremoveするメモ

クロージャでaddEventListenerしたEventをremoveするメモ


arguments.callee

を使う。

Docs[argument]
arguments オブジェクトは、関数の引数の保存や、引数へのアクセスに使用されます。関数の本体に含まれる場合、arguments オブジェクトにはローカルの arguments 変数を使用してアクセスできます。


 
var count:Number = 0
addEventListener(Event.ENTER_FRAME, function():void {
count++
if(count > 10){
removeEventListener(Event.ENTER_FRAME,arguments.callee);
}
}




以下、使ってみたsample

クロージャの中でイベントを削除する - wonderfl build flash online



 
package {
import flash.geom.Point;
import flash.events.Event;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.display.Sprite;

[SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "000000")]

public class Line extends Sprite {
public function Line() {
// write as3 code here..
init();
}

private function init():void
{
stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
}

private function mouseDownHandler(e:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);
stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);
}

private function mouseUpHandler(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);
stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);
}

private function mouseMoveHandler(e:MouseEvent):void
{
drawLines(mouseX,mouseY);
}

private function drawLines(startX:Number,startY:Number):void
{
var line:Shape = new Shape();
var col:uint = Math.random() * 0xFFFFFF;
var count:Number = 0;
addChild(line);
line.x = startX;
line.y = startY;
line.graphics.lineStyle(1,col);
line.graphics.moveTo(20,0);
line.addEventListener(Event.ENTER_FRAME,
function():void{
count+= 0.1;
var px:Number = 20 * (Math.cos(count) + count * Math.sin(count));
var py:Number = 20 * (Math.sin(count) - count * Math.cos(count));
line.graphics.lineTo(px,py);
line.alpha -= 0.005;
if(count > 10){
removeChild(line);
line.removeEventListener(Event.ENTER_FRAME,arguments.callee);
}

});
}
}
}

2010年12月23日木曜日

【ActionScript3.0】BINGO

忘年会シーズンなので、ビンゴゲーム用のアルゴリズムを書いてみました。自分で書くとお金がかからない上に、自由に演出ができていいですね。

ビンゴのルール
ビンゴ-wikipedia
一般的にビンゴカードはタテ・ヨコ5マスずつ、計25個のマス目が書かれている。その内、中央を除く24マスには1から75までの番号のうち24個の番号が書かれており、中央はフリースポットとして最初から有効な番号として扱われる。1枚のカードの中で同じ番号が重複することはない。

と言う訳なので、75個の数字から一文字ずつランダムで数字を取り出すと言うやり方にしました。
もっといい書き方はきっとあると思うのですが。。。。以下コード。

 

private const NUM_MAX:Number = 75;
private var _numbers:Array = [];
private var _selectedNumbers:Array = [];

//すべての数字を格納する配列を用意する。
private function setNumberAsset():void
{
for (var i:int = 0; i < NUM_MAX; i++) {
_numbers.push(i + 1);
}
}

//数値が正しく得られるまで計算を繰り返す。
private function selectNumbers():void
{
var check:Boolean = false;
while (!check) {
check = checkNumber();
}
//ココで数字を表示しています。
trace(_selectedNumbers);
}

//配列からランダムに数字を取り出す。
private function checkNumber():Boolean
{
var nMax:Number = 75;
var nMin:Number = 1;
var check:Boolean;
var selectNum:int = Math.floor(Math.random()
                 * (nMax - nMin + 1)) + nMin;
//元データがなかったら何もしない。
if (_numbers.length == 0) return true;

for (var i:int = 0; i < _numbers.length; i++) {
if (_numbers[i] == selectNum) {
_numbers.splice(_numbers.indexOf(selectNum),1);
_selectedNumbers.push(selectNum);
return true;
}else {
check = false;
}
}
return check;

}



結果:クリックで数字が出ます

flash on 2010-12-23 - wonderfl build flash online

2010年12月4日土曜日

【Emacs】Carbon Emacsのshell-modeでaliasを設定する。

Carbon Emacsのshell-modeでaliasを設定するのにつまずいたのでメモ。最初shell上でalias hoge='foo -hogehoge'ってやれば、そのままその後も適用されると思って、もう一度起動したらもう使えなかった。そういうものじゃないらしい。初期のshellの設定として.bashrc とか.bash_profileというのをユーザーのホームディレクトリに作成してそこに設定を書き込めばいいと言う事らしい、と言う事で早速


alias hoge='foo -hogehoge'


と書き込んでみて、再起動。
してみたものの何も起きずに、どうしたらいいかわからなくてemacsの設定ファイルをいろいろいじってみたけれどやり方がわからない。で、こちらの記事(のろのろwikiさん)にたどり着きようやく判明


source .bash_profile


で設定ファイルを読み込んであげればいいらしい。Carbon Emacs関係なかった。ちなみに.bashrcと.bash_profileの違いは、.bash_profileと.bashrcの違いは(@IT)こちらの記事に書いてある感じらしい。

2010年11月16日火曜日

【C++】Virtualだけじゃなくてprotectedもある。

11月11日の日記で仮想関数のvirtualの事をActionscriptのprotectedみたいなものかな、とか書いたけど、実際はprotectedもc++には存在している。らしい。

virtualの場合はスーパークラス側もサブクラス側も、両方とも定義を記述する。protectedの場合はそのメンバにアクセスできるって言う事らしいのだ。こっちのprotectedはActionscriptって言うのとほぼ一緒と考えて良さそうかな(よけいな事は書かない方がいいか。)

もう少し、virtualとprotectedの違いをしっかりとわかっていた方がいいかもしれない。

2010年11月12日金曜日

【blog】Syntax HighlighterをBloggerに追加

どうせなので、blogに Syntax Highlighter を導入することにしました。
※1こちらのものを使わせていただきました。ありがとうございます。

というわけでとりあえずテスト

AS3:

package
{
public class Helloworld()
{
public function Helloworld()
{
trace("Hello world");
}
}
}


C++:

#include <iostream>

int main()
{
std::cout << "Hello world¥n"; return 0; }


で、最初C++のコードを書こうとしたときに"<"が表示されなかったのはどうやら別の形で書かなければ行けないらしいと言う事だそうで。というのを※2こちらのサイトで変換させていただき、判明しました。なるほど。ありがとうございます。

※1いままでのこと:
http://u3q.blogspot.com/2010/01/bloggercom-syntax-highlighter-21-widget.html

※2クリボウの Blogger Tips:
http://www.kuribo.info/2008/06/blogger-syntax-highlighter.html

2010年11月11日木曜日

【C++】仮想関数



クラスのメソッドを継承するのにはスーパークラスの関数の宣言のところにvirtualをくっつける。Actionscriptでいうprotectedみたいなものか。逆にサブクラスの方には特に記述する事がないのね。こんがらがりそう。


【追記】結局のところ間違えだったらしいと言う事が発覚。こちら


2010年11月10日水曜日

【C++】分割ファイルのコンパイル


ちなみにこちらのサンプルを実行しようとして、コンパイルしようとしていきなりつまずきかけた。複数コンパイルするときは、複数のファイルを引数にしてコンパイルするのが正解だそうで。