[JavaScript] jQuery使ってるときのaタグのタッチイベントを制御したい

2012/08/21

こんにちは。きんくまです。
毎回同じことを調べてるので、メモしておきます。

aタグのタッチイベントを制御するときに、originalEvent.preventDefault()するとうまくキャンセルできます。
新しいバージョンでは直っているのかもしんない。
v1.7.1は駄目だったです。

$('#foo a').bind('touchstart', function(e){
    e.preventDefault(); //not work!!
    e.originalEvent.preventDefault(); //good
});

jQueryのEventObjectのリファレンス以外に見つかるプロパティを調べてたら見つかりましたです。

$('#foo a').bind('touchstart', function(e){
    var s = [];
    for(var prop in e){
        s.push(prop);
    }
    alert(s.join(', '));
});
LINEで送る
Pocket

[日記] 「おおかみこどもの雨と雪」感想(ネタバレあり)

2012/08/18

こんにちは。きんくまです。

今回はネタバレありの「おおかみこどもの雨と雪」感想です。
この間の勉強会ですすめられたので、ちょっと前に行ってきました。

全体的な感想としては面白かったです。

いくつかとりとめもなく感想を書いてきます。長文です。
いろいろとケチをつけてるように書いてありますが、全体の感想としては面白かったです。

何かは起きるはなし

映画が出始めのころに「何も起こらない話」みたいな感想がどこかに書いてあったので、そんなもんかと思ったら、意外とそれなりに事は起こるので退屈せずに見れました。
学生のころに、小津 安二郎のを2本ほど見た(東京物語、秋刀魚の味)んですが、そのときの感じかなと思ってましたら、そんなことはなかったよと。

田舎暮らし+子供視点の成長期

「子育て映画」ということだそうですが、自分の感想としては「田舎暮らし+子供視点の成長期」みたいな感じでした。
実際自分で子供を育てているとこんな感想をもってたりします。

・いつの間にか、こんなことができるようになってて、驚いたり喜んだり
・子供を育てているつもりが、逆に子供に気づかされることもあり、自分が成長させられたり
・子供とぶつかって、はたしてこれで正しかったのかと悩んだり
・病気になれば、大丈夫だろうかとハラハラしたり

なんで、映画ではあまりこういうこともなくトントン拍子にすすむ子育てのように感じられたので、親視点の子育てというのとは違うかなーと。

互いの世界を知った方が良かったかなー

それで、あとは一番気になったところは、母と娘、母と息子のつながりはあるのですが、娘と息子の子供どうしがほとんどつながりがなく、血のつながりのない同居人みたいな印象を受けました。

唯一つながっているところは、自分の世界をお互いに知って欲しく大ケンカをするところなんですが、その後和解もなくケンカ別れしてしまうのがすごく残念でした。

狼と人間のハーフという特殊な環境に産まれたもの同士なのに、どうして仲良くならないのかと。

その後、息子はケモノの世界で、娘は人間の世界でそれぞれ生きていくことを決めるんですが、その直前の大ケンカで、互いの世界を知る大チャンスだったわけです。

個人的には、息子が人間の世界で心を許せる相手を見つけ、娘の方はケモノの世界で尊敬できる人(動物)を見つけたりして、互いの世界の良さ悪さを少しでも知った上で、「それでもやっぱり、自分はこっちの世界で生きていくんだ」とした方が、スケール感が出たかなーと。
そうしないと、「自分の世界しか知らないけど、こっちが良いに決まってるじゃん!」みたいな井戸の中のなんとやらになっちゃうんじゃないかなと。

海外赴任の子供のはなし

あと、映画を見ながら思い出したのは以前に読んだこの本のことです。

どんな内容かといいますと、アメリカ駐在員の子供についての相談がQ6Aで載っている本です。帰ってくれば帰国子女などと呼ばれる子供ですね。

私も、子供なんて外国にいけば英語はペラペラになって帰ってくると簡単に考えていたのですが、実際はそういくものばかりでないようです。

日本人が海外にいっても、現地語での勉強+日本語での勉強という2倍の勉強量が必要になったり、なかなか現地の子供になじめなかったり、日本人とだけ仲良くしたかと思えば、日本人とはいえ、気が合わなかったり。
子供によっては不登校になる子もいるようです。

海外赴任のお父さんは、そもそも現地語の準備が多少なりともできていますが、子供や妻となると突然の場合も多いらしく、なかなか大変だそうで。
子供にも性格があるので、度胸のある子、人懐っこい子、引っ込み事案な子、いろいろといます。

