2013年5月15日水曜日

自信を取り戻す方法


自信を失って生きる意味を考えていましたが、今回フルスクラツチしたLoopPlayerのおかげで、最近自分の成長に対する疑問に対し、ソースのブラッシュアップを感じられ少し自信を取り戻すことができました。

再び自信を失ったときのために、人は意外と無駄に時間をすごしていないといことを感じられそうなことを記載しておきます。


1、過去やったことをもう一度やる
1回目の経験、それ以外の関係ない経験が意外と生きていて、一回目よりうまくいくはずです。

2、自分がおもっているより簡単なことをやる
周りからの期待、立場から必要以上に自分に求めすぎていませんか。
選ばれた戦士でも、スライムからコツコツと経験を積むものです。

2、よかったときを思い出す
Blog、日記等にそのとき、感じたよかったことを記載しておき、つまったとき、そのよかったことを中心に
思考をめぐらせてみる。

3、10倍、時間をかけてやってみる
時間をかければ、たいていのことは、普通にやるより丁寧になり見栄えがよくなります。
あとは、回数を重ね経験で時間を縮めていくだけ。

4、本をたらふく買う
1冊の本に大事なことは3行ぐらいしかないんです。
わからない、理解できないのは、著者が悪いんです。

5、デッサンをする
細かいほど、ぼけーとして集中できる。
最終的にやりきれる自信と成果物がのこる。
(ブラックゴールドソーのフュギア買ってしまいました)

6、しばらくなにもしない
テンションがあがるのを待つ
今回は、ゴールデンウィークとして2週間ぐらい休んでいて、さすがに最後の方になにかしたくて
はじめました。

7、早歩きして、前歩いている人を抜く


結論、
自分を過小、過大評価せず、
小さいできることを確認しつつ、
自分の可能性を感じることが自信を取り戻すこと一歩かもしれません。


✨当該アプリは2周年感謝で2013/05/19の日曜まで無料にしてます。
https://itunes.apple.com/jp/app/loop-player/id438691099?mt=8




2013年4月17日水曜日

何もできなくなってしまった自分をもう一度見直す

春なのでそんな反省を始めた。村上春樹に触発されて文章が書きたいだけかもしれない。
でも、今、自分を見直さないといけない気がしているのも事実なのです。

原因1
・目的が不明確、達成目標が多すぎる
例)
アプリを作るときに求めること。
・売れる
・ダウンロードされる
・アプリ作成技術がつく
・デザインしたい
・音作りたい
・自分の表現
・アプリを発表する

達成目標が少ないほど、対応策がたてやすいのはわかりきていることなのに、欲張ってしまい、
結局なにもできません。

対策1
・スケージュールから決めて、目標を選択する
・大切なこと、できることを選択する

原因2
目的が明確でない
例)
・売れるアプリ
こんなものは目標でもなんでもない。

対策2
・模写
・〜のようなもの
・〜の何かが最適されたもの
というのと、出力と比べられて、達成感と意味がもたらされる。

細かい部分でも
・線を引く という目標よりも、 柔らかい直線をかけるようになる
・このロジック、こうする方が分かりやすいかも
のほうが工夫もしやすい

原因3
考え過ぎると動けなくなる

対策3
モックをさくっと作れる方法、環境を用意できないかなあ。
準備が必要。(素材)

飛べない豚はただの豚なので
もう一度、トンでみたいと思うのです。

2012年12月11日火曜日

価値を他人に共有すること

あるモノの価値は、評価する人によってかわる。2人だった場合、相手の趣向が加わり、多人数になった場合、より抽象性がますのだろう。
個人の思考によっているかぎり、その価値を考える人は何を評価するのだろうと自分が考えているので極論では、自分が最高、自分が何をやっても相手が喜ぶと確信してしまっているひとにとっては、相手の事象に対しても自分での価値に変換されるだろう。

