iOS7 SKScene如何让精灵从屏幕边缘反弹?

2024-01-20

我正在开发一款球在 iPad 屏幕内弹跳的游戏。类似于乒乓球游戏。我看到 SKScene 的 SKPhysicsWorld 具有重力属性,并且还控制对象如何相互碰撞。

有什么方法可以自动检测精灵的边缘是否与屏幕边缘发生碰撞,以便它可以反弹?或者我需要编写自己的碰撞代码吗?


您无需编写太多代码即可使球从屏幕边缘弹起。物理环境可以处理以上所有内容,您只需要以正确的方式实例化精灵即可。

首先,您必须将场景的物理主体设置如下:

self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

在场景的 .h 文件中创建两个位掩码类别:

static const uint8_t ballCategory = 1;
static const uint8_t wallCategory = 2;

并给场景的物理体一个类别:

self.physicsBody.categoryBitMask = wallCategory;

然后创建你的精灵:

SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed:@"ball.png"]; 

spriteNode.name = @"ball";

spriteNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
spriteNode.position = CGPointMake(10.0,10.0); //or anything you want
spriteNode.physicsBody.dynamic = YES;
spriteNode.physicsBody.affectedByGravity = NO;

spriteNode.physicsBody.categoryBitMask = ballCategory;
spriteNode.physicsBody.collisionBitMask = wallCategory;

spriteNode.physicsBody.restitution = 1.0;
spriteNode.physicsBody.friction = 0.0;
spriteNode.physicsBody.linearDamping = 0.0;
spriteNode.physicsBody.angularDamping = 0.0;

[self addChild:spriteNode];

而不是给 spriteNode[SKAction moveTo: duration:],对其物理体施加脉冲。

CGVector impulse = CGVectorMake(1.0,1.0);
[spriteNode.physicsBody applyImpulse:impulse];

瞧!球将从墙上弹起,没有任何东西可以阻止它。

.h 文件应如下所示:

#import <SpriteKit/SpriteKit.h>

static const uint8_t ballCategory = 1;
static const uint8_t wallCategory = 2;

@interface BallBounce : SKScene

@end

.m 文件应如下所示:

#import "BallBounce.h"

@implementation BallBounce

-(instancetype)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
        self.physicsBody.categoryBitMask = wallCategory;

        SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(50, 50)];

        spriteNode.name = @"ball";

        spriteNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
        spriteNode.position = CGPointMake(10.0,10.0); //or anything you want
        spriteNode.physicsBody.dynamic = YES;
        spriteNode.physicsBody.affectedByGravity = NO;

        spriteNode.physicsBody.categoryBitMask = ballCategory;
        spriteNode.physicsBody.collisionBitMask = wallCategory;

        spriteNode.physicsBody.restitution = 1.0;
        spriteNode.physicsBody.friction = 0.0;
        spriteNode.physicsBody.linearDamping = 0.0;
        spriteNode.physicsBody.angularDamping = 0.0;

        [self addChild:spriteNode];

        CGVector impulse = CGVectorMake(100.0,100.0);
        [spriteNode.physicsBody applyImpulse:impulse];

    }

    return self;
}