それで、実際にこういった悩み事で、日本人向けの新聞(だったかな?)に投書されたものに対して作者が1つずつ答えていくというものです。

その中の回答のひとつが印象に残っていて、「子供が将来日本に戻らず、アメリカで生活していく場合は、日本語よりも英語をメインで勉強させるべき」と書いてありました。それが例え両親が日本人だったとしてもです。

完全なバイリンガルというのは、理想であってなかなか普通の人はなれないそうです。
なので、第一言語をきちんと学習することが大切だと。
その第一言語が、子供によっては英語、他の子にとっては日本語になるわけです。
思考するときに、メインの言語がないとその人の思考力そのものが発達できないらしく。
人間は言葉を使って思考をするので、あやふやな言語力ではあやふやな思考しかできないそうです。

なので、アメリカを拠点にするのであれば、現地の言語で思考しておいた方が、進学・就職や生活など将来が明るいみたいです。

もちろん日本に戻るのであれば、日本語は完璧になっておく必要があると。

んで、この海外赴任の子供の話は、映画に全然関係ない話のように感じる人もいるかもしれないんですけど、私的には
「自分の中にある2つのアイデンティティから1つを選びとり、そこで生きていく覚悟を決める」
というつながりがあるように感じました。
前振り長くてすみません、。

まとめ

というわけでまとめると、「雪ちゃん視点で、弟とケンカしたり仲良くなったり、好きな人ができたり。おちこんだりもしたけれど、私はげんきです。(あの映画好きなんで)」みたいだったらいいなと思いました。雪ちゃんかわいかったから。

LINEで送る
Pocket

[JavaScript] ExtendScript ToolkitのJavaScript Consoleに出力する

2012/08/3

こんにちは。きんくまです。
今回も誰得ネタなんだよ?という感じですが、、。

Illustrator用のjsxを作ってます。
それで、jsx作るにはAdobe純正のエディタのExtendScript Toolkitを使うとコードヒントが出たりして便利です。

プログラム書くには標準出力があったほうがよいです。
alert()でも画面上に出力できるのですが、毎回ダイアログを出すというのはあまり使い勝手がよくないです。

エディタのコンソールに出力したい!と思いググったところ、やり方がわかりました。

>> “Console.log” with Photoshop Scripting – ExtendedScript Toolkit

$.write('string'); //文字出力のみ
$.writeln('string'); //文字出力+改行あり

こんな感じに書くと

$.write('Hello');
$.writeln(' world !!');

こんな感じに出力されます。

toolkit_console

LINEで送る
Pocket

[AS3] flixelの弾幕デモ

2012/08/3

こんにちは。きんくまです。

この間のF-siteの用にflixelでつくった弾幕ゲームのデモを少し修正できたのでアップします。
デモのときは、iPadで使えるようにキーボード操作でなく、タッチ操作にしてました。

■あそびかた
キーボードの上下左右で操作。3回やられたらゲームオーバー。
クリアしてもループするだけです。すみません、、。

あれ? ブラウザでみると、けっこうカクつきますね。
swfそのまま見ると、もうちっとなめらかなんだけど。

 
ソースコードも書いておきます。
flixelが面倒なことをやってくれてるので、わりと短め?なのかな。
自機爆発のビットマップデータはflixelについてたflixelのロゴデータですw

shooting_demo.as


package
{	
	import flash.events.Event;
	
	import org.flixel.FlxGame;

	[SWF(width="480", height="640", backgroundColor="#000000", frameRate="60")]
	
	public class shooting_demo extends FlxGame
	{
		public function shooting_demo()
		{
			super(480 * 0.5, 640 * 0.5, MenuState,2, 60, 60);
		}
		
		override protected function create(FlashEvent:Event):void
		{
			super.create(FlashEvent);
		}
	}
}

MenuState.as

package
{
	import org.flixel.FlxButton;
	import org.flixel.FlxG;
	import org.flixel.FlxState;
	import org.flixel.FlxText;
	
	public class MenuState extends FlxState
	{
		private var _firstChar:FlxText;
		private var _title:FlxText;
		private var _startButton:FlxButton;
		
		public function MenuState()
		{
			super();
		}
		
		public override function create():void
		{
			super.create();
			FlxG.mouse.show();
			_startButton = new FlxButton(FlxG.width * 0.5 - 40, 160, "START", onStartClick);
			add(_startButton);			
			
			_title = new FlxText(54,90,200,"hooting!!");
			_title.size = 28;
			add(_title);
			
			_firstChar = new FlxText(27,80,40,"S");
			_firstChar.color = 0xFFFFCC33;
			_firstChar.size = 46;
			add(_firstChar);
		}
		
		public override function destroy():void
		{
			super.destroy();
			_startButton = null;
			_title = null;
		}
		
		private function onStartClick():void
		{
			FlxG.mouse.hide();
			FlxG.switchState(new PlayState());
		}
	}
}

