-1

オープンソースプロジェクトcocos2dに基づいてバウンドするボールを実現するためのコードを書くのはとても簡単です。ここに質問があります。

したがって、cocos2dを使用せずに、最も単純なコードでこれを実装する方法。

4

1 に答える 1

11

まず、ボールクラスを作成する必要があります。このクラスには、位置、速度、方向などのivarが必要です。また、hitTop、hitBottom、hitLeft、hitRightなど、ボールの方向を変更する必要がある場合のメソッドもいくつか必要です。また、位置を1ステップ進めるために、位置を更新する方法も必要です。BallViewもあるので、画像や色だけをボールとして使用できます。

それを動かすには、ビューコントローラにゲームループを設定する必要があります。これを行うには多くの方法がありますが、私が最も簡単に見つけたのはCADisplayLinkです。

実装に問題がある場合のコードは次のとおりです。

Ball.h

#import <Foundation/Foundation.h>
#import "MovingObjectView.h"

@interface MovingObject : NSObject

@property(nonatomic, retain) MovingObjectView *ball;

@property CGRect bounds;
@property CGPoint position;
@property CGPoint direction;
@property float velocity;

-(id)initWithBounds:(CGRect)b andPosition:(CGPoint)p;

-(BOOL)positionIsInsideRect;
-(void)update;

-(void)hitLeft;
-(void)hitRight;
-(void)hitTop;
-(void)hitBottom;

@end

Ball.m

#import "MovingObject.h"

@implementation MovingObject

-(id)initWithBounds:(CGRect)b andPosition:(CGPoint)p
{
    if (self = [super init]) {
        self.bounds = b;
        self.position = p;
        self.direction = CGPointMake(1, 1);

        //Change the position to middle if position is outside bounds
        if (![self positionIsInsideRect]) {
            NSLog(@"Position changed to center");
            self.position = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
        }

        self.ball = [[[MovingObjectView alloc]initWithFrame:CGRectMake(self.position.x, self.position.y, 15, 15)]autorelease];
    }
    return self;
}

//checks if the balls position is correct
-(BOOL)positionIsInsideRect {
    if (self.position.x < self.bounds.origin.x || self.position.x > self.bounds.size.width || self.position.y < self.bounds.origin.y || self.position.y > self.bounds.size.height) {
        NSLog(@"Position is outside bounds");
        return NO;
    }else{
        return YES;
    }
}

//Call this method to move a ball
-(void)update {
    //Checks if the ball is outside bounds
    if (self.position.x-(self.ball.frame.size.width/2) <= self.bounds.origin.x) {
        [self hitLeft];
    }else if (self.position.x+(self.ball.frame.size.width/2) >= self.bounds.size.width){
        [self hitRight];
    }else if (self.position.y-(self.ball.frame.size.height/2) <= self.bounds.origin.y) {
        [self hitTop];
    }else if (self.position.y+(self.ball.frame.size.height/2) >= self.bounds.size.height){
        [self hitBottom];
    }

    //Updates the balls position
    CGPoint p = self.position;
    p.x += self.direction.x*self.velocity;
    p.y += self.direction.y*self.velocity;
    self.position = p;

    self.ball.center = self.position;
}

//Call this when the ball need to bounce
-(void)hitLeft
{
    NSLog(@"hitLeft");
    CGPoint d = self.direction;
    d.x = fabsf(self.direction.x);
    self.direction = d;
}

-(void)hitRight
{
    NSLog(@"hitRight");
    CGPoint d = self.direction;
    d.x = -fabsf(self.direction.x);
    self.direction = d;
}

-(void)hitTop
{
    NSLog(@"hitTop");
    CGPoint d = self.direction;
    d.y = fabsf(self.direction.y);
    self.direction = d;
}

-(void)hitBottom
{
    NSLog(@"hitBottom");
    CGPoint d = self.direction;
    d.y = -fabsf(self.direction.y);
    self.direction = d;
}

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

@end

BallView.h

#import <UIKit/UIKit.h>

@interface MovingObjectView : UIView

@property (nonatomic, retain) UIImage *img;

@end

BallView.m

#import "MovingObjectView.h"

@implementation MovingObjectView

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


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    if (self.img == nil) {
        CGRect bounds = [self bounds];
        [[UIColor blackColor]set];
        UIRectFill(bounds);
    }else {
        CGRect bounds = [self bounds];
        [[UIColor whiteColor]set];
        UIRectFill(bounds);
        [self.img drawInRect:rect];
    }
}

@end

そして最後に、viewcontrollerでこれが必要です:

ViewController

viewdidloadの場合:

self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameLoop)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

次に、このメソッドを追加します。

-(void)gameLoop
{   
    //Updates the balls position
    [self.movingBall update];

    //Here you could add your collision detection code
}
于 2012-12-04T16:04:04.340 に答える