在initWithSize:方法末尾加入下列代码:

// 1 创建物理形状(以屏幕为边界)

SKPhysicsBody* borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

// 2 将物理形状设为场景的身体

self.physicsBody = borderBody;

// 3 设置阻力系数

self.physicsBody.friction = 0.0f;

  1. 创建一个 SKPhysicsBody。 SKPhysicsBody 用于模拟某个节点的外形。在这里,创建了一个只有4边的形状,它没有体积或容积,不受外力和冲量的影响。
  2. 每个节点都可以设置物理外形。 我们在这里设置了场景的外形。注意:SKPhysicsBody 的坐标系是相对于节点位置而言的。

设置阻尼系数为0.0f,这样当小球撞上笼子边界后不会减速。你需要的是一种完全反射,球体撞上墙壁后以相同角度反弹离开。

完全反射

尽管你拥有一个神奇的笼子,但你看不见效果。只有加入球体之后,你才能看到樊笼的存在。在 initWithSize: 方法最后加入以下代码:

// 1

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

ball.name = ballCategoryName;

ball.position = CGPointMake(self.frame.size.width/3, self.frame.size.height/3);

[self addChild:ball];

// 2

ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/2];

// 3

ball.physicsBody.friction = 0.0f;

// 4

ball.physicsBody.restitution = 1.0f;

// 5

ball.physicsBody.linearDamping = 0.0f;

// 6

ball.physicsBody.allowsRotation = NO;

  1. 如你所料,我们创建了一个角色,以 ball 为名进行引用,设置它的位置(相对于场景),然后添加到场景中。
  2. 我们将 ball 的外形创建为立体的。与前面基于屏幕边界创建的线条型的形状相比,这种形状受外力和冲量的形象,会与其他形状发生碰撞。我们以“小球”角色同样的大小创建了球形的物理形状。
  3. 接下来,设置物理形状的属性。你已经使用过摩擦系数了,这行代码应该很明白了,它将使小球的摩擦系数为0。
  4. Restitution 属性是指物体的弹性。设为 1.0 意味着球体与另外物体相撞时将会百分之百的反弹。也就是说,球体在碰撞中将以同样力量弹回。
  5. LinearDamping 表示气体或液体对物体的减速效果(线性阻尼)。在逃逸游戏中,球不会被减速。因此,线性阻尼设置为0。
  6. AllowsRotation 属性正如其字面意义。表示是否允许物体旋转。这里,我们设置为不允许。

注意:通常,让形状与玩家真正看到情况越逼近越好。对于球体,很容易模拟它的行为。但对于更复杂的形状,你不得不花费大量的心思。这里需要提醒你的是,过于复杂的物体可能会付出高额的性能代价。

该让小球动起来了(实际上是跳动起来)。在上述代码后加入这行:

[ball.physicsBody applyImpulse:CGVectorMake(10.0f, -10.0f)];

这行代码在小球上施加了一个推力(就像安装了火箭助推器),使它向某个方向运动(沿右下对角线运动)。一旦小球开始运动,它会在笼子中来回反弹。

让我们测试一下。编译运行程序,你会看到小球沿着屏幕的四边不断进行反弹运动。

我不停地跳啊跳,跳得你心烦意乱:D

加入球拍

接下来是什么?这是一个逃逸游戏,然而它还没有球拍。

在 initWithSize: 方法的小球代码后面,加入以下代码来构造球拍(以及它的物理外形):

SKSpriteNode* paddle = [[SKSpriteNode alloc] initWithImageNamed: @"paddle.png"];

paddle.name = paddleCategoryName;

paddle.position = CGPointMake(CGRectGetMidX(self.frame), paddle.frame.size.height * 0.6f);

[self addChild:paddle];

paddle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:paddle.frame.size];

paddle.physicsBody.restitution = 0.1f;

paddle.physicsBody.friction = 0.4f;

// 设置物体为静态物体

paddle.physicsBody.dynamic = NO;

大部分代码和球的代码一样。但是使用了长方体作为球拍的形状,就如你在屏幕中见到的一样。

这里球拍应当是静态的。这样,球拍就不会受重力和外力所影响。接下来你会看到为什么要特别说明这一点。

编译运行程序,球拍会在场景中显示,小球会被球拍弹开。