PlayState.as

package
{
	import flashx.textLayout.elements.BreakElement;
	
	import org.flixel.FlxEmitter;
	import org.flixel.FlxG;
	import org.flixel.FlxGroup;
	import org.flixel.FlxPoint;
	import org.flixel.FlxSprite;
	import org.flixel.FlxState;
	import org.flixel.FlxText;
	import org.flixel.FlxTilemap;
	
	public class PlayState extends FlxState
	{
		private var _player:FlxSprite;
		private var _enemy:FlxSprite;
		private var _bullets:FlxGroup;
		private var _enemyBullets:FlxGroup;
		private var _shotCnt:int = 0;
		private var _enemyShotCnt:int = 0;
		private var _enemyHealthBar:FlxSprite;
		private var _enemyHelathBarBase:FlxSprite;
		private var _enemyShootOffsetRad:Number = 0;
		private var _scoreTxt:FlxText;
		private var _score:int;
		private var _isGameOver:Boolean = false;
		private var _gameOverText:FlxText;
		private var _pressZkeyText:FlxText;
		private const MAX_ENEMY_HEALTH:int = 100;
		private const PLAYER_MAX_HEALTH:int = 3;
		private var _playerExplosion:FlxEmitter;
		
		[Embed(source="org/flixel/data/logo.png")] private var LogoBmd:Class;
		
		override public function create():void
		{
			_player = new FlxSprite(FlxG.width * 0.5, FlxG.height - 50);
			_player.makeGraphic(8,8,0xffff0000);
			_player.maxVelocity.x = 120;
			_player.maxVelocity.y = 120;
			_player.drag.x = _player.maxVelocity.x * 4;
			_player.drag.y = _player.maxVelocity.y * 4;
			_player.health = PLAYER_MAX_HEALTH;
			_player.immovable = true;
			add(_player);
			
			_enemy = new FlxSprite(FlxG.width * 0.5, 40);
			_enemy.makeGraphic(30,8,0xff00ff00);
			_enemy.health = MAX_ENEMY_HEALTH;
			_enemy.velocity.y = 0;
			_enemy.acceleration.y = 0;
			_enemy.immovable = true;
			_enemy.acceleration.x = 10;
			_enemy.maxVelocity.x = 100;
			add(_enemy);
			
			
			var i:int;
			_bullets = new FlxGroup();
			for(i = 0; i < 60; i++){
				var bullet:FlxSprite = new FlxSprite(100,100);
				bullet.makeGraphic(2,5,0xffffffff);
				bullet.exists = false;
				_bullets.add(bullet);
			}
			add(_bullets);
			
			_enemyBullets = new FlxGroup();
			for(i = 0; i < 300; i ++){
				var enemyBullet:FlxSprite = new FlxSprite(100,100);
				enemyBullet.makeGraphic(4,4,0xffffff00);
				enemyBullet.exists = false;
				enemyBullet.immovable = true;
				_enemyBullets.add(enemyBullet);
			}
			add(_enemyBullets);
			
			_enemyHelathBarBase = new FlxSprite(10,20);
			_enemyHelathBarBase.makeGraphic(FlxG.width -20,3,0xffffffff);
			add(_enemyHelathBarBase);
			
			_enemyHealthBar = new FlxSprite(10,20);
			_enemyHealthBar.makeGraphic((FlxG.width - 20), 3, 0xffff0000);
			add(_enemyHealthBar);
			
			_scoreTxt = new FlxText(10, 2, 100);
			add(_scoreTxt);
			
			_score = 0;
			
			_gameOverText = new FlxText(80, 120, 100, "GAME OVER");
			_gameOverText.size = 24;
			_gameOverText.visible = false;
			add(_gameOverText);
			
			_pressZkeyText = new FlxText(88,200, 120, "PRESS Z KEY");
			_pressZkeyText.size = 8;
			_pressZkeyText.visible = false;
			add(_pressZkeyText);
			
			_playerExplosion = new FlxEmitter(FlxG.width * 0.5, FlxG.height * 0.5);
			_playerExplosion.setSize(30,30);
			_playerExplosion.setXSpeed(-300,300);
			_playerExplosion.setYSpeed(-300,300);
			_playerExplosion.setRotation(-720,720);
			_playerExplosion.makeParticles(LogoBmd,650,32,true,0);
			add(_playerExplosion);
		}
		
		override public function update():void
		{
			var bullet:FlxSprite;
			_player.acceleration.x = 0;
			_player.acceleration.y = 0;
			
			if(!_player.exists && FlxG.keys.Z){
				_gameOverText.visible = false;
				_pressZkeyText.visible = false;
				_player.health = PLAYER_MAX_HEALTH;
				_player.exists = true;
			}
			
			if(FlxG.keys.RIGHT){
				_player.acceleration.x = _player.maxVelocity.x *3;
			}
			if(FlxG.keys.LEFT){
				_player.acceleration.x = -_player.maxVelocity.x * 3;
			}
			if(FlxG.keys.UP){
				_player.acceleration.y = -_player.maxVelocity.y *3;
			}
			if(FlxG.keys.DOWN){
				_player.acceleration.y = _player.maxVelocity.y *3;
			}
			
			if(_player.exists && _shotCnt > 2){
				for each(bullet in _bullets.members){
					if(!bullet.exists){
						bullet.x = _player.x + 3;
						bullet.y = _player.y;
						bullet.velocity.x = 0;
						bullet.velocity.y = -200;
						bullet.exists = true;
						_shotCnt = 0;
						break;
					}else{
						
					}
				}
			}else{
				_shotCnt++;
			}
			
			var enemyBullet:FlxSprite;
			var enemyBulletShoootCnt:int = 0;
			var enemyBulletRad:Number;
			var direction:Number = 90;
			var enmbulletMax:int = 8;
			var dRad:Number = Math.PI * (enmbulletMax - 1) * 2 / 180.0;
			var currentRad:Number = Math.PI * direction / 180.0 - dRad * (enmbulletMax-1) * 0.5 + Math.sin(_enemyShootOffsetRad) * 0.5;
			var enmBulletVelocity:Number = 50;
			if(_enemyShotCnt > 15){
				for each(enemyBullet in _enemyBullets.members){
					if(!enemyBullet.exists){
						enemyBullet.x = _enemy.width * 0.5 + _enemy.x;
						enemyBullet.y = _enemy.height + _enemy.y;
						enemyBullet.velocity.x = Math.cos(currentRad) * enmBulletVelocity;
						enemyBullet.velocity.y = Math.sin(currentRad) * enmBulletVelocity;
						currentRad += dRad;
						enemyBulletShoootCnt++;
						enemyBullet.exists = true;
						if(enemyBulletShoootCnt >= enmbulletMax){
							break;
						}
					}
				}
				_enemyShotCnt = 0;
				_enemyShootOffsetRad += 0.2;
				if(_enemyShootOffsetRad > Math.PI * 2){
					_enemyShootOffsetRad -= Math.PI * 2;
				}
			}else{
				_enemyShotCnt++;
			}
			
			super.update();
			
			for each(bullet in _bullets.members){
				if(bullet.exists && bullet.y < 0){
					bullet.exists = false;
					bullet.velocity.y = 0;
				}
			}
			for each(enemyBullet in _enemyBullets.members){
				if(enemyBullet.exists){
					if(enemyBullet.y > FlxG.height
						|| enemyBullet.y < 0
						|| enemyBullet.x < 0
						|| enemyBullet.x > FlxG.width){
						enemyBullet.exists = false;
						enemyBullet.velocity.x = 0;
						enemyBullet.velocity.y = 0;
					}
				}
			}
			
			var enemyMoveMaxX:int = 20;
			var enemyHalfW:int = _enemy.width * 0.5;
			if(_enemy.x + enemyHalfW < enemyMoveMaxX){
				_enemy.velocity.x = 0;
				_enemy.acceleration.x = 10;
				_enemy.x = enemyMoveMaxX - enemyHalfW;
			}
			if(_enemy.x + enemyHalfW > FlxG.width - enemyMoveMaxX){
				_enemy.velocity.x = 0;
				_enemy.acceleration.x = -10;
				_enemy.x = FlxG.width - enemyMoveMaxX - enemyHalfW;
			}
			
			FlxG.overlap(_enemy, _bullets, onEnemyWithBulletsOverlap);
			FlxG.overlap(_player, _enemyBullets, onPlayerWithEnemyBulletsOverlap);
			
			updateEnemyHealthBar();
			
			if(_player.x < 0){
				_player.x = 0;
			}
			if(_player.x > FlxG.width){
				_player.x = FlxG.width;
			}
			if(_player.y < 0){
				_player.y = 0;
			}
			if(_player.y > FlxG.height){
				_player.y = FlxG.height;
			}
			
			_scoreTxt.text = 'SCORE: ' + _score.toString();
		}
		
		private function updateEnemyHealthBar():void
		{
			var barScale:Number = _enemy.health / MAX_ENEMY_HEALTH;
			if(barScale * (FlxG.width - 20) >= 1){
				_enemyHealthBar.makeGraphic((FlxG.width - 20) * barScale, 3, 0xffff0000);
				_enemyHealthBar.exists = true;
			}else{
				_enemyHealthBar.exists = false;
			}
		}
		
		override public function destroy():void
		{
			super.destroy();
			_player = null;
		}
		
		private function onEnemyWithBulletsOverlap(enemy:FlxSprite, bullet:FlxSprite):void
		{
			enemy.health -= 1;
			enemy.velocity.y = 0;
			enemy.acceleration.y = 0;
			enemy.flicker(0.2);
			bullet.exists = false;
			if(enemy.health < 0){
				enemy.health = MAX_ENEMY_HEALTH;
				enemy.x = 40;
				enemy.y = 40;
				_score += 100000;
			}
			_score += 100;
		}
		
		private function onPlayerWithEnemyBulletsOverlap(player:FlxSprite, enemyBullet:FlxSprite):void
		{
			if(_player.flickering){
				return;
			}
			
			_player.health--;
			_player.flicker(1.0);
			enemyBullet.exists = false;
			if(_player.health <= 0){
				_player.kill();
				_playerExplosion.x = _player.x;
				_playerExplosion.y = _player.y;
				_playerExplosion.start(true, 3);
				_gameOverText.visible = true;
				_pressZkeyText.visible = true;
			}
		}
	}
}
LINEで送る
Pocket

