久しぶりにObjective-Cをいじった。
マイコミの記事を参考にしていたんだけど、addObserverってのが出てきてハマった。。。

厳密には違うけど、ASで言うところのaddEventListener的な使い方ができる。
NSObjectで実装されているので、なんかしらのクラスを継承してれば使えるっぽい。

タイトルの「キー値監視」とは、あるオブジェクトのプロパティの値が変化した事を他のオブジェクトに通知すること。
addObserverはその変化の通知を受け取るオブザーバを登録する際に利用するメソッドのようだ。




キー値監視を行うには、
1、addObserverで監視対象のオブジェクト、監視したいプロパティ、監視するオブジェクトを監視されるオブジェクトに登録。
メソッドは以下。

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context

・observer
イベントを受け取る人。通知を受け取るobserveValueForKeyPathというデリゲートメソッドを実装しておく必要がある。

・forKeyPath
いろんなところで「キー値」だとかいう説明がされてたけど、要はイベントを発行するオブジェクトのプロパティ名だと思う。「キー値」じゃなんだかわかんねーっつーのw

・options
変化する前の値を受け取るか、変化した後の値を受け取るか

・context
なんだかわからないっすw


2、オブザーバにてプロパティの変化を受け取るメソッドを定義
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object
                        change:(NSDictionary*)change context:(void*)context


3、setValueを使ってプロパティの値を変更する




これでできるはずなんだけど、どうやらデフォルトで自動通知がオフになっているらしいので、以下メソッドをオーバーライドしてYESを返す必要があるみたい。

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key
{
	if ([key isEqualToString:@"isFinished"])
       {
		return YES;
	}
	
	return [super automaticallyNotifiesObserversForKey:key];
}


特定のキー値の時YESを返すって感じです。

UA LABOオープン!

| | Comments (0) | TrackBacks (0)
かなりひさしぶりのエントリです!
だいぶ更新を怠ってしまっていました。。。

さてさて、弊社デベロッパーチームのブログ「UA LABO」が4月1日にオープンしました!
サイト自体もラボということで色々挑戦しています。

僕はUA LABO公式キャラクター「ラ・ボラ」君を作りましたww
MSのWordに出てくるイルカ君みたいなポジションにしたいです。
bola.jpg

UA LABOでは実験的な内容で色々書いていきます。
(こっちと若干かぶりそうだけど。。)

新年!

| | Comments (0) | TrackBacks (0)

明けましておめでとうございます!

今更ですがw

昨年は4月にこの業界に入り、それから色々と学ぶことだらけでした。

今年はさらに発展と多方面への開拓をしていこうと思います。

 

年賀ということで、弊社の年賀サイトをちょこっと紹介。

ユナイティア年賀サイト

一応自分も少し関わらせてもらえました。

 

nenga1.jpg

みんなでとにかく走りました!
もちろん自分も参加しています。


nenga2.jpg

社員全員のメッセージが見れます。
右下の入力欄に合い言葉を入れると対応したメッセージが再生されるようになっています。
「うしくん」と入れてもらえると、僕からのメッセージが見れます。


今年も頑張らないと!



かなりハマって焦ったのでメモ。

DisplayObjectにはstageプロパティがあって、
今までここからStageクラスのインスタンスにアクセスして
this.stage.stageWidthとかthis.stage.stageHeight
ってな感じでFlashコンテンツのステージサイズをとってました。

ところが、Flashのオーサリングツール上でインスタンスを静的配置した場合、
そのクラスのコンストラクタ内で、stageプロパティにアクセスすると、
タイミング的にstage.stageHeightやstage.stageWidthが正しく取得できないことがあります。
環境によってはうまくいく場合の方が多いので気づきにくいですが。。。

具体的には以下のような感じ


package
{
	import flash.display.Sprite;
	
	public class Test extends Sprite
	{
		private var _stageWidth:Number;
		private var _stageHeight:Number;
		
		public function Test()
		{
			_stageWidth = this.stage.stageWidth;
			_stageHeight = this.stage.stageHeight;
		}

	}
}


このクラスをステージに配置したインスタンスのシンボルにリンケージで紐付ける。

静的配置したインスタンスの場合、コンストラクタの実行されるタイミングが結構怪しいので、stageプロパティにちゃんとStageインスタンスが格納されていない場合があるのかな。。
でもメモリ領域は確保していて参照は保持しているので、コンストラクタで別のプロパティに格納しておいて後で使うのは全然問題なし。

stageプロパティはaddChildしてないと参照できないし、最初にどっか別のクラスに格納しちゃって、あとからはそこを参照する方がいいかもですね。

わんだふるにゃんだふる

| | Comments (0) | TrackBacks (0)
久しぶりに書いてみた!

wonderflが凄いね。
ってみなさん言ってるからあえて言うのもアレだけど...
なにがいいって共有できるのがいいね。
他の人のが簡単に見れるし、編集できるし。
簡単すぎて焦るね。

一体これはどうなっているわけ??



http://wonderfl.kayac.com/code/d57f586c04294a7d920bd6714815c78dde978a5c

リサジュー曲線

| | Comments (0) | TrackBacks (0)
boostworthyisryantaylorさんのエントリに触発されて、リサジュー曲線を書くフラッシュ作ってみた。

これはおもろいな〜
こっからインタラクティブになったらいいね。
コードはたったこんだけ。
変数aと変数bをいろいろ弄ってみると面白い。

