- 追加された行はこの色です。
- 削除された行はこの色です。
ごきげんよう、ハイテクです。
前回に引き続いて
&br;
*** リソースの用意、クラスの作成 [#o4504b1a]
まず、このページの左上にある「あひる」を保存します。
#ref(ピクチャ 2.png)
&br;
これをプロジェクトに追加します。
ウインドウにドラッグ&ドロップです。
#ref(ピクチャ 3.png)
&br;
続いて、オブジェクトを追加します。
新規ファイルから「ArteOGLObject」のテンプレートをもとに新規クラスを作成します。
「Duck」クラスと名付けましょう。
- Duck.h
//
// Duck.h
// ArteOGLSample
//
// Created by 計算技術 on 09/10/22.
// Copyright 2009 K3. All rights reserved.
//
#import <ArteOGL/ArteOGL.h>
@interface Duck : ArteOGLObject {
}
@end
- Duck.m
//
// Duck.m
// ArteOGLSample
//
// Created by 計算技術 on 09/10/22.
// Copyright 2009 K3. All rights reserved.
//
#import "Duck.h"
@implementation Duck
- (id)init{
if(self =[super init]){
//coordmode = ArteOGLObjectSystemCoordMode or ArteOGLObjectVirtualCoordMode;
//lifecount = -1;
//extralife = 20;
//attackFlag = NO;
//targetFlag = NO;
//physicalFlag = NO;
//staticFlag = NO;
//livingFlag = YES;
}
return self;
}
/*
- (void)setProperty:(NSDictionary *)dic{
[super setProperty:dic];
//if([dic objectForKey:@""]!=nil) ;
}
*/
- (void)OGLcalc:(id <ArteOGLViewProtocol>)arteview{
//write calcuration code here
[super OGLcalc:arteview];
}
- (void)OGLdraw:(id <ArteOGLViewProtocol>)arteview{
// write draw code in here
if(texblend)[arteview setBlendMode:texblend];
if(rotatedegree!=0)[arteview enterRotate:rotatedegree withCenter:texpoint offset:rotateorigin];
[arteview frameRect:NSMakeRect(texpoint.x,texpoint.y,texsize.width,texwidth.height)];
if(rotatedegree!=0)[arteview escapeRotate];
if(texblend)[arteview revertBlendMode];
}
@end
テンプレートの段階でもいろいろ書いてありますね。
*** クラスの加筆 [#m4a955f8]
まず、あひるを表示するためにArteOGLImageTextureをインスタンス変数に追加します。
@interface Duck : ArteOGLObject {
ArteOGLImageTexture *tex; //テクスチャ
}
のように、Duck.hのinterfaceのところに追記します。
Objective-Cでは@interface宣言の「{」と「}」の間に変数定義することで
クラスにインスタンス変数を追加することができます。
なお、クラス変数というものはObjective-Cには存在しません。
同等の機能を利用したい場合は、C言語の大域変数を使うのが通例です。
変数を追加したので、先立って解放のコードを追加します。
ガベコレなんてものは使わないのでretain-release制を使います。
忘れがちですが、忘れるとメモリ漏れちゃうぜ。
- (void)dealloc{
[tex release], tex = nil;
[super dealloc];
}
生成・代入についてはOGLcalc:内で行います。
init:内で行っても大丈夫なはずですが、まぁ、なんとなく。
(処理付加分散的にあんまよくないので、このあたりは将来的に変更されるかもです。(ぉぃ )
- (void)OGLcalc:(id <ArteOGLViewProtocol>)arteview{
if(tex == nil){
tex = [[ArteOGLImage sharedTextureNamed:@"duck"] retain];
}
[super OGLcalc:arteview];
}
画像テクスチャは直接生成するのでなくArteOGLImageを通すことでキャッシングを行えます。
描画については
既存のソースを削除し(今回は回転などは使わないので)、テクスチャオブジェクトに描画をさせる一行を追加します。
- (void)OGLdraw:(id <ArteOGLViewProtocol>)arteview{
[tex OGLdrawInRect:NSMakeRect(texpoint.x, texpoint.y, texsize.width, texsize.height) fraction:texalpha];
}
texpoint、texsize、texalphaはArteOGLObjectから継承したインスタンス変数です。
それと、初期化処理の部分。
- (id)init{
if(self =[super init]){
coordmode = ArteOGLObjectSystemCoordMode;
lifecount = -1; //寿命なし。
extralife = 20; //死んだ後のフェード
attackFlag = NO; //攻撃フラグなし
targetFlag = YES; //被攻撃フラグあり
physicalFlag = NO; //物理演算なし
staticFlag = NO; //固定なし
livingFlag = YES; //生存フラグあり
}
return self;
}
コメントアウトを解除し、属性を設定します。
(書き途中