なので、より客観的に事象を共有するためには、「モノサシ」という価値をはかるものが必要になってくる。
ただ、評価するものが、単純な長さ、重さならともかく、主観が入ってきそうなかっこいい、かわいいとかを全体に共有する値は、難しい。

最近、洋服を一定の水準にしようと考えた。しかし自分は、基準になる知識もなかったので、ある程度、「お金」が高いモノを選んだ。

自分にセンスに自信がある人は、どんなものを着てもすばらいと胸をはって言えるのだろうが、第三者に説明をしようとしたときに、ここに、青を入れることによってしまるといって理解できないひともいる。
しかし、この服は、10万円したといった場合、結構な価値があるんだねと感じてもらえる。

これは、見た目という意味では、何もみたしていないかもしれないが、周りにたいして洋服の価値について一定の説明をしている。

これは、仕事にもいえるんじゃないかと考えた。
出来上がりが最高なものを目指す考え方(主観)と
プロジェクトを管理(客観)

プロジェクトを進めるにあたって、作る人間とは別に、経営者や戦略を考えるひとによっての価値は、
モノ自体の価値はわからないので、何らかの価値を示さなくてはならない。
それは、時間やお金なのだ。それらをかけると一定の水準のものが生まれると信じられているし、コストに直結するので、判断が単純化する。

価値を他人と共有することは、他人が持っているだろうモノサシではからなくてはいけないので、
身長を体重計ではかるというようなことが常に生じているのではと考えてしまったのだ。

2012年9月27日木曜日

[iOS,Box2D]衝突検知


1,Listenerを使う方法
class ContactListener:public b2ContactListener{
private:
    void BeginContact(b2Contact* contact){
        printf("#BeginContact ");
    }
    void PreSolve(b2Contact* contact, const b2Manifold* oldManifold){
    }
    void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse){
    }
    void EndContact(b2Contact* contact){
    }
};

これを、Worldにセットしてあげればいい。

    b2Vec2 gravity(0.0f, 10.0f);
    world=new b2World(gravity);
    world->SetContactListener(&contactListener);

2,Setpをすすめるときに、直接「contactList」をチェックする
for(b2Contact *contact=world->GetContactList();contact!=nil;contact = contact->GetNext(),i++){
        
        b2Vec2 v= contact->GetFixtureB()->GetBody()->GetLinearVelocity();
        b2Contact *contact2=contact->GetNext();
        
        printf("nomal: %x,%x \n", contact,contact2);
        
        b2Manifold* m= contact->GetManifold();
        int cc=m->pointCount;
        if(v.Length()>0.1){
            printf("v.Length(): %f \n", v.Length());
            printf("cc: %d x:%f y:%f \n", cc,v.x,v.y);
            printf("%d #1-%s \n",i,[((UserData*)(contact->GetFixtureA()->GetBody()->GetUserData())).str UTF8String]);
            printf("%d #2-%s \n",i,[((UserData*)(contact->GetFixtureB()->GetBody()->GetUserData())).str UTF8String]);
        }
        
    }

1,2の方法の違い
通常は1の場合が便利、
2の場合は、接触している間、contactListに入っているので、初回のインパクトかどうかを判断する必要がある。
2はworldだけでなくbodyで取得できるので、対象をしぼったリストを取得することもできる。

2012年8月1日水曜日

[iOS]UIKitでBox2Dを使おう

xCode4.4で作業しました。
プロジェクトはとりあえず、SimpleView

Box2d

http://box2d.org/
をダウンロードしてBox2DフォルダをプロジェクトにDrop.


projectのbuild setting
Always User Search paths :YES
Header serach paths に上記ディレクトリをフルパスで追加
Library search pathsに上記ディレクトリをフルパスで追加

とりあえず、サンプルHelloWorld.cppにあるソースをほぼコピーで動作確認。

ViewController.mmに拡張子を変更して、見た目ようにUiviewを用意しました。



#import "ViewController.h"
#import

@interface ViewController (){
    b2World* w;
    b2Body* body;
}
@end

