7月末くらいに知って、なかなかいいぞと会社の同僚に薦めていたけど、自分はゲーム開発をしないのでサンプルを一通りみるだけだったiOSとAndroid両用フレームワークのemo-frameworkを少しいじってみました。
両用のフレームワークなので独自の追加なんてしない方がいいのだが、拡張性ってフレームワークの選択で大事だよね。
[emo-framework ver 0.1.4.14]を使用します。
とりあえず。
tools=emo.Tools();
class Main(){
function onMotionEvent(mevent) {
if (mevent.getAction() == MOTION_EVENT_ACTION_DOWN) {
print(format("EVENT: %dx%d", mevent.getX(), mevent.getY()));
tools.alert("テスト","こんな文字を出します!");
}
}
}
が動くようにしてみようと思います。
Constant.h
#define EMO_TOOLS_CLASS "Tools"
他の関数を参考に実装します。
glue(のり)ファイルを用意しているみたいなのでさっくと次の構成にします。
EmoTools.h
あと、EmoEngineに関連づけます。
とりあえず、Alertを普通に実装をします。
EmoTools.h
#import
@interface EmoTools : NSObject;
-(void)alert:(NSString *)title message:(NSString*)message;
@end
EmoTools.m
#import "EmoTools.h"
@implementation EmoTools
-(void)alert:(NSString *)title message:(NSString*)message{
UIAlertView *alert= [[UIAlertView alloc]
initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alert show];
[alert release];
}
@end
#import "squirrel.h"
void initToolsFunctions();
SQInteger emoAlert(HSQUIRRELVM v);
EmoTools_glue.m
#import "EmoTools_glue.h"
#import "Constants.h"
#import "EmoEngine.h"
#import "VmFunc.h"
extern EmoEngine* engine;
void initToolsFunctions() {
//ここでEmo.toolsと関連づけます。
registerClass(engine.sqvm, EMO_TOOLS_CLASS);
//ここでfunctionと関連づけます。ここが増えていきます。
registerClassFunc(engine.sqvm, EMO_TOOLS_CLASS, "alert", emoAlert);
//registerClassFunc(engine.sqvm, EMO_TOOLS_CLASS, "alert2", emoAlert);
//registerClassFunc(engine.sqvm, EMO_TOOLS_CLASS, "alert3", emoAlert);
}
SQInteger emoAlert(HSQUIRRELVM v) {
const SQChar* title;
const SQChar* message;
//引数の取得です
SQInteger nargs = sq_gettop(v);
if (nargs >= 2 && sq_gettype(v, 2) == OT_STRING && sq_gettype(v, 3) == OT_STRING) {
//引数2番目がスクリプト内の第一引数です
sq_getstring(v, 2, &title);
sq_getstring(v, 3, &message);
} else {
sq_pushinteger(v, ERR_INVALID_PARAM);
return 1;
}
NSString* nstitle = [[NSString alloc]initWithUTF8String:title];
NSString* nsmessage = [[NSString alloc]initWithUTF8String:message];
//ここで実装を呼び出します。
[engine.tools alert:nstitle message:nsmessage];
[nstitle release];
[nsmessage release];
return 1;
}
あとは、エンジンに関連づけます。
EmoTools* tools;
@property (
readonly)
EmoTools* tools;
EmoEngine.m
@synthesize tools;
- (void)initScriptFunctions {
register_table(sqvm, EMO_NAMESPACE);
・
・
//追加
initToolsFunctions();
- (BOOL)startEngine:(GLint)width withHeight:(GLint)height {
isFrameInitialized = FALSE;
lastError = EMO_NO_ERROR;
isRunning = TRUE;
sortOrderDirty = TRUE;
stopwatchStarted = FALSE;
enablePerspectiveNicest = TRUE;
enableOnDrawFrame = FALSE;
accelerometerSensorRegistered = FALSE;
enableOnUpdate = FALSE;
audioManager = [[EmoAudioManager alloc]init];
drawables = [[NSMutableDictionary alloc]init];
stage = [[EmoStage alloc]init];
netTasks = [[NSMutableDictionary alloc]init];
database = [[EmoDatabase alloc]init];
imageCache = [[NSMutableDictionary alloc]init];
// 追加
tools = [[EmoTools alloc] init];
こんな感じに簡単に拡張することができました。
これで、アプリ内課金の実装も安心です。