史上最无聊的游戏:/

这很无聊,因为你根本无法移动球拍。

用 SpriteKit 做一个逃逸游戏 (2)相关推荐

  1. 如何用 Sprite Kit 和 Swift 制作一个逃逸游戏-第一部分

    原文:How To Make a Breakout Game with SpriteKit and Swift: Part 1 作者:Michael Briscoe 译者:kmyhy 更新说明:本教程 ...

  2. 用 JS 做一个数独游戏(二)

    用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...

  3. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  4. scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...

    导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...

  5. 做一个FLASH游戏你需要掌握的东西【实用】

    做一个FLASH游戏你需要掌握的东西 作者:jianzhong 一直想着什么时间好好做一个像样点的游戏,于是刻意的开始去了解FLASHGAME的相关资料,在这里把自己在整个制作和收集过程中的一些感觉使 ...

  6. 单枪匹马:4年只做一个iOS游戏 收入破千万美元

    2011 年,一款叫做<Tiny Wings>的手游被苹果推荐为最佳 iPhone 游戏,对手游市场有所了解的同学一定会赞同<Tiny Wings>是过去几年中全球知名度仅次于 ...

  7. 用 Python 做一个 H5 游戏机器人

    原文地址:Creating An HTML5 Game Bot Using Python 原文作者:vesche 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- ...

  8. 使用PixiJS做一个小游戏

    PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...

  9. dx绘制2d图像_【教程】使用DX9做一个2D游戏(1)

    本文最先发表在贴吧,现在整理到此处,之后所有更新将在这里进行. by Chu @ XDU 2012/11/25 版权所有,禁止用于商业用途. 转载请注明出处. 用DX9做一个2D游戏显然不是一件容易的 ...

  10. 用pygame做一个追逐游戏

    大家好呀,今天来做一个追逐游戏 1.使用鼠标操作 2.左键换颜色(随机) 3.滚轮调整球体大小(往上调大,往下调小) 4.右键清空屏幕 import sys import pygame as p fr ...

最新文章

  1. raid5 增加一块硬盘_Raid5热备盘上线同时另一块硬盘离线如何恢复数据
  2. gdb InnoDB Redundant Row Format
  3. Java 并发——多线程基础
  4. 无聊博文之:用同余的语言阐述欧几里德算法
  5. 获取List对象的泛型类(原创)
  6. HC-05与JDY-09蓝牙模块对比与使用
  7. 华为员工去面试被淘汰后怒怼HR:华为出来的也能被拒,很无语
  8. 表格自动填充上一行_如何在Google文档电子表格上使用自动填充[快速提示]
  9. android7.0官方高清壁纸,抢鲜体验!安卓7.0自带原生壁纸打包下载
  10. Turtle 画正方形螺旋线
  11. html页面中汉字上面显示拼音
  12. java 7 new feature
  13. 《当程序员的那些狗日日子》(二十八)开展新工作
  14. Python软件设计基础 第九节-Open3D模型处理
  15. GridView 72般绝技 转自清清月儿收藏
  16. S如何边缘控制_驾考科目二侧方位停车、倒库与S弯道,上坡起步技巧及注意事项,意外应对方法...
  17. java restful项目打包_GitHub - yangguang010/RestfulAPI: 使用java封装萤石开放平台的接口 HTTPS—SDK。可以直接将api封装成jar包...
  18. matlab 向量取倒数,Matlab 求倒数命令及控制方法
  19. 使用PlantUml插件画类图
  20. 华为管理学案例分析_华为管理课程

热门文章

  1. NVIDIA显卡深度学习算力表
  2. git报错:Reinitialized existing Git repository in ...解决方法
  3. 主机内存测试软件,检测内存条的软件有哪些?内存条查看工具介绍
  4. 高考476分在浙江计算机学院,2021年高考476分左右能上什么大学(100所)
  5. 机器学习系列(16)_怎样找到一份深度学习的工作(附学习材料,资源与建议)
  6. Android重难点解析——面试中可能被问到的那些问题
  7. html列表自动无限循环滚动,js 无限循环垂直滚动列表
  8. Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
  9. com.android.stfwd,[原创]360freewifi逆向分析
  10. 机器学习算法----KNN K邻近 (K值的选择) (学习笔记)