2011年12月6日火曜日

[ios][storyboard]ストリーボードの動作を確認してみた


まず、よくストリーボードでviewControllerからviewControllerをつなぐsegueをモーダルで画面遷移を定義していくが、AからBへいってBからAに戻る遷移をモーダルでつなぐ人がいたので、それはさすがに違うだろうと思うので実際確認してみた。

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%@",self);
    [super viewDidAppear:animated];
}


2011-12-06 00:26:53.328 modaltest[25564:f803]
2011-12-06 00:26:56.094 modaltest[25564:f803]
2011-12-06 00:27:04.040 modaltest[25564:f803]
2011-12-06 00:27:05.722 modaltest[25564:f803]
2011-12-06 00:27:09.271 modaltest[25564:f803]
2011-12-06 00:27:11.272 modaltest[25564:f803]

当たり前だけど、違うメモリアドレスを返してくる。やはり、モダールはちゃんと
dismissは自分で実装しないといけないみたい。
メモリは同じなので、遷移のスタックがたまっていってるのかな。


資料を探して行き詰まっていたけど、なんだかんだでたよりになるのは
テンプレートのソース。

リストテンプレートを見ればsegueからデータを次のviewControllerに渡す方法も分かる。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    if ([[segue identifierisEqualToString:@"showDetail"]) {

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSManagedObject *selectedObject = [[self fetchedResultsControllerobjectAtIndexPath:indexPath];
        [[segue destinationViewControllersetDetailItem:selectedObject];
    }
}


リストテンプレートにCoreDataをチェックして作れば、動的Propetyでの利用の仕方が分かる。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    return cell;
}
カスタムセルが作りやすくなっている気がします。

意外と使えるかも、ストリーボード!



2011年11月21日月曜日

Sencha Touch2をPhoneGapで使えなくて困った


Ext.aplication()では、うまくlaunchが呼ばれなかったので四苦八苦した。


Ext.setupでもうまくいかなかったが、viewportの設定をautoMaximize: falseにすることで表示されるようになった。


Ext.setup({
    viewport: {
        autoMaximize: false
    },
    onReady: function() {
    }
});


2011年11月5日土曜日

iOS5で困ったこと

iOS5で困ったことなのか、Xcode4.2で困ったことなのか分からないが、
「レスポンダチェイン」がすべてのオブジェクトにチェインしていないようだ。

親でtouchMove
子でtouchBegin

子でtouchBeginイベントをとったらtouchMoveイベントも子のみしか取得できていないみたい。
とりあえず、このtouchMoveからsuperviewへそのままイベントを流す処理を記載しました。

何か、設定があればいいなぁ。

喜びも悲しみも共有する人があってこそなんだな

自分はナルシストでわがままだと思っていた。

感情の高まり、喜びや悲しみは、人が生きる上でのエネルギーになり得ることは、私の浅い人生でも感じていることだ。

でも、その喜びや悲しみを自分に提供し、それを自分の中で処理をすることは、自分には無理だった。

今、悲嘆してこのようなコトを感じているのではない。

自分は喜びにあふれているのだ。このことを外に発散できなくて、つぶされそうになる自分がいる。

本当のナルシストなら、自己循環させることができるはずだ。今の自分にはできなかった。

だからこそ、周りにいてくれているみんなに心からありがとうと伝えたい。

そう、今朝、愛おしい自分の脆弱さをみつけたのだ。

2011年10月8日土曜日

[cocos2d]Templateがbuildできない

ver 1.0.1

FontLabelStringDrawing.hがないといわれる

別ライブラリFontLabelをもってきて
https://github.com/zynga/FontLabel

Downloadして解凍したclasses以下のFontLabelフォルダをXcodeにドラッグして完了。

2011年10月2日日曜日

自分に甘くなろう

ちゃんとつくろう!しっかりつくろう!きれいにつくろう!
頭に唱えて
がんばろう、がんばろう、がんばろう
とかしていたけど、なにもできない。
ふいに、気づいてしまった
自分ってそんな人間?
いい加減で、大雑把で、短期型の人間でしょ

いい加減で大雑把な人間と自分を自覚したら
大切なのは、いい加減で、大雑把をいかした方法をとること。
性質はけして欠点にはならないから。
課題に対してのアプローチの多様性は大事だし、
アプローチは変わっても、最終的なアウトプットは大抵変わらない。
アプローチによってアウトプットが変わったならそれは、課題の抱える問題を発見したということ。

だから、自分に甘くなろう。その方法は自分が楽な方法、楽な方法に置き換えられない?
そして、楽な方法を極めていこう。






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];

          ・
          ・

    }



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

2011年3月21日月曜日

できないと思うことは自分が無謀というだけであり自分の無能ではない。

何かを学ぼうとして
面倒くさい。
自分に向いてない。
と思うことがある。

似たような感情をRPGゲームの世界で、感じたことがある。
ゲームを始めたばかりのとき、本筋のルートを大きくはずれて出会ったしまった圧倒的な強さの敵に対して抱く感情そのものだ。

このときの対処はいたって簡単だ。本筋からどこで外れたかを特定し本筋のルートに戻るということだ。

Lv1の勇者が大魔王を倒すことはまずできないが、弱い敵から強い敵にステップアップしていく、ゲームメーカーがレベルにあった適切な位置に敵キャラを配置しているのだ。

我々は、現実世界において自由に歩けるマップにおいて出会ってしまった敵が自分が出会ったものは倒せるものと誤解してしまっているのだ。大切なのは、自分のLvを認識しその敵が倒せるLvかどうか判断することだ。
そして、無理と判断したなら、本筋のルートを探るためにもどることだ。きっと出会うべきものに出会っていないのだろう。
それでも対処できないときの方法は一つだけだ。経験値をためてLvを上げること。

Lvの上げかたは、
・簡単な案件の反復
・多彩な方法の理解

反復は、感情を無視してものごとに対処できるようになる。単調な作業を理性が受け付けないという欠点がある。
多彩な方法の理解は、一見楽しいが、頭での理解だけでは、わかった気だけになってしまう。実際手を使わなくてはいけない。

結論、できないと思うことは自分が無謀というだけであり自分の無能ではない。大抵のことは、地道にやっていくしかないのだ。

2011年3月7日月曜日

最初のViewを追加する

WindowBaseのテンプレートを作成。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
    // Override point for customization after application launch.

// View をつくるパターン
// FirstView *view = [[FirstView alloc]initWithFrame:[window frame]];
// [self.window addSubview:view];
// [view release];
//ViewController 
FirstViewController *aViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:[NSBundle mainBundle]];
self.firstViewController=aViewController;
[aViewController release];
[self.window addSubview:[aViewController view]];
    [self.window makeKeyAndVisible];
    
    return YES;
}