「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

ofxUIKitでBeyondInteractionのofBlobクラスを実現する考察

久しぶりに更新。

ofxUIKitでBeyondInteractionのofBlobクラスを実現しようとした。

今回は、UIKitのUIViewをofCircleの代わりとして実装する事にしました。 ※UIKitオブジェクトを利用する事が頻繁になってくると思われるため。

本書ではC++でofBlobクラスを定義しているが、 ofxUIKitでは以下の様にofBlobクラスをNSObjectのサブクラスとして実装し、 draw();で、MainViewControllerのself.view(=OpenGLのレイヤー)に 対して描画 する為に、 MainViewControllerの参照を取得出来るように実装してみた。 ※少々強引だが。

1.MainViewControllerのインスタンスを取得できるように   クラスメソッドを定義

+ (MainViewContrroller*) sharedController; //宣言

static MainViewController* _sharedInstance = nil;
+ (MainViewController*)sharedController
{
return _sharedInstance;
}

2.MainViewControllerの方は、だいたいこんな感じです。

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

// 他(ofBlob)クラスから、
//  MainViewControllerのポインタを取得出来るように。
_sharedInstance = self;

// ofBlobインスタンスをつくる
blog = [[ofBlog alloc] initWithFrame:CGRectMake(20.0, 20.0, 30.0, 30.0)];
blog.speedX = 3;
blog.speedY = 5;
}

- (void)setup
{
ofBackground(255, 0, 0);
}

- (void)update
{
[blog update];
}

- (void)draw
{
[blog draw];
}

3.カスタムUIViewクラス(ofBlob)の方はこんな感じです。

#import
@class MainViewController;

@interface ofBlog : UIView
{
// オブジェクトのセンター
int x_;
int y_;

// オブジェクトの大きさ
int dim;

// 移動スピード
int speedX;
int speedY;

// 伸縮値
float phase;
float phaseSpeed;
int movedDim;

// MainViewControllerの参照
MainViewController *_instance;
}
@property (nonatomic, assign) UIView *mainView;
@property (nonatomic, assign) int speedX;
@property (nonatomic, assign) int speedY;

// oF的 メソッド
- (void)update;
- (void)draw;

#import "ofBlog.h"
#import "MainViewController.h"

@implementation ofBlog

@synthesize mainView;
@synthesize speedX;
@synthesize speedY;

/*
* 浮動小数点ランダム値取得メソッド
*/
-(float) oofRandom:(float)x y:(float)y
{
float high = 0;
float low = 0;
float randNum = 0;
// if there is no range, return the value
if (x == y) return x; // float == ?, wise? epsilon?
high = MAX(x,y);
low = MIN(x,y);
randNum = low + ((high-low) * rand()/(RAND_MAX + 1.0));
return randNum;
}

/*
* 初期値セット:
* ※初期値は適当です
*/
- (void)_init
{
[self setBackgroundColor:[UIColor whiteColor]];
_instance = [MainViewController sharedController];
speedX = 3;
speedY = 5;

x_ = self.center.x;
y_ = self.center.y;
dim = self.frame.size.width;

phaseSpeed = [self oofRandom:0.1 y:0.5];
phase = 0;
}

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self _init];
}
return self;
}

- (void)dealloc
{
[super dealloc];
}

/*
* oF的 メソッド
*/
- (void)update
{
movedDim = dim + sin(phase)*dim/4;
phase += phaseSpeed;
if (phase > 6.28318530717958647693)
{
phase -= 6.28318530717958647693;
}

x_ += speedX;
y_ += speedY;

if (x_ < dim || x_ > 320 - dim)
{
speedX *= -1;
}

if (y_ < dim || y_ > 460 - dim)
{
speedY *= -1;
}

[self setCenter:CGPointMake(x_, y_)];
CGRect frame = self.frame;
frame.size.width = movedDim;
frame.size.height = movedDim;
[self setFrame:frame];
}

/*
* drawでは、viewのリムーブとaddSubviewのみを行う
*/
- (void)draw
{
[self removeFromSuperview];
[_instance.view addSubview:self];
}
@end