var A:Number = this.stage.stageWidth / 2;
var B:Number = this.stage.stageHeight /2;
var a:Number = 20;
var b:Number = 30;
var deg:Number = 0;
var nTime:Number = 0;
var step:Number = 0.1;
var cx:Number = this.stage.stageWidth /2;
var cy:Number = this.stage.stageHeight /2;

var xPos:Number = A * Math.sin(a * nTime + deg) + cx;
var yPos:Number = B * Math.sin(b * nTime) + cy;

this.graphics.lineStyle(1);
this.graphics.moveTo(xPos,yPos);

this.stage.addEventListener(Event.ENTER_FRAME, enterFrameAction);

function enterFrameAction(e:Event):void{
	nTime+= step;
	xPos = A * Math.sin(a * nTime + deg) + cx;
	yPos = B * Math.sin(b * nTime) + cy;
	this.graphics.lineTo(xPos,yPos);
}
lissajou1.png

lissajou7.png

lissajou5.png
前のエントリに書いたShift_JISの解決法が見つかったのでメモ

useCodePageをtrueにするのではなく、バイナリでByteArrayに読み込んで、readMultiByteでShift_JISとして読めばよいみたい。
以下にサンプルを載せときます。サンプルではScrollBarのコンポーネントを使ってます。


 Custom Arguments...)
	*/
	public class sjisLoader3 extends Sprite
	{
		public var area_txt:TextField;
		public var scrollBar:UIScrollBar;
		private var urlLoader:URLLoader;
		
		private const DATA_PATH:String = "data/sjistext.txt";
		
		public function sjisLoader3()
		{
			urlLoader = new URLLoader();
			urlLoader.addEventListener(Event.COMPLETE, _loadedData);
			urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
			urlLoader.load(new URLRequest(DATA_PATH));
		}
		
		private function _loadedData(e:Event)
		{
			trace("loaded!!uho");
			
			var byteData:ByteArray = new ByteArray();
			byteData = ByteArray(urlLoader.data);
			var txtData:String = byteData.readMultiByte(byteData.length, "shift_jis");
			
			area_txt.text = txtData;
			scrollBar.update();
		}
	}
	
}
これを使えば色々な文字コードからUTF-8に変換できる見たいですね。逆はできないけど。
iPhone盛り上がってますね〜
AppStoreのダウンロード数も凄いみたいで。。
この流れになんとか乗りたいので、噂のCocoa Touch始めました。

Cocoaは、Mac OSXのネイティブアプリを作るためのObjective-Cのフレームワークということは聞いてたから、Objective-CってC言語にクラスがくっ付いたもんなら取っ付きやすいかな〜とか思ってたが。。

甘かった。

全然書き方違う。
メソッドのアクセスにドットを使わないし、インスタンス生成もnewではなく、allocメソッドを使う。

概念もだいぶ違う。
プロトコル?デリゲート? 理解不能な概念がいくつもある。。

Objective-Cのオブジェクト指向の機能がSmalltalkという言語らしく、こいつが分かりにくいんだろうなぁ


開発環境としては、コーディングにXcode、GUIの構築にInterface Builder、パフォーマンスを計るのにInstrumentsを使うようだ。

これらのツールの使い方も覚えなくてはならない。。


まだなんも作れてないけど、とりあえずHello Worldくらいは作らんと...

【AS3】Timerについて

| | Comments (0) | TrackBacks (0)
AS3になってタイマーが登場したけど、設定した間隔で正確に処理を実行しているものだと思ってた。

しかし、タイマーが実行する関数内で時間のかかる処理を行った場合、その処理が終わったタイミングから設定した時間後に次の処理が行われるようです。

つまり、
timer:Timer = new Timer(1000, 0);
timer.addEventListener(TimerEvent.TIMER, _timerAction);
timer.start();
として実行すると、最初の一回目は1000ミリ秒で実行されるが、_timerAction内の処理に600ミリ秒かかると次の実行は1600ミリ秒後になってしまうということ。設定した間隔に対して正確に実行することはできないので、アニメーションであればenterFrame内で経過時間から処理すべき数値を計算すれば良いようですね。

trick7様
を参考にさせていただきました。


しかし、trick7さんのエントリーの日付は2006年11月...
自分は一年半ぐらい遅れてるんですね。。
もっと頑張らなくては。。。

ActionScript3.0のバグについてメモ

データ量が比較的多めのXMLで文字コードがShift-JISのものは、AS3では正しくパースできない読み込まれないことがあるようです。
useCodepageとかも無意味です。

成功する場合もあれば、失敗する場合もあります。
失敗した場合は、
「1088ルートエレメントに続くドキュメントのマークアップは整形式でなければなりません。」
というランタイムエラーが発生します。
失敗した場合、XMLが読み込まれた時点でXMLを出力すると、最後に謎の文字列が追加されていました。


これは、、困りましたね(笑)


追記
useCodePage = trueをfalseにするともちろん文字化けは起こりますが、謎の文字列が付与されることはなくなりました。
AS3でShift_JISを取り扱うこと自体にバグがあるようですね。
XMLについてのみ言及していましたが、テキストファイルなどでも同様のバグがあります。
また、サイズの少ないファイルにおいてこのエラーは発生しません。

どうしてもShift_JISファイルの読み込みが必要な場合は、useCodePage=trueにはせず、ファイルパスをphpなどに渡して、エンコードした文字列を受け取る形が良さそうです。