2

我正在尝试构建一个简单的 iOS 游戏。当我的主菜单加载并出现在屏幕上时,我想让按钮从侧面移入。我唯一的想法是将一些 SKActions 应用于 SKSpriteNodes。但是所以我必须创建自己的按钮类。有没有更简单的方法来实现这一点?cocos2d 中是否已经有像 CCMenuItem/CCMenu 这样的类?或者有没有 UIButtons 的方法?

谢谢

4

2 回答 2

1

我创建了一个按钮类,它有一个 SKSpriteNode 属性、一个 CGRect 属性和一个 Radius 属性(用于圆形按钮)。当您使用图像初始化按钮时,它会根据图像大小设置它的 CGRect 和 Radius 属性。然后,您可以通过调用返回 CGRect 的 -collisionRect 方法来检查玩家是否在点击按钮,并检查“触摸”位置是否在该矩形内。这样按钮可以四处移动并仍然接收输入。这是代码...

///////////////////头文件//////////////////

//
//  ZSButton.h
//  PEGO
//
//  Created by Zion Siton on 07/09/2013.
//  Copyright (c) 2013 zillustrator. All rights reserved.
//

#import <SpriteKit/SpriteKit.h>

@interface ZSButton : SKNode {

    SKSpriteNode *mySprite;
    CGRect myRect;
    CGFloat myRadius;

}

@property (nonatomic, strong)SKSpriteNode *mySprite;
@property (nonatomic, assign)CGRect myRect;
@property (nonatomic, assign)CGFloat myRadius;

- (id)initWithTexture:(SKTexture *)texture;
- (BOOL)didRadialCollideWith:(CGPoint)aPoint;

@end

///////////////// 实现文件 ///////////////////

//
//  ZSButtonA.m
//  PEGO
//
//  Created by Zion Siton on 07/09/2013.
//  Copyright (c) 2013 zillustrator. All rights reserved.
//

#import "ZSButton.h"

@implementation ZSButton

@synthesize mySprite, myRect, myRadius;

- (id)init {

    // Use a default button image
    return [self initWithTexture:[SKTexture textureWithImageNamed:@"ButtonDefault.png"]];

}

- (id)initWithTexture:(SKTexture *)texture {

    self = [super init];
    if (self) {

        // Assumes there is a texture
        mySprite = [SKSpriteNode spriteNodeWithTexture:texture];
        [self addChild:mySprite];

        // Assumes the collision area is the size of the texture frame
        myRect = [mySprite frame];

        // Assumes the texture is square
        myRadius = myRect.size.width * 0.5;

    }

    return self;

}

- (CGRect)myRect {

    CGPoint pos = [self position];
    CGFloat originX = pos.x - (mySprite.frame.width * 0.5);
    CGFloat originY = pos.y - (mySprite.frame.height * 0.5);
    CGFloat width = mySprite.frame.width;
    CGFloat height = mySprite.frame.height;

    myRect = CGRectMake(originX, originY, width, height);

    return myRect;

}

- (BOOL)didRadialCollideWith:(CGPoint)aPoint {

    // Get the distance between the button centre and the touch
    // ZSMath is a class I wrote that mainly performs trigonometric functions
    CGFloat distance = [ZSMath distanceFromA:[self position] toB:aPoint];

    // Perform a radial collision check
    if (distance < [self myRadius]) {

        // HIT!!!
        return YES;
    }

    // MISS!!!
    return NO;

}

@end

//////////////// 初始化按钮...

// Initialize BACK BUTTON
        backButton = [[ZSButton alloc] initWithTexture:
                      [[ZSGraphicLoader sharedGraphicLoader] frameByName:kBACK_BUTTON]];
        [self addChild:backButton];

//////////////// 测试碰撞/用户压力

for (UITouch *touch in touches) {

    // Get the user's touch location
    CGPoint location = [touch locationInNode:self];

    // If the user taps on BACK Button Rectangle
    if (CGRectContainsPoint(backButton.myRect, location))
    {
        // DO A RADIAL CHECK
        if ([backButton didRadialCollideWith:location])
        {
            // DO BACK BUTTON STUFF
        }

    }

}
于 2013-09-20T18:10:12.793 回答
0

创建您自己的从 SKSpriteNode 继承的按钮类并添加操作只需几分钟,而且效果非常好。UIButton 和 SKScene 在触摸方面似乎不能很好地配合使用,实际上没有必要考虑所描述的方法非常有效。您可以使用继承的 SKSpriteNode 成员将自己的纹理和颜色添加到按钮。

于 2013-09-26T11:43:04.913 回答