[AS3] 2012年7月のF-site の発表です

2012/07/31

こんにちは。きんくまです。

先日の土曜日に発表してきたスライドをアップしました。
よろしければご覧下さい。

Flash Professional CS6 の新機能のご紹介 AIR編 from KinkumaDesign

当日のデモは、以下のものをAIR for iOSでiPadに書き出したものをお見せしたりしました。
どちらも、タッチイベントで動かすようにしました。

1. Away3Dについてたサンプル(Stage3D)

fsite1207_1

2. Flixelを使って作った弾幕シューティングっぽいやつ(非Stage3D)

fsite1207_2

1.はiPad(3rd gen)は60fps, iPhone4で30fps
2.はiPad(3rd gen)で、CPU > 27fps, GPU > 44fps, Direct > 30fps という感じでした。

端末や、レンダリング方法によってパフォーマンスが変わってくるみたいなんで、十分テストした方が良いかと思われます。

LINEで送る
Pocket

[iOS] 同クラスの別カテゴリのメソッドをオーバーライドしちゃダメなんですね

2012/07/31

こんにちは。きんくまです。メモです。
タイトルのままです。知らんかったです。
Xcode4.4にしたらllvm4.0が警告をしてきたので、調べてみたらそういうことなんですね。
気をつけよう。

