- 平成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
このページの上へ戻る
- 平成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

ソース:10 at master from komagata's glut - GitHub
>View Comments
このページの上へ戻る
- 平成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
このページの上へ戻る
- 平成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用から何の変更も無しに動いたのは楽でした。)

http://komagata.org/canvas-prowler/3/
(iPhoneやAndroidでアクセスしてみて下さい)
自分で作る前に、文系プログラマー的にはゲームプログラムはどういう実装をすればいいのかを言葉で知りたかったので実装のイメージ的なところを以前のモノと合わせて言葉で説明したいと思います。
移動方法の実装イメージ:
まず、キャラクターの描画はフレーム毎に定期的に(30fpsとかで)描画します。描画はキャラクタの現在持っている座標に単に描画するだけです。
それとは別にクリックイベントをトリガーとしてプレイヤーキャラクターとクリック地点をプレゼンハムアルゴリズムで直線を引き(実際には描画しない)、その直線の座標を配列としてプレイヤーキャラクターの移動のためのバッファ(キュー)に格納します。
キャラクターはクリックイベントには感知せず、1フレーム毎に自分の移動バッファに座標があれば一つづつ消費しながら自分の座標を変更していき、バッファに無ければ何もしません。
クリックイベント時には移動バッファが残っていても空にした上で新しい経路を設定するのでクリックした瞬間に進路を変更します。
衝突判定:
何かが有る度に、それぞれのオブジェクト(プレイヤー、背景、障害物など)を全て走査、それぞれのオブジェクトが持つプレイヤーフラグ、障害物フラグを見て処理します。(これは関係無いオブジェクトも毎回走査することになるのでとてもヘボイやり方でした。イベント毎にイベントリスナーを登録するように次は変更したいです。)
プレイヤーキャラクターの移動バッファの次の移動場所が障害物フラグを持つオブジェクトと衝突している場合に移動を中止して以降の移動バッファもクリアします。
シンプルなドット絵を対象にしているので四角形と四角形の衝突を判定するのはとても楽です。
少しハマったのは、衝突した時点で移動バッファをクリアするのではなく、衝突する一歩前で次の移動地点を見てバッファをクリアしなければならないというところです。
衝突した時点でバッファをクリアすると、見た目上は分かり辛いですが、一歩分障害物にめり込んでいるので障害物に接触した瞬間動けなくなります。
この変な動きも面白かったですが、プログラムを見直して、なるほどなあと思いました。
次回もこれに新しい要素を付け加えたいと思います。
>View Comments
このページの上へ戻る
- 平成22年3月5日(金) 14時30分10秒
-
区分
- ssh
-
報告者:
- tahara
こんにちは!! tahara です。
例えば host1 を経由して host2 に vnc したい場合どうすればいいか調べてみました。
結果 ↓ のページに書かれてあるとおりすれば可能でした。ありがとうございます。
ssh を多段に使ってずっと遠くにあるマシンに port forward する|裏表(Phinloda のもう裏だか表だか分からないページ)
蛇足になりますが、次の手順で host2 に vnc できました。
>View Comments
このページの上へ戻る
- 平成22年3月4日(木) 23時49分51秒
-
区分
- MacPortsよりfink
-
報告者:
- chiba
こんにちは、chibaです。
MacOSX上などにRails開発環境を複数作らなくてはいけなくて色々試行錯誤しています。
環境は、
- デザイナーさん制作ツール: Coda
- Ruby on Rails
- Apache2
- MacOSXだったり
- Linuxだったり
- 貧乏
という感じで、OS環境を2〜3種跨ぎ、かつ、MacOSXとWindowsは主にデザイナーさんが利用するプラットフォームです。
- Linuxなら直にRoR環境を構築してしまえば良いし、デザイナーさん達がLinuxは使うことはない
- MacOSXも直にMacPortsなどを利用してRoR環境を構築すれば良いけれど、デザイナーさん達はMacOSXをメインに使うらしいので、勝手に各自RoR環境を構築してみて下さいとも言いがたい
- 何か問題が起きた場合に、各自で環境を構築してもらうと、何がどうなってエラーになっているのか探るのが面倒臭い
という状況でした。
適当に考えた末、VirturlBox上にRoRの環境を構築し、そのVMイメージを皆で共有すれば楽チンで良いに違いない!ということで試しに、MacOSXの上にVirturlBoxを導入してみました。
ホスト<=>VM間のファイル共有はNFS。
本当は、VirturlBoxの共有ファイル機能を利用したかったのですが、なんだか上手く動かせなかったのでNFSに。
ローカルのファイルをCodaで編集して、Apache/VirturlBoxがホストするページをローカルのブラウザで眺める、という感じで作業してもらうことになりました。
MacOSXは、NFSなどの上で作業すると、._unkoや、.DS〜というファイルを大量にばらまきますが、この構成の場合、作業ディレクトリはホスト側なのでそういうこともありません。
とりあえず、LinuxとMacOSXをホストにして実際に使ってみていますが、可もなく不可もないような、微妙な環境ができあがりました。
もっと他にナイスな組み合わせを教えてください…。■
>View Comments
このページの上へ戻る
- 平成22年3月3日(水) 18時31分08秒
-
区分
- canvas
-
報告者:
- komagata
火曜日担当なのに間に合わずに水曜日にアップしている2010生まれてこなかった方が良かった男オブザイヤー候補、komagataです。
canvasでウロウロするのをiPhoneにフィットするように修正しました。

http://komagata.org/canvas-prowler/2/
解像度がファミコンは224x256に対してiphoneは320x480なので細かいですね。
ソース:2 at master from komagata's canvas-prowler - GitHub
>View Comments
このページの上へ戻る
- 平成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
このページの上へ戻る