Core Animationで遊んでみる (1)

平成22年3月17日(水) 11時26分17秒
区分
報告者:
masuda

こんにちは。masudaです。
三寒四温な日々が続いていますが、いかがお過ごしでしょうか?

Leopardの目玉機能の一つはCore Animationでした。
Appleの触れ込みによると、Core Animationを利用すると簡単にアニメーション処理を追加することができるそうです。

なんですが、アニメーションではないところでも、便利に使うことができます。
今回はiPhone SDKを用いて、そのちょっと便利な使い方を書こうと思います。

以下のサンプルでは全部
QuartzCore.frameworkをincludeし

#import <QuartzCore/QuartzCore.h>
とimportをすることが必要です。

UIViewを角丸にする

UIViewを角丸にするのはとても簡単です。

[[view layer] setCornerRadius:10.0];
[view setClipsToBounds:YES];

UIViewに枠線を追加する

[[view layer] setBorderColor:[[UIColor lightGrayColor] CGColor]];
[[view layer] setBorderWidth:1.0];

setBorderColorメッセージの引数はCGColorなので、上記のようにUIColorからCGColorに変更してあげる必要があります。

>View Comments          このページの上へ戻る

glpngをmacで使う

平成22年3月17日(水) 02時01分11秒
区分
OpenGL
報告者:
komagata

飲み屋での一杯目は「水」。komagataです。

canvas上の何も無いも同然なグラフィックAPI上でアプリを書いてきましたが、WebGLというOpenGL ESベースのAPIの実装が始まってるそうなのでまずはOpenGLの勉強を始めました。

デスクトップアプリケーションのGUIツールキット部分はWebとは関係無い(=canvasみたいな感じになるはずな)ので、GLUT(The OpenGL Utility Toolkit)を使って行きます。

とりあえずpngを簡単に読み込みたかったのでglpngというライブラリを使おうとしたのですが、各地でリンク切れ。前世紀にメンテが終わってるっぽい雰囲気ですが、下記(OpenBSDのリポジトリ)に有りました。

ftp://ftp.usa.openbsd.org/pub/OpenBSD/distfiles/glpng-1.45/glpng.zip

どうせWebのためにやるのでOS依存部分で苦労したくないんですが、Macでコンパイルするのに少し修正する必要がありました。

% diff glpng.c glpng.c.org
28,29c28,29
< #include <GLUT/glut.h>
< #include "GL/glpng.h"
---
> #include <GL/glpng.h>
> #include <GL/gl.h>

付属のMakefile.LINUXでmakeすれば静的ライブラリ(libglpng.a)が出来ます。(Makefile.SGIってファイルも付いてるのが古さを感じます)

pngInfoとpngBind関数が使えるようになるので簡単にpngファイルが簡単にテクスチャとして貼れました。

#include <stdio.h>
#include <GLUT/glut.h>
#include "glpng.h"

GLuint texture;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(0, 0, 0);
        glBindTexture(GL_TEXTURE_2D, texture);
    glPopMatrix();
  
    glBegin(GL_QUADS);
        glTexCoord2d(0.0, 1.0);
        glVertex2d(-1, -1);
        glTexCoord2d(1.0, 1.0);
        glVertex2d(1, -1);
        glTexCoord2d(1.0, 0.0);
        glVertex2d(1, 1);
        glTexCoord2d(0.0, 0.0);
        glVertex2d(-1, 1);
    glEnd();
    glFlush();
} 

void init()
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glColor3d(1.0, 1.0, 1.0);
    glEnable(GL_TEXTURE_2D);
  
    pngInfo info;
    texture = pngBind("tree.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);
} 
  
int main(int argc, char** argv)
{ 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(100, 100);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("hunter");
    glutDisplayFunc(display);
    init();
    glutMainLoop();
} 
Macのframeworkという仕組みがイマイチわかってないんですが、下記でコンパイルできました。

% cc -framework GLUT -framework OpenGL -o game game.c libglpng.a

tree

ソース:10 at master from komagata's glut - GitHub

>View Comments          このページの上へ戻る

Lisp on Rails 第5回 〜 has-one

平成22年3月12日(金) 23時56分46秒
区分
Lisp on Rails
報告者:
tahara

こんにちは!! tahara です。 Lisp on Rails 第5回です!

今回は ActiveRecord の has_one アソシエーションもどきを実装したいと思います。 前回の has_many に瓜二つです。 ar-has-one-direct-slot-definition と ar-has-one-effective-slot-definition を定義します。

