2011年9月19日月曜日

[iOS][emo-framework]squirrelに機能を追加してみる

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.sqvmEMO_TOOLS_CLASS"alert"emoAlert);

    //registerClassFunc(engine.sqvmEMO_TOOLS_CLASS"alert2"emoAlert);
    //registerClassFunc(engine.sqvmEMO_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];

          ・
          ・

    }



こんな感じに簡単に拡張することができました。
これで、アプリ内課金の実装も安心です。

0 件のコメント:

コメントを投稿