>> kuro’s blog : Objective-C:カテゴリで「できること」と「できないこと」
>> Objective-C 2.0 プログラミング言語を読む #3 カテゴリ – memo

自分の場合は、元のクラスのプロパティを、そのクラスの、あるカテゴリで実装してしまった状態でした。

LINEで送る
Pocket

[iOS] Mountain Lion (OS X v10.8) でのXcode4.4のアンチエイリアスなしにする

2012/07/30

こんにちは。きんくまです。

Macであんまりアンチエイリアスなしにしたいなんて人はいないと思うのですが、メモです。

OSを山ライオンさんにアップデートしてみました。
Time Machine使って、ほぼ何もせずに移行することができました。やったー。
(Adobe製品だけアップデート中はライセンス認証をはずしておいた)

それでいろいろとアプリを問題ないか確認していって、
Xcodeを立ち上げたところ、アンチエイリアスがかかっているではないですか。
これは何とかしたいなとググったところ、「俺もなんだよ」「困ったよー」という人たちを発見。

>> Disable Anti-Aliasing Fonts in Xcode 4.4 in Mountain Lion

何でも、山ライオン上のXcode4.4の文字はRetinaに最適化されているんだそう。
このコマンド打てばRetina最適化しないもとの状態に戻るよとのこと。

defaults write com.apple.dt.Xcode NSFontDefaultScreenFontSubstitutionEnabled -bool YES

これで私も戻りました。よかった。

xcode_witout_antialiasing

LINEで送る
Pocket

ページトップへ戻る