Murayama blog.

プログラミング教育なブログ

円運動とFlickrと

この週末は移動時間がけっこうあったので、楽しくコーデイングしてました。


今回やってみたのは、

  • Z軸を使った円運動
  • Flickr APIから画像データの取得


ほんで結果はこんなの。


PV3Dも雰囲気がわかってきたので、
これまでActionScript3.0アニメーションで習った知識を試してみました。
#sin、cosを使って円運動させてみただけ。


Flickr APIも初めて使ったけど、そんなに難しくなかったです。
api_keyをゲットすればあとはFlickrが返してくれるXMLを解析していけばOKでした。


ちなみにASにはFlickr用のライブラリもあるみたいだけど、まずは力技でやってみました。
ASはXMLと相性がいいから、ライブラリ使わなくてもどうにかなりました。

package
{
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.Security;
	
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.view.BasicView;
	
	public class FlickrPlane extends BasicView
	{
		private var pictures:Array = [];
		public function FlickrPlane()
		{
			Security.loadPolicyFile("http://farm1.static.flickr.com/crossdomain.xml");
			Security.loadPolicyFile("http://farm2.static.flickr.com/crossdomain.xml");
			Security.loadPolicyFile("http://farm3.static.flickr.com/crossdomain.xml");
			Security.loadPolicyFile("http://farm4.static.flickr.com/crossdomain.xml");
			
			camera.y = 100;
			camera.z = -1500;
			// APIキーは公開しても良い?
			var req:URLRequest = new URLRequest("http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=自分のAPIキー&user_id=36325810@N02");
			var loader:URLLoader = new URLLoader();
			loader.addEventListener(Event.COMPLETE, onComplete_loader);
			loader.load(req);
			startRendering();
		}

		private var picCount:int = 0;
		private var currentPicNo:int = 0;
		private function onComplete_loader(evt:Event):void
		{
			var xml:XML = XML(evt.target.data);
			var xmlList:XMLList = xml.photos.photo;
			picCount = xmlList.length();
			for each(var photo:XML in xmlList){
				// この辺、てきとう。
				var urlObj:Object = {
					farm:photo.@farm,
					server:photo.@server,
					id:photo.@id,
					secret:photo.@secret,
					create:function():String{
						return "http://farm" + this.farm + ".static.flickr.com/" + this.server
						+ "/" + this.id + "_" + this.secret + "_m.jpg"
					}
				}
				var url:String = urlObj.create();
				var req:URLRequest = new URLRequest(url);
				var loader:Loader = new Loader();
				loader.contentLoaderInfo.addEventListener(Event.COMPLETE, photoLoad);
				loader.load(req);
			}
		}
		
		// 半径とか
		private var radius:Number = 500;
		private var centerX:Number = 0;
		private var centerY:Number = 0;
		private var centerZ:Number = 0;
		private function photoLoad(evt:Event):void
		{
			var bitmap:Bitmap = evt.target.content as Bitmap
			var bitmapMaterial:BitmapMaterial = new BitmapMaterial(bitmap.bitmapData);
			bitmapMaterial.doubleSided = true;
			var plane:Plane = new Plane(bitmapMaterial);
			// 初期配置
			var angle:Number = 360 / picCount * currentPicNo * Math.PI / 180;
			currentPicNo++;
			plane.x = centerX + Math.cos(angle) * radius;
			plane.z = centerZ + Math.sin(angle) * radius;
			scene.addChild(plane);
			pictures.push(plane)
		}

		// 回転速度
		private var vr:Number = 0.01;
		private var cos:Number = Math.cos(vr);
		private var sin:Number = Math.sin(vr);
		override protected function onRenderTick(event:Event = null):void
		{
			for(var i:int; i < pictures.length; i++){
				var plane:Plane = pictures[i];
				var x1:Number = plane.x - centerX;
				var z1:Number = plane.z - centerZ;
				var x2:Number = cos * x1 - sin * z1;
				var z2:Number = cos * z1 + sin * x1;
				plane.x = centerX + x2;
				plane.z = centerZ + z2;
			}
			super.onRenderTick(event);
		}
	}
}


週末プログラミングはたのしい。