@implementation ViewController
//@synchronized obj;

- (void)viewDidLoad
{
    [super viewDidLoad];
    b2Vec2 gravity(0.0f, -10.0f);
    w=new b2World(gravity);
    
// Define the ground body.
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0.0f, -10.0f);
    
// Call the body factory which allocates memory for the ground body
// from a pool and creates the ground box shape (also from a pool).
// The body is also added to the world.
b2Body* groundBody = w->CreateBody(&groundBodyDef);
    
    // Define the ground box shape.
b2PolygonShape groundBox;
    
// The extents are the half-widths of the box.
groundBox.SetAsBox(50.0f, 10.0f);

    // Add the ground fixture to the ground body.
groundBody->CreateFixture(&groundBox, 0.0f);

    
    // Define the dynamic body. We set its position and call the body factory.
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(0.0f, 4.0f);
body = w->CreateBody(&bodyDef);

    
    
    // Define another box shape for our dynamic body.
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(1.0f, 1.0f);

    // Define the dynamic body fixture.
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
    
    // Set the box density to be non-zero, so it will be dynamic.
fixtureDef.density = 1.0f;
    
// Override the default friction.
fixtureDef.friction = 0.3f;
    
// Add the shape to the body.
body->CreateFixture(&fixtureDef);
    
//世界はタイマーですすみます。
    float32 timeStep = 1.0f / 60.0f;
    NSTimer *timer = [NSTimer
                      scheduledTimerWithTimeInterval:timeStep
                      target:self
                      selector:@selector(updateWorld:)
                      userInfo:nil
                      repeats:YES
                      ];

}

-(void)updateWorld:(NSTimer *)timer{
    int32 velocityIterations = 6;
int32 positionIterations = 2;
    w->Step([timer timeInterval], velocityIterations, positionIterations);
    
    // Now print the position and angle of the body.
    b2Vec2 position = body->GetPosition();
    float32 angle = body->GetAngle();
    CGRect rect=self.obj.frame;
    rect.origin.x=position.x*32;
    rect.origin.y=position.y*32;
    self.obj.frame=rect;
    //printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);
    
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end



動作確認はできたけど、座標系がUIKitのままだと、逆なのと、スケールもあってないので、調整が必要、32倍してとりあえず動いているのを確認。あと回転とかかな。



2012年6月27日水曜日

[iOS]代入してから変更する理由

最初のころ、viewの位置を動かすときなど、
view.frame.orign.x=100
みたいにやって変更できないことに悩んだ。

以下のようにやるとうまくいく、
CGRect rect=view.frame
rect.origin.x=100.0;
view.fame=rect;

理由を考えずにいたが、考えたら答えがすぐ出て来なかったのでここに書いておきます。

CGRect rect=view.frame
ができていることから、
view.frameがCGRectのコピーを返していることがわかる。

コピー origin.x にアクセスして値を変えてもview.frame自体の値が
変わるわけがないというもっともな答えにいきついた。

CGRectが構造体なのでもっともといえば、もっともな答えでした。

2012年5月7日月曜日

[unity][plugin]Viewを画面に追加する


親のViewを取得しようとして
[UIApplication sharedApplication].delegateから
「iPhone_target2AppDelegate」を取得しようとしたのだけれども、
実は使われてなくて

「AppController」だった。
で、viewは下記のように取得するのが良さそう。


[unity3.5.1]
xcodeにて
extern UIViewController *UnityGetGLViewController();


UIView view=[[UIView alloc]initWithFrame:CGRectMake(0,0, 320, 640)];
view.backgroundColor=[UIColor redColor];
[UnityGetGLViewController().view addSubview:view];

UnityGetGLViewControllerでviewが取得できるのでそこに追加できそう。
拡張子は、.mmじゃないとコンパイルリンクできない。

extern "C"{}の中にbind関数が定義されて、最初動かなかった。取りあえず、括弧の中から外してbuild.

int  UnityGetTargetFPS();とかも使う場面があるかも。