home > 投稿 > Objective-C as Flash : Sprite
2009/05/25

Objective-C as Flash : Sprite


CALayer だとボタンやテキストフィールドが乗らないので UIView で Sprite を作りました。

速度的にはCALayerだけの方が速い気がしますが( OpenGL の方が速いらしいです。)
UIパーツを使うならこっちの方が便利です。
※8/11追記:NSObjectを継承させていますがUIResponderが入らないのでTouchイベントが来ないことになります。
ドラッグとかピンチを書きたい場合はUIResponderに挿げ替えるか、UIViewの子を継承させてパラメータをやりくりさせるようなものを作る方がいいかも。


import するとこんな風に書けます


//ボタン作成君
Sprite* buttonMc(NSString *img, NSString *touch_img){
	UIButton	*b	= [UIButton buttonWithType:UIButtonTypeCustom];
	UIImage		*up	= [UIImage imageNamed:img];
	UIImage		*down	= [UIImage imageNamed:touch_img];
	[b setBackgroundImage:up	forState:UIControlStateNormal];
	[b setBackgroundImage:down	forState:UIControlStateHighlighted];
	b.layer.frame = CGRectMake(0,0,up.size.width,up.size.height);
	return [[Sprite alloc] by:b];
}

//アプリケーション起動後
- (void)applicationDidFinishLaunching:(UIApplication *)application {    
	Sprite *stage	= [[Sprite alloc] by:window];
	Sprite *bg	= [[Sprite alloc] by:@"bg.png"];
	[stage addChild:bg];
	
	Sprite *spr	= [[Sprite alloc] initWithFrame:stage.frame];
	Sprite *button	= buttonMc(@"button.png",@"button_press.png");
	[spr addChild:button];
	
	spr.x = 50;
	spr.y = 50;
	spr.alpha = 0.5f;
	spr.scale = 0.5f;
	spr.rotation = 90.0f;
	
	[stage addChild:spr];
	[window makeKeyAndVisible];
}

※ よく使うプロパティも何個か追加しました。

Sprite.h

//
//  Sprite.h
//  Sprite
//
//  Created by ao on 09/05/25.
//  Copyright 2009 bascule. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface Sprite : NSObject {
	float		width;
	float		height;
	float		x;
	float		y;
	
	float		alpha;
	Sprite		*parent;
	float		rotation;
	float		scale;
	BOOL		visible;
	BOOL		enabled;
	
	
	CGAffineTransform transform;
	
	UIView		*view;
	CALayer		*layer;
	//NSString	*text;
	CGRect		frame;
	CGPoint		position;
	CGPoint		offset;
}

- by:(id)anObject;
- init;
- initWithFrame:(CGRect)aFrame;
- initWithView:(UIView*)aView;
- initWithImage:(UIImage*)anImage;
- initWithImageNamed:(NSString*)anImageName;

- (void)setFrame:(CGRect)aFrame;
- (CGRect)frame;

- (void)setWidth:(float)aWidth;
- (float)width;

- (void)setHeight:(float)aHeight;
- (float)height;

- (void)setPosition:(CGPoint)aPoint;
- (CGPoint)position;

- (void)setX:(float)aX;
- (float)x;

- (void)setY:(float)aY;
- (float)y;

@property float alpha;
@property (nonatomic, retain) Sprite *parent;

@property CGAffineTransform transform;
- (void)setTransform:(CGAffineTransform)aTransform;
- (CGAffineTransform)transform;
CGAffineTransform matrix(float aScale,float aRotation);

- (void)setRotation:(float)aRotation;
- (float)rotation;
- (void)setScale:(float)aScale;
- (float)scale;
- (void)setVisible:(BOOL)aVisible;
- (BOOL)visible;
- (BOOL)enabled;
- (void)setEnabled:(BOOL)anEnabled;

@property (nonatomic, retain) UIView *view;
- (CALayer*)layer;

- (void)addChild:(Sprite*)mc;

@end


Sprite.m

//
//  Sprite.m
//  Sprite
//
//  Created by ao on 09/05/25.
//  Copyright 2009 bascule. All rights reserved.
//

#import "Sprite.h"

@implementation Sprite
@synthesize view;
@synthesize parent;

