2013/09/01(日) [n年前の日記]
#2 [haxe] まだHaxeを触ってたり
キーボードイベントの取得をしてみたり。
Main.hx
と思ったけど、サウンドはどうなんだろう。音が鳴らないのではゲームらしさが半減だろうけど。しかし、ブラウザによって鳴らせるサウンド形式が違うから、html5 で出力した際にマズイことになりそうな。
Main.hx
package ;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.Lib;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
/**
* OpenFLテスト。キーボードイベントを取得してみる。
* @author mieki256
*/
class Main extends Sprite
{
var inited:Bool;
var spr:Sprite;
var tf:TextField;
var scrw:Float;
var scrh:Float;
var keybuf:Array<Bool>;
static inline var KEY_UP:Int = 38;
static inline var KEY_DOWN:Int = 40;
static inline var KEY_LEFT:Int = 37;
static inline var KEY_RIGHT:Int = 39;
static inline var KEY_W:Int = 87;
static inline var KEY_A:Int = 65;
static inline var KEY_S:Int = 83;
static inline var KEY_D:Int = 68;
static inline var KEY_Z:Int = 90;
static inline var KEY_X:Int = 88;
static inline var KEY_C:Int = 67;
static inline var KEY_B:Int = 66;
static inline var KEY_N:Int = 78;
static inline var KEY_M:Int = 77;
static inline var KEY_SPC:Int = 32;
/* ENTRY POINT */
function resize(e)
{
if (!inited) init();
// else (resize or orientation change)
}
function init()
{
if (inited) return;
inited = true;
scrw = Lib.current.stage.stageWidth;
scrh = Lib.current.stage.stageHeight;
spr = new Sprite();
spr.graphics.beginFill(0x8080FF);
spr.graphics.drawRect( -32, -32, 64, 64);
spr.graphics.endFill();
spr.x = scrw / 2;
spr.y = scrh / 2;
Lib.current.stage.addChild(spr);
tf = new TextField();
tf.textColor = 0x333333;
tf.selectable = false;
tf.text = "WASD or Cursor , Z,X or B,N";
tf.autoSize = TextFieldAutoSize.CENTER;
tf.x = (scrw - tf.width) / 2;
Lib.current.stage.addChild(tf);
keybuf = new Array();
// キーボードイベントを登録
Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, function (e:KeyboardEvent):Void {
keybuf[e.keyCode] = true;
});
Lib.current.stage.addEventListener(KeyboardEvent.KEY_UP, function (e:KeyboardEvent):Void {
keybuf[e.keyCode] = false;
});
Lib.current.stage.addEventListener(Event.DEACTIVATE, function(e:Event):Void {
keybuf = new Array();
});
// 毎フレームの処理を登録
Lib.current.stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
/**
* キーが押されたままかどうかを調べる
* @param keycode
* @return
*/
function keyIsDown(keycode:Int):Bool
{
return if (keybuf[keycode] == true) true else false;
}
/**
* 毎フレーム呼ばれる処理
* @param e
*/
function onEnterFrame(e:Event):Void
{
var spd:Float = 5;
// カーソルキー、もしくは wasdキーで座標を変更
if ( keyIsDown(KEY_UP) || keyIsDown(KEY_W)) {
spr.y -= spd;
} else if (keyIsDown(KEY_DOWN) || keyIsDown(KEY_S)) {
spr.y += spd;
}
if (keyIsDown(KEY_LEFT) || keyIsDown(KEY_A)) {
spr.x -= spd;
} else if (keyIsDown(KEY_RIGHT) || keyIsDown(KEY_D)) {
spr.x += spd;
}
// z,x、もしくは、b,nキーで拡大縮小率を変更
if (keyIsDown(KEY_Z) || keyIsDown(KEY_B)) {
spr.scaleX = 2.0;
} else {
spr.scaleX = 1.0;
}
if (keyIsDown(KEY_X) || keyIsDown(KEY_N)) {
spr.scaleY = 3.0;
} else {
spr.scaleY = 1.0;
}
spr.rotation += 3; // 回転
}
/* SETUP */
public function new()
{
super();
addEventListener(Event.ADDED_TO_STAGE, added);
}
function added(e)
{
removeEventListener(Event.ADDED_TO_STAGE, added);
stage.addEventListener(Event.RESIZE, resize);
#if ios
haxe.Timer.delay(init, 100); // iOS 6
#else
init();
#end
}
public static function main()
{
// static entry point
Lib.current.stage.align = flash.display.StageAlign.TOP_LEFT;
Lib.current.stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
Lib.current.addChild(new Main());
}
}
マウス座標も取得できたし、キーボードイベントも取得できたし、画像も表示できるみたいだから、ゲームっぽいものなら作れそう、かな…。と思ったけど、サウンドはどうなんだろう。音が鳴らないのではゲームらしさが半減だろうけど。しかし、ブラウザによって鳴らせるサウンド形式が違うから、html5 で出力した際にマズイことになりそうな。
◎ サウンドは鳴らせない予感。 :
サウンド関係について、色々検索して眺めてみたけど。application.xml 内の assets 云々の指定で、flash かそうでないかを判別して、mp3 と ogg のどちらを持つか切り替える方法はあるらしい。if="falsh" とか unless="flash" と最後につける、みたいな。
どんな指定ができるのかについては、 _OpenFL :: Project File Format に書いてあるっぽい。
ただ、html5出力時用に if="html5" とした場合でも、ブラウザによって対応してる音楽ファイル形式が異なるわけで。例えば…。
Haxe のソース内で、ブラウザ種別で読み込むファイル名を変える、ということができれば対応できるのかもしれないけど。ブラウザ種別の取得なんてできるのだろうか?
html5出力時は、サウンドを一切鳴らさないか、Google Chrome と Firefox にしか対応してないよとどこかに明記するか、そのくらいしか手が思いつかないなあ…。
いや待て。そもそも、ブラウザ上で動かしたいなら、Flash で出力すればいいのか。対応フォーマットすら足並みを揃えることができない html5 で無理矢理どうにか音を鳴らそうと四苦八苦するのも馬鹿馬鹿しいよな…。
どんな指定ができるのかについては、 _OpenFL :: Project File Format に書いてあるっぽい。
mobile, desktop, native, webこのあたりの文字列が指定出来るのかもしれない。自信ないけど。
ios, android, blackberry, webos, windows, mac, linux, html5
flash, cpp, neko, js
ただ、html5出力時用に if="html5" とした場合でも、ブラウザによって対応してる音楽ファイル形式が異なるわけで。例えば…。
- Google Chrome ... ogg, mp3, wav, aac が鳴らせる。
- Firefox ... ogg, wav が鳴らせる。mp3, aac は鳴らせない。
- Opera ... ogg, wav が鳴らせる。mp3, aac は鳴らせない。
- IE9〜10 ... mp3, aac が鳴らせる。ogg, wav は鳴らせない。
- Safari ... mp3, wav, aac が鳴らせる。ogg が鳴らせない。
Haxe のソース内で、ブラウザ種別で読み込むファイル名を変える、ということができれば対応できるのかもしれないけど。ブラウザ種別の取得なんてできるのだろうか?
html5出力時は、サウンドを一切鳴らさないか、Google Chrome と Firefox にしか対応してないよとどこかに明記するか、そのくらいしか手が思いつかないなあ…。
いや待て。そもそも、ブラウザ上で動かしたいなら、Flash で出力すればいいのか。対応フォーマットすら足並みを揃えることができない html5 で無理矢理どうにか音を鳴らそうと四苦八苦するのも馬鹿馬鹿しいよな…。
[ ツッコむ ]
以上です。