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