@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS7 SKScene如何让精灵从屏幕边缘反弹? 的相关文章

  • Xcode 7 GM 缺少 iOS 7 模拟器

    我已将 Xcode 7 beta 版本升级到 Xcode 7 GM 但缺少 iOS 7 1 模拟器 我仍然有 Xcode 6 并且可以在那里使用 7 1 模拟器 我试着看一下Preferences gt Downloads但只有 8 x 模
  • 如何创建类似于ios 7日历图标的动态图标?

    我想创建动态文本更改图标 例如 iOS 7 中的日历应用程序 有什么办法可以做到吗 你不能这样做 没有 API 允许这样做 您的应用程序图标位于应用程序包中 该图标是只读的 因此无法修改
  • 未修改的 iOS7 Apple GLPaint 示例混合问题

    在苹果的GLPaint https developer apple com library ios samplecode GLPaint Introduction Intro html例如 用户可以使用半透明画笔在表面上绘图并改变颜色 然而
  • 使用Sprite Kit如何启用iAd?

    在IOS 7中 我们可以非常轻松地启用iAd 使用 self canDisplayBannerAds YES in code 查看是否加载UIViewController的 但是 我无法在我的 ViewController 加载 SKSce
  • enumerateBodiesAlongRayStart 在 Xcode 6 中将“Chance”打印到控制台

    我正在使用 enumerateBodiesAlongRayStart 并且此方法不断地将单词 Chance 打印到我的控制台 有什么办法可以抑制这种情况吗 这是怎么回事 self gameScene physicsWorld enumera
  • 如何使用 iOS 7 自定义过渡在顶部呈现半模态视图控制器

    我将如何在主视图控制器的顶部呈现 半视图 控制器 要求 呈现在主视图控制器顶部滑动的第二个视图控制器 第二个视图控制器应该只显示主视图控制器的一半以上 主视图控制器应在第二视图控制器后面保持可见 透明背景 下面不显示黑色 第二个视图控制器应
  • iOS7自定义ViewController转场和顶部布局指南

    我在我的应用程序中实现了自定义 UIViewController Transition 它取代了推送动画中内置的导航控制器 到目前为止 一切正常 除了新推送的视图控制器中的 toplayoutguide 为 0 尽管新视图控制器继承了旧视图
  • 调用 SKLabelNode 时出现延迟?

    我在从一个版本转换时遇到了轻微延迟 滞后 的问题SKScene到另一个 通过注释掉各种代码 我将其范围缩小到SKLabelNode 我的猜测是 这就是它在调用时加载 缓存字体 这会导致在声明新字体时出现小的延迟 口吃SKScene 有没有其
  • 从代码中获取全局色调颜色

    有没有办法通过代码从我的项目中获取全局色调颜色 为了避免误解 我指的是全局色调 我可以在文件检查器中设置它 Easy 目标C UIColor tintColor self view tintColor Swift let tintColor
  • 创建透明渐变并将其用作 SpriteKit 中的 alpha 遮罩

    我正在尝试制作渐变并将其用作 alpha 蒙版 现在 我能够制作与此类似的图像 从黑色到透明 这是我用来实现这一切的代码 private func createImage width CGFloat height CGFloat gt CG
  • AFNetworking 可以处理请求队列吗?

    我在 iOS 6 上的示例 需要 按顺序 向服务器发送 10 个 Multi Part 请求 所以请求形成一个队列 应显示进展情况 如果一个请求失败 则所有后续请求都会失败 请求队列应该是可取消的 AFNetworking 可以帮我解决这个
  • ios7 UITableViewCell SelectionStyle 不会变回蓝色

    Xcode 5 0 iOS 7 并更新现有应用程序 UITableView所选行现在是灰色的 而不是蓝色的 据我所知 他们更改了默认值selectionStyle至灰色 但 蓝色 仍然是 IB 的一个选项UITableViewCellSel
  • SpriteKit SKScene 添加 AVCaptureVideoPreviewLayer CALayer 作为背景不起作用

    我正在尝试将 AVCaptureVideoPreviewLayer CALayer 添加为 SKScene 的背景 我可以将 CALayer 添加到场景中 但无论尝试如何排序 CALayer 始终是最顶层的对象 在 didMoveToVie
  • videoMinFrameDuration 已弃用

    当我将 Xcode 从 4 6 更新到 5 1 时 ios7 中不推荐使用 videoMinnFrameDuration void setFrameRate NSInteger frameRate frameRate frameRate i
  • 如何快速更改 SKSpriteNode 的颜色?

    我创建了一个游戏SKSpriteNode那是黑色的 当用户触摸屏幕时我想要SKSpriteNode更改为白色 我已经用谷歌搜索了一切 并尝试了很多不同的策略 但没有成功 有谁知道如何做到这一点 这是我的场景的代码 var blackBird
  • 如何获取默认的iOS浏览器名称?

    Stack Overflow 应用程序检测到我越狱设置的默认浏览器 Chrome 的名称 我怎样才能在 Objective C 和 Swift 中实现同样的目标 只是名称 不是 ActivityView 代码 Example Update
  • UIToolbar setBackgroundColor 没有完全改变颜色

    我正在尝试设置 a 的背景颜色UIToolBar 我尝试从 IB 的属性检查器中选择颜色 并尝试通过编程方式设置它setBackgroundColor UIColor 两种解决方案都有效 但只是部分有效 颜色与白色混合了大约 50 并且工具
  • 如何在Sprite Kit中实现鼠标关节?

    我已经在 iOS 上用 Cocos2d Box2d 编写了拖放功能的工作实现 我需要将它移植到 Sprite Kit 逻辑非常基本 当用户触摸屏幕时 找到手指下的精灵 在找到的精灵和场景的物理体之间创建鼠标关节 将关节的目标设置为触摸位置
  • ios7 navigationController PushViewController 动画错误

    看来我在 navigationController PushViewController 方法中发现了一个错误 为了重新创建它 我采用了示例主详细信息项目并对 didSelectRow method void tableView UITab
  • UIWebView Bug:-[UIWebView cut:]:无法识别的选择器发送到实例

    In the UIWebView 如果包含文本的输入元素具有焦点 并且按下按钮导致输入失去焦点 则随后双击输入以重新获得焦点并从出现的弹出栏中选择 剪切 或 复制 或 粘贴 会导致这UIWebView因错误而崩溃 UIWebView cut

随机推荐