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
EmoTools.m
EmoTools_glue.h
EmoTools_glue.m
あと、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
EmoTools_glue.h
#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;
}
あとは、エンジンに関連づけます。
EmoEngine.h
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];
          ・
          ・
    }
こんな感じに簡単に拡張することができました。
これで、アプリ内課金の実装も安心です。
 
 
 投稿
投稿
 