(defclass ar-has-one-slot-mixin ()
  ((has-one :initarg :has-one
            :initform nil
            :accessor has-one)
   (class-symbol :initarg :class-symbol
                 :initform nil
                 :accessor class-symbol)))

(defmethod initialize-instance :after ((self ar-has-one-slot-mixin) &rest args)
  (declare (ignore args))
  (unless (class-symbol self)
    (setf (class-symbol self) (has-one self))))

(defclass ar-has-one-direct-slot-definition (ar-direct-slot-definition
                                             ar-has-one-slot-mixin)
  ())

(defclass ar-has-one-effective-slot-definition (ar-effective-slot-definition
                                                ar-has-one-slot-mixin)
  ())

direct-slot-definition-class と effective-slot-definition-class と compute-effective-slot-definition でゴニョゴニョすると上記の slot-definition が使えるようになります。

slot-value-using-class と (setf slot-value-using-class) で関連テーブルの 取得と設定を行います。

(defmethod c2mop:slot-value-using-class
  ((class active-record-class)
   instance
   (slot-def ar-has-one-effective-slot-definition))
  (aif (call-next-method)
       it
       (setf (slot-value instance (has-one slot-def))
             (car (all (find-class (class-symbol slot-def))
                       :conditons (list (key-sym (class-name class) '-id)
                                        (%value-of instance :id)))))))

(defmethod (setf c2mop:slot-value-using-class) :after
           (new-value
            (class active-record-class)
            instance
            (slot-def ar-has-one-effective-slot-definition))
   (when new-value
     (setf (%value-of new-value (str (class-name class) "-id"))
           (%value-of instance :id))))

で、だいたいこんな感じで使えるようになります。

(def-record post
  (:has-many comments)
  (:has-one post-info))
(def-record post-info
  (:belongs-to post))
(let* ((post (car (all post)))
       (post-info (post-info-of post)))
  (describe post-info))

以上、なんとなく has-one できました。 ソースはこちらから http://github.com/quek/lisp-on-rails

第6回につづきます。

すみません。 次回はコピペじゃないように頑張ります。

>View Comments          このページの上へ戻る

思い込み、こわいです

平成22年3月12日(金) 01時03分51秒
区分
WordPress
報告者:
chiba

こんにちは、chibaです。
いきなりWordPressの話なのですが、私はこれまで、WordPressとは、HTML内のリンクというリンクにhttp〜というURLをベタベタと詰め込めるだけ詰め込む生き物だと思っておりました。
これが故に、作成したサイトを別のURLを持つテストサイト等にコピーする際にも、SQLで色々するはめになるものだと思っておりました。
「せめてURLじゃなくて"/"から始まってくれれば良いのに…」と思いながらDBをいじっておりましたが、ふと、SQLでsiteurlに"/"を入れてみたところ普通に"/"からという記述で動くことが分かりました。
おやおや?ということで、この状態で、

設定 > 一般設定 > WordPress のアドレス (URL)
を眺めたところ、内容は空になっておりました。ものは試しに"/"を入力してみましたが、どうも末尾の"/"は消されて空になる様子
なんだWordPress内でURL指定じゃなくて、絶対パスでの指定ができるんじゃないかと!
WordPress のアドレス (URL)
の(URL)という表現が紛らわしいですよね。
※ちなみに最初の設定時ではなく、稼働中のものを途中で変更すると色々壊れてしまい、SQLで色々するハメになる場合がありますのでご注意下さい

>View Comments          このページの上へ戻る

UITableViewCellの高さを内容に合わせて変化させる

平成22年3月10日(水) 15時29分42秒
区分
objective-c
報告者:
masuda

こんにちは。

今回はUITableViewにおいてcellの高さをcellの内容に合わせて変化させるということをやってみます。

Natsuliphoneのソースを参考にさせていただきました。

UITableViewでcellの高さを設定するには、UITableViewDelegateのtableView:heightForRowAtIndexPath:メソッドを実装して高さを返してあげます。
ただ、ここに問題があってこのメソッドが呼び出される時点ではcellができていないのです。
ですので、cellForRowAtIndexPath:メソッドなどでcellを取得してそのcellの高さを返すというような方法をとることができません。

そこで対象となるcellに高さを計算するためのクラスメソッドを実装し、そこで得られた値をtableView:heightForRowAtIndexPath:に返します。

+ (CGFloat)heightWithContents:(NSString *)contents
{
    CGFloat result;
    CGSize  labelSize;

    result = 0.0;
    labelSize = [contents sizeWithFont:[UIFont systemFontOfSize:16.0]
                     constrainedToSize:CGSizeMake(300.0, 10000)
                         lineBreakMode:UILineBreakModeWordWrap];
    result += labelSize.height;

    return result;
}

複数行にわたるtextの高さを求めるにはsizeWithFont:constrainedToSize:lineBreakMode:メソッドを使用します。
sizeWithFont:forWidth:lineBreakMode:メソッドは1行だけのサイズを返しますので、名前にだまされないようにしてください。

参考: Natsuliphoneのソース

>View Comments          このページの上へ戻る

衝突判定でウロウロする

平成22年3月9日(火) 04時44分40秒
区分
canvas
報告者:
komagata

身に覚えの無い商品がAmazonから送られてくる。komagataです。

canvasでウロウロするものに衝突判定を追加してみました。

(今回はAndroidエミュレーターで機種はNexus Oneで動作させてみましたが、webkitなのでiPhone用から何の変更も無しに動いたのは楽でした。)

5554:nexus_one

http://komagata.org/canvas-prowler/3/

(iPhoneやAndroidでアクセスしてみて下さい)

自分で作る前に、文系プログラマー的にはゲームプログラムはどういう実装をすればいいのかを言葉で知りたかったので実装のイメージ的なところを以前のモノと合わせて言葉で説明したいと思います。

移動方法の実装イメージ:

まず、キャラクターの描画はフレーム毎に定期的に(30fpsとかで)描画します。描画はキャラクタの現在持っている座標に単に描画するだけです。

それとは別にクリックイベントをトリガーとしてプレイヤーキャラクターとクリック地点をプレゼンハムアルゴリズムで直線を引き(実際には描画しない)、その直線の座標を配列としてプレイヤーキャラクターの移動のためのバッファ(キュー)に格納します。

キャラクターはクリックイベントには感知せず、1フレーム毎に自分の移動バッファに座標があれば一つづつ消費しながら自分の座標を変更していき、バッファに無ければ何もしません。

クリックイベント時には移動バッファが残っていても空にした上で新しい経路を設定するのでクリックした瞬間に進路を変更します。

衝突判定:

何かが有る度に、それぞれのオブジェクト(プレイヤー、背景、障害物など)を全て走査、それぞれのオブジェクトが持つプレイヤーフラグ、障害物フラグを見て処理します。(これは関係無いオブジェクトも毎回走査することになるのでとてもヘボイやり方でした。イベント毎にイベントリスナーを登録するように次は変更したいです。)

プレイヤーキャラクターの移動バッファの次の移動場所が障害物フラグを持つオブジェクトと衝突している場合に移動を中止して以降の移動バッファもクリアします。

シンプルなドット絵を対象にしているので四角形と四角形の衝突を判定するのはとても楽です。

少しハマったのは、衝突した時点で移動バッファをクリアするのではなく、衝突する一歩前で次の移動地点を見てバッファをクリアしなければならないというところです。

衝突した時点でバッファをクリアすると、見た目上は分かり辛いですが、一歩分障害物にめり込んでいるので障害物に接触した瞬間動けなくなります。

この変な動きも面白かったですが、プログラムを見直して、なるほどなあと思いました。

次回もこれに新しい要素を付け加えたいと思います。

>View Comments          このページの上へ戻る

多段 ssh で vnc

平成22年3月5日(金) 14時30分10秒
区分
ssh
報告者:
tahara

こんにちは!! tahara です。

例えば host1 を経由して host2 に vnc したい場合どうすればいいか調べてみました。 結果 ↓ のページに書かれてあるとおりすれば可能でした。ありがとうございます。

ssh を多段に使ってずっと遠くにあるマシンに port forward する|裏表(Phinloda のもう裏だか表だか分からないページ)

蛇足になりますが、次の手順で host2 に vnc できました。

>View Comments          このページの上へ戻る

MacOSX上でMacPortsを使わずにRails開発環境を作る

平成22年3月4日(木) 23時49分51秒
区分
MacPortsよりfink
報告者:
chiba

こんにちは、chibaです。
MacOSX上などにRails開発環境を複数作らなくてはいけなくて色々試行錯誤しています。
環境は、

  • デザイナーさん制作ツール: Coda
  • Ruby on Rails
  • Apache2
  • MacOSXだったり
  • Linuxだったり
  • 貧乏
という感じで、OS環境を2〜3種跨ぎ、かつ、MacOSXとWindowsは主にデザイナーさんが利用するプラットフォームです。
  1. Linuxなら直にRoR環境を構築してしまえば良いし、デザイナーさん達がLinuxは使うことはない
  2. MacOSXも直にMacPortsなどを利用してRoR環境を構築すれば良いけれど、デザイナーさん達はMacOSXをメインに使うらしいので、勝手に各自RoR環境を構築してみて下さいとも言いがたい
  3. 何か問題が起きた場合に、各自で環境を構築してもらうと、何がどうなってエラーになっているのか探るのが面倒臭い
という状況でした。
適当に考えた末、VirturlBox上にRoRの環境を構築し、そのVMイメージを皆で共有すれば楽チンで良いに違いない!ということで試しに、MacOSXの上にVirturlBoxを導入してみました。
ホスト<=>VM間のファイル共有はNFS。
本当は、VirturlBoxの共有ファイル機能を利用したかったのですが、なんだか上手く動かせなかったのでNFSに。
ローカルのファイルをCodaで編集して、Apache/VirturlBoxがホストするページをローカルのブラウザで眺める、という感じで作業してもらうことになりました。
MacOSXは、NFSなどの上で作業すると、._unkoや、.DS〜というファイルを大量にばらまきますが、この構成の場合、作業ディレクトリはホスト側なのでそういうこともありません。
とりあえず、LinuxとMacOSXをホストにして実際に使ってみていますが、可もなく不可もないような、微妙な環境ができあがりました。
もっと他にナイスな組み合わせを教えてください…。■

>View Comments          このページの上へ戻る

canvasでウロウロする(2)

平成22年3月3日(水) 18時31分08秒
区分
canvas
報告者:
komagata

火曜日担当なのに間に合わずに水曜日にアップしている2010生まれてこなかった方が良かった男オブザイヤー候補、komagataです。

canvasでウロウロするのをiPhoneにフィットするように修正しました。

canvas prowler2

http://komagata.org/canvas-prowler/2/

解像度がファミコンは224x256に対してiphoneは320x480なので細かいですね。

ソース:2 at master from komagata's canvas-prowler - GitHub

>View Comments          このページの上へ戻る

UITextFieldに入力されている文字数を動的に、非同期に数える。

平成22年3月3日(水) 11時06分22秒
区分
objective-c
報告者:
masuda

2週間連続で原稿を落としたmasudaです。
こんにちは。

あまりググればわかるということは書きたくはないなと思っているので、なかなかネタを見つけるのは難しいです。

今回はiPhoneアプリを書いているときにはまったところで、ググってもなかなか答えが見つからないことを書きたいと思います。

2つあるので2週間はこれで持つ!

とあるUITextFieldによる入力フォームと、UIBarButtonItemによる「完了」ボタンがある画面を考えます。

今回のエントリの目的はUITextFieldに文字が入力されていない、つまり空であるときは、「完了」ボタンを表示しない画面を作成するということです。

ポイントはUIControlEventEditingChangedイベントを使うこと。
最初はUITextFieldDelegateのtextField:shouldChangeCharactersInRange:replacementString:とかを使用することを考えましたが、文字を消去したときにボタンが消えない等々うまくいきませんでした。

サンプルコードを書いてみます。

- (void)setupUserInterface
{
    UIView      *contentView;
    UITextField *textField;

    contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self setView:contentView];
    [contentView release];

    doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                               target:self
                                                               action:@selector(respondsToDoneButtonTouchDown:)];

    textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
    [contentView addSubview:textField];
    [textField release];
    [textField addTarget:self
                  action:@selector(respondsToEditingChanged:)
        forControlEvents:UIControlEventEditingChanged];
}


- (void)respondsToEditingChanged:(id)sender
{
    if ([sender isKindOfClass:[UITextField class]])
    {
        // 本当はsenderを用いずにメンバ変数とかにしておけばいいのだけれど、今回はあえて型変換をしてみる。
        if ([[(UITextField *)sender text] length])
        {
            [[self navigationItem] setRightBarButtonItem:doneButton animated:YES];
        }
        else
        {
            [[self navigationItem] setRightBarButtonItem:nil animated:YES];
        }
    }
}

参考
Disable button if textField is empty - iPhone SDK Development

>View Comments          このページの上へ戻る

技師部隊からの
お知らせ

インフルエンザに気をつけて頑張っています

本頁の来客数
一万八千六百三名

メンバー一覧

アクトインディ技師部隊員名簿

アクトインディへ

投稿する

カテゴリー

アクトインディ

aaaa