- initWithView:(UIView*)aView{
	[super init];
	view		= aView;
	self.frame	= view.layer.frame;
	alpha		= 1;
	rotation	= 0;
	scale		= 1;
	visible		= true;
	return self;
}

- initWithFrame:(CGRect)aFrame{
	[self initWithView:[[[UIView alloc] initWithFrame:aFrame] autorelease]];
	return self;
}

- init{
	[self initWithFrame: CGRectMake(0,0,0,0)];
	return self;
}

- initWithImage:(UIImage*)anImage{
	[self initWithFrame: CGRectMake(0,0,anImage.size.width,anImage.size.height)];
	view.layer.contents	= (id)anImage.CGImage;
	return self;
}

- initWithImageNamed:(NSString*)anImageName{
	id image = [[UIImage imageNamed:anImageName] autorelease];
	return [self initWithImage:image];
}

- by:(id)anObject{
	if([anObject isKindOfClass:[UIView class]]){
		[self initWithView:anObject];
	}else if([anObject isKindOfClass:[UIImage class]]){
		[self initWithImage:anObject];
	}else if([anObject isKindOfClass:[NSString class]]){
		[self initWithImageNamed:anObject];
	//}else if([anObject isKindOfClass:[CGRect class]]){
		//[self initWithFrame:aObject];
	}else{
		[self init];
	}
	return self;
}

- (CALayer*)layer{return view.layer;}

- (void)setFrame:(CGRect)aFrame{
	self.layer.frame	= aFrame;
	width			= self.frame.size.width;
	height			= self.frame.size.height;
	offset			= CGPointMake(width/2,height/2);
	self.position		= self.frame.origin;
}
- (CGRect)frame{return self.layer.frame;}

- (void)setPosition:(CGPoint)aPoint{
	x = aPoint.x;
	y = aPoint.y;
	//view.center.x
	self.layer.position	= CGPointMake(x + offset.x , y + offset.y );
}
- (CGPoint)position{
	x = self.layer.position.x - offset.x;
	y = self.layer.position.y - offset.y;
	return CGPointMake(x,y);
}

- (void)setWidth:(float)aWidth{	self.frame = CGRectMake(x,y,aWidth,height);}
- (void)setHeight:(float)aHeight{	self.frame = CGRectMake(x,y,width,aHeight);}
- (void)setX:(float)aX{		self.position = CGPointMake(aX,y);}
- (void)setY:(float)aY{		self.position = CGPointMake(x,aY);}
- (float)width{			return self.frame.size.width;}
- (float)height{			return self.frame.size.height;}
- (float)x{				return self.position.x;}
- (float)y{				return self.position.y;}

- (void)setAlpha:(float)anAlpha{view.alpha = anAlpha;}
- (float)alpha{return view.alpha;}

- (void)setTransform:(CGAffineTransform)aTransform{
	view.transform = aTransform;
}
- (CGAffineTransform)transform{ return view.transform;}

CGAffineTransform matrix(float aScale,float aRotation){
	return CGAffineTransformConcat(CGAffineTransformMakeScale(aScale,aScale),CGAffineTransformMakeRotation(M_PI*aRotation/180.0f));
}

- (void)setRotation:(float)aRotation{
	rotation = aRotation;
	self.transform = matrix(scale,rotation);
}
- (float)rotation{return rotation;}

- (void)setScale:(float)aScale{
	scale = aScale;
	self.transform = matrix(scale,rotation);
}
- (float)scale{return scale;}

- (void)setVisible:(BOOL)aVisible{	view.hidden = (aVisible == false);}
- (BOOL)visible{return view.hidden == false;}

- (void)setEnabled:(BOOL)anEnabled{
	if([view isKindOfClass:[UIControl class]]){
		[(UIControl*)view setEnabled:anEnabled];
	}
}
- (BOOL)enabled{
	if([view isKindOfClass:[UIControl class]]){
		enabled = [(UIControl*)view isEnabled];
	}else{
		enabled = false;
	}
	return enabled;
}

- (void)addChild:(Sprite*)aSprite{
	aSprite.parent = self;
	[view addSubview:aSprite.view];
}

@end

トラックバックURL

http://faces2.bascule.co.jp/mt/mt-tb.cgi/592

コメントを投稿

(コメントには承認が必要になることがあります。承認されるまではコメントは表示されません。)