如何编写框架在 Swift 3 中用 SpriteKit 框架编写游戏

今天看啥 热点:
SpriteKit游戏开发点滴[6]使用物理引擎(上),spritekit游戏开发
/*说在前面,
两天前的情人节一如既往平平淡淡地过了,本来这篇博客打算在那天写的,到了那天反而没了心情。
一年前的情人节,自己做了《极客鸡丁》,还号称如果哪一天玩家见到了《极客鸡丁2》,那么就说明作者我脱光了。
自己来念研究生只有两个目标,一个是追到本科时候喜欢的那位姑娘,一个是单款游戏突破百万下载,自从第一个目标破碎后,就再也提不起精神了,毕竟自己的研究生目标注定是不能及格了...
今年的情人节通宵在b站看了凉子姐姐的《三角迷踪》,非常喜欢剧里的伴奏,现在还在听着那首“cocoon”停不下来。
Spritekit的物理引擎自己准备通过三篇博客进行介绍。
第一篇博客主要通过栗子介绍SKPhysicsBody的基本属性和用法,会特别提到物理引擎和Sprite 的动作结合的问题。
我们先来看物理引擎是如何起作用的:
在游戏的一个更新周期里,系统主要分四个步骤进行处理:&
1.系统先调用用户重写的Update方法更新游戏的逻辑,
2.系统自动处理Sprite的动作(SKAction),留下didEvaluateActions方法供开发者重写需要在Sprite动作处理完成后才能执行的更新逻辑,
3.系统自动处理物理元素间的物理模拟,留下didSimulatePhysics方法供开发者重写需要在物理模拟完成后才能执行的更新逻辑,
4.系统自动处理物理元素间的“约束”,留下...(同上,你懂的~)
这里要强调的是,Spritekit的物理计算是在动作(Action)计算完成后才开始的。
我们开始上手吧(Xcode 6.1.1,iPhone5S模拟)
-&新建一个iOS的SpriteKit通用项目名为UsePhysics.
-&设置竖屏(如何设置参见[设置竖屏])
-&将类GameViewController的内容替换为下面的内容:(关于如何适配屏幕,参见[适配屏幕])
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene(size:CGSize(width: 1536, height: 2048)) //适配屏幕大小
let skView = self.view as SKView
skView.showsPhysics = true
//显示物理模拟信息
skView.showsFPS = true
skView.showsNodeCount = true
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
//适配屏幕的模式
skView.presentScene(scene)
override func prefersStatusBarHidden() -& Bool { //隐藏系统标题栏
return true
}这里注意,将skView的showsPhysics设置为true,这样就会显示物理模拟的信息。
-&将类GameScene的内容替换为:
class GameScene: SKScene {
var playableRect:CGRect!
override func didMoveToView(view: SKView) {
//---------- 设置适配屏幕的游戏有效区域 ---------//
var tempWidth = size.height/16.0*9.0
var tempMargin = (size.width-tempWidth)/2.0
playableRect = CGRect(x: tempMargin, y: 0, width: tempWidth, height: size.height)
//---------- 显示游戏有效区域 ----------//
let playableArea = SKShapeNode(rect: playableRect)
playableArea.strokeColor = SKColor.redColor()
playableArea.lineWidth = 10
addChild(playableArea)
backgroundColor = SKColor.grayColor()
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
override func update(currentTime: CFTimeInterval) {
}其中playableRect是为了适配屏幕的游戏有效区域,可以看到在iPhone5S和iPhone4S下游戏运行的效果:
-&接下来将游戏元素添加到场景中:(分别为Sand.png , Bullet.png , Floor.png , FloorMask.png 和 Circle.png 将它们拖入到项目中)
&&& &&&&&&&&
在GameScene中添加游戏元素的定义:
//---------- 游戏元素 ----------//
var floorElement:SKSpriteNode!
//旋转的水管
var circleElement:SKSpriteNode!
var bulletElement:SKSpriteNode!
//射出的小鸟
var bulletBoxElement:SKSpriteNode! //底部的水管再didMoveToView的底部添加如下内容:
let centerX:CGFloat = size.width / 2
let centerY:CGFloat = size.height / 2
floorElement = SKSpriteNode(imageNamed: &Floor&)
floorElement.position = CGPoint(x: centerX, y: centerY + 300)
floorElement.zPosition = 1 //底层
circleElement = SKSpriteNode(imageNamed: &Circle&)
circleElement.position = CGPoint(x: centerX, y: centerY)
circleElement.zPosition = 2 //floor之上
bulletElement = SKSpriteNode(imageNamed: &Bullet&)
bulletElement.position = CGPoint(x: centerX, y: 300)
bulletElement.zPosition = 0 //最底层
//BulletBox
bulletBoxElement = SKSpriteNode(imageNamed: &Floor&)
bulletBoxElement.position = CGPoint(x: centerX, y: 0)
bulletBoxElement.zPosition = 1 //bullet之上
//添加到Scene
addChild(floorElement)
addChild(circleElement)
addChild(bulletElement)
addChild(bulletBoxElement)显示的效果如下:
-&休息一下呗~现在基本上布置好了地毯,热乎乎的物理模拟即将开始~
-&设置环境的物理边界,在didMoveToView底部添加:
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: playableRect)
physicsBody其实就是代表该物体进行物理运算的对象,这里的物理边界通过了一个矩形进行实例化。
打开SKPhysicsBody,可以看到其定义:
init(circleOfRadius r: CGFloat) -& SKPhysicsBody
init(circleOfRadius r: CGFloat, center: CGPoint) -& SKPhysicsBody
init!(rectangleOfSize s: CGSize) -& SKPhysicsBody
init!(rectangleOfSize s: CGSize, center: CGPoint) -& SKPhysicsBody
init!(polygonFromPath path: CGPath!) -& SKPhysicsBody
init(edgeFromPoint p1: CGPoint, toPoint p2: CGPoint) -& SKPhysicsBody
init(edgeChainFromPath path: CGPath!) -& SKPhysicsBody
init(edgeLoopFromPath path: CGPath!) -& SKPhysicsBody
init(edgeLoopFromRect rect: CGRect) -& SKPhysicsBody
init!(texture: SKTexture!, size: CGSize) -& SKPhysicsBody
init!(texture: SKTexture!, alphaThreshold: Float, size: CGSize) -& SKPhysicsBody
init(bodies: [AnyObject]) -& SKPhysicsBody可以看出,SKPhysicsBody可以
通过边长初始化圆形边界;
通过矩形的大小初始化矩形边界;
通过纹理蒙板初始化纹理边界;
通过形状路径初始化形状边界;
值得一说的是通过纹理初始化纹理边界(会在后面提到)
-&为了观看物理效果,我们不妨在物理世界中添加一些沙子吧~
在GameScene中添加属性rand100,用于获取随机数:
//随机数 (0,100]
var rand100 : CGFloat
return 1 + CGFloat(arc4random()%100)
}在GameScene中添加方法spawnSand,用于随机产生沙子:
func spawnSand()
var sand = SKSpriteNode(imageNamed: &Sand&)
sand.name = &sand&
sand.position = CGPoint(x: playableRect.minX + rand100 * playableRect.width / 100, y: rand100 * playableRect.height / 100)
sand.physicsBody = SKPhysicsBody(circleOfRadius: 5.0)
//添加物理引擎前设置不随便,设置物理属性后就随便
sand.setScale(3)
sand.physicsBody?.restitution = 0.5 //反弹力 默认 0.2
sand.physicsBody?.density = 10.0 //密度 默认 1
sand.physicsBody?.friction = 0.5 //摩擦力 默认 0.2
sand.physicsBody?.dynamic = true //动态性
sand.physicsBody?.usesPreciseCollisionDetection = false //启用精确冲突检测
sand.physicsBody?.linearDamping = 0.1 //线速度阻尼运动 默认0.1 angularDamping
sand.physicsBody?.affectedByGravity = true //是否受重力影响
sand.physicsBody?.mass = 0.5
println(&sand \(sand.physicsBody?.mass)&)
addChild(sand)
}最后在didMoveToView底部添加:
for i in 1...300
spawnSand()
}此时运行程序就可以看到:
见到沙子自然地堆在底部,是不是很有安全感~
在spawnSand方法里列举了常见的物理属性:
restitution就是物体碰撞后剩余的能量的百分比,取值区间为[0,1],默认值为0.2;(如果取值大于1的话,就会发现沙子越碰越猛,都碰出去了...)
density是物体的密度,默认为1;
mass为物体的质量,默认根据物体的面积大小计算得到;
friction为摩擦系数,取值为[0,1],默认为0.2;
dynamic为物体的“动态性”。例如scene的physicsbody的dynamic为静态的,像固定的墙那样,不会因为受力而移动(但是能用Action或者直接修改Position令其移动),而沙子的动态性则为动态的。
usePreciseCollisionDetection,号称是启动精确碰撞检测。实际上如果在一帧中一个物体的运动速度过快,可能会直接穿过另一个物体,为了避免这种情况,可以启用该功能,但是付出的性能代价比较大。
affectByGravity是是否受重力影响。
大家不妨自己试着修改一下这些属性的值,看看会发生什么样的变化。
其实这里我想介绍的是这两行代码:
sand.physicsBody = SKPhysicsBody(circleOfRadius: 5.0)
//添加物理引擎前设置不随便,设置物理属性后就随便
sand.setScale(3)如果我们先为元素添加物理模拟,然后修改它的大小,那么物体物理边界随之变化(这是正确的)
如果我们先修改了物体的大小,然后再为其添加物理模拟,物体的物理边界还是原始的大小(这是错误的)
所以请记住——添加物理模拟前,不要随便设置元素的大小!(这个问题算不上bug,但是用起来不舒服,希望后面的SpriteKit版本能更精致些fix掉它;不过这样做却能得到不错的特殊效果)
-&接下来为几个游戏元素添加相应的物理模拟:(再didMoveToView底部添加如下代码)
let floorMask = SKTexture(imageNamed: &FloorMask&)
floorElement.physicsBody = SKPhysicsBody(texture: floorMask, size: floorMask.size())
floorElement.physicsBody?.dynamic = false
circleElement.physicsBody = SKPhysicsBody(circleOfRadius: 300.0)
circleElement.physicsBody?.dynamic = false
bulletBoxElement.physicsBody = SKPhysicsBody(rectangleOfSize: bulletBoxElement.size)
bulletBoxElement.physicsBody?.dynamic = false
bulletElement.physicsBody = SKPhysicsBody(rectangleOfSize: bulletElement.size)
bulletElement.physicsBody?.dynamic = true
-&现在这仅仅是一个有物理模拟的场景,还不能与玩家进行交互,于是我们进行这样的设定——点击屏幕,小鸟(bullet)向上跳跃(获得一个向上的动量),重写TouchBegin方法:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
bulletElement.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 500))
}运行程序,是不是现在可以随意地跳跃了?(糟糕,原本是想做成射击,现在情不自禁在做成flappy *ird)
-&现在的场景还不够酷炫,这里要让floor绕circle旋转,关于旋转和AnchorPoint的详细介绍见[旋转&AnchorPoint],这里我们需要这样做:
在GameScene中添加方法RotateByPoint,这个方法使element绕point点旋转rad个弧度
func RotateByPoint(element:SKNode,point:CGPoint,radio:CGFloat)
let tempPos = element.position
let resultX = point.x + (tempPos.x - point.x) * cos(radio) - (tempPos.y - point.y) * sin(radio)
let resultY = point.y + (tempPos.x - point.x) * sin(radio) + (tempPos.y - point.y) * cos(radio)
element.position.x = resultX
element.position.y = resultY
}然后重写Update方法:
override func update(currentTime: CFTimeInterval) {
let rotateSpeed = CGFloat(M_PI / 120)
RotateByPoint(floorElement, point: circleElement.position, radio: rotateSpeed)
floorElement.zRotation += rotateSpeed
}运行程序就可以看到不断旋转的水管和bird了,等等,这不是...
-&预知后续,请看下篇博客~
等等,现在管子虽然旋转,但是很显然不匀速,而且其实这篇博客最想要介绍的是SKAction和物理计算之间有什么关系和影响的。
下面的是这篇博客的代码总结(对上面的内容还进行了一些修改)
GameScene.swift
UsePhysics
Created by samurai54 on 15/2/16.
Copyright (c) 2015年 JiNG. All rights reserved.
import SpriteKit
class GameScene: SKScene {
//---------- 游戏元素 ----------//
var floorElement:SKSpriteNode!
//旋转的水管
var circleElement:SKSpriteNode!
var bulletElement:SKSpriteNode!
//射出的小鸟
var bulletBoxElement:SKSpriteNode! //底部的水管
var lastRotation:CGFloat = 0.0
var deltaRotation:CGFloat = 0.0
//随机数 (0,100]
var rand100 : CGFloat
return 1 + CGFloat(arc4random()%100)
var playableRect:CGRect!
func spawnSand()
var sand = SKSpriteNode(imageNamed: &Sand&)
sand.name = &sand&
sand.position = CGPoint(x: playableRect.minX + rand100 * playableRect.width / 100, y: rand100 * playableRect.height / 100)
sand.physicsBody = SKPhysicsBody(circleOfRadius: 5.0)
//添加物理引擎前设置不随便,设置物理属性后就随便
sand.setScale(3)
sand.physicsBody?.restitution = 0.5 //反弹力 默认 0.2
sand.physicsBody?.density = 10.0 //密度 默认 1
sand.physicsBody?.friction = 0.5 //摩擦力 默认 0.2
sand.physicsBody?.dynamic = true //动态性
sand.physicsBody?.usesPreciseCollisionDetection = false //启用精确冲突检测
sand.physicsBody?.linearDamping = 0.1 //线速度阻尼运动 默认0.1 angularDamping
sand.physicsBody?.affectedByGravity = true //是否受重力影响
sand.physicsBody?.mass = 0.5
println(&sand \(sand.physicsBody?.mass)&)
addChild(sand)
override func didMoveToView(view: SKView) {
//---------- 设置适配屏幕的游戏有效区域 ---------//
var tempWidth = size.height/16.0*9.0
var tempMargin = (size.width-tempWidth)/2.0
playableRect = CGRect(x: tempMargin, y: 0, width: tempWidth, height: size.height)
//---------- 显示游戏有效区域 ----------//
let playableArea = SKShapeNode(rect: playableRect)
playableArea.strokeColor = SKColor.redColor()
playableArea.lineWidth = 10
addChild(playableArea)
backgroundColor = SKColor.grayColor()
let centerX:CGFloat = size.width / 2
let centerY:CGFloat = size.height / 2
floorElement = SKSpriteNode(imageNamed: &Floor&)
floorElement.position = CGPoint(x: centerX, y: centerY + 300)
floorElement.zPosition = 1 //底层
circleElement = SKSpriteNode(imageNamed: &Circle&)
circleElement.position = CGPoint(x: centerX, y: centerY)
circleElement.zPosition = 2 //floor之上
bulletElement = SKSpriteNode(imageNamed: &Bullet&)
bulletElement.position = CGPoint(x: centerX, y: 1600)
bulletElement.zPosition = 0 //最底层
//BulletBox
bulletBoxElement = SKSpriteNode(imageNamed: &Floor&)
bulletBoxElement.position = CGPoint(x: centerX, y: 0)
bulletBoxElement.zPosition = 1 //bullet之上
//添加到Scene
addChild(floorElement)
addChild(circleElement)
addChild(bulletElement)
addChild(bulletBoxElement)
//添加物理模拟
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: playableRect)
for i in 1...300
spawnSand()
let floorMask = SKTexture(imageNamed: &FloorMask&)
floorElement.physicsBody = SKPhysicsBody(texture: floorMask, size: floorMask.size())
floorElement.physicsBody?.dynamic = false
/*--------------- 会发生啥呢 -------------*/
//floorElement.physicsBody?.dynamic = true
//floorElement.physicsBody?.affectedByGravity = false
circleElement.physicsBody = SKPhysicsBody(circleOfRadius: 300.0)
circleElement.physicsBody?.dynamic = false
bulletBoxElement.physicsBody = SKPhysicsBody(rectangleOfSize: bulletBoxElement.size)
bulletBoxElement.physicsBody?.dynamic = false
bulletElement.physicsBody = SKPhysicsBody(rectangleOfSize: bulletElement.size)
bulletElement.physicsBody?.dynamic = true
floorElement.runAction(SKAction.repeatActionForever(SKAction.rotateByAngle(CGFloat(M_PI*2), duration: 4)))
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
bulletElement.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 300))
override func update(currentTime: CFTimeInterval) {
override func didEvaluateActions() {
deltaRotation = floorElement.zRotation - lastRotation
lastRotation = floorElement.zRotation
RotateByPoint(floorElement, point: CGPoint(x: size.width/2, y: size.height/2), radio: deltaRotation)
override func didSimulatePhysics() {
bulletElement.position.x = size.width/2
bulletElement.zRotation = CGFloat(M_PI/2)
func RotateByPoint(element:SKNode,point:CGPoint,radio:CGFloat)
let tempPos = element.position
let resultX = point.x + (tempPos.x - point.x) * cos(radio) - (tempPos.y - point.y) * sin(radio)
let resultY = point.y + (tempPos.x - point.x) * sin(radio) + (tempPos.y - point.y) * cos(radio)
element.position.x = resultX
element.position.y = resultY
相关搜索:
相关阅读:
相关频道:
Android教程最近更新(window.slotbydup=window.slotbydup || []).push({
id: '2013896',
container: s,
size: '960,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2013898',
container: s,
size: '960,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2013900',
container: s,
size: '960,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2013902',
container: s,
size: '960,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2013904',
container: s,
size: '960,90',
display: 'inlay-fix'
当前位置:&>&&>&&>& >Swift的宇宙战机游戏SpriteKit
Swift的宇宙战机游戏SpriteKit
软件大小:4.5 MB
源码类型:
源码语言:简体中文
软件等级:
官方网站:
源码演示:
运行环境:/Xcode 4.3, iOS 5.0
更新时间:
&&温馨提示:本资源由整理提供下载转载时请留下链接说明:作者ochenkai,源码SwiftSpaceShip,Swift的SpritekitDemo。打飞机,素材来源于网上,没写什么逻辑,注释不多,不过效果蛮不错的,给大家娱乐一下。没有使用任何第三方,以及插件。请在Xcode7,iOS9.0以上版本中编译执行。
技术支持:如果遇到技术上的问题可以到我们相关网站进行咨询和解决,,,,,,。
点数不足:& &|& &下载总数:0
(window.slotbydup=window.slotbydup || []).push({
id: '2013932',
container: s,
size: '960,90',
display: 'inlay-fix'
Copyright &
Corporation662p开源网版权所有
客户端下载:&&
客服热线:9:00-18:00用Swift语言开发物理引擎游戏
视频太卡?试试切换线路
开发环境:Xcode是否提供源码:是课程等级:中级课程适应群体:熟悉Swift语言的开发者
用Xcode创建SpriteKit游戏项目视频教程,主讲SpriteKit game,SpriteKit swift,swift SpriteKit,Xcode,学会创建SpriteKit工程,SpriteKit游戏项目
认识SpriteKit游戏框架视频教程,主讲SpriteKit框架,SpriteKit游戏框架,游戏框架,SpriteKit game,SpriteKit swift,swift SpriteKit,并教你学会查看SpriteKit文档
使用Xcode提供的场景编辑器视频教程,主讲场景编辑器,游戏场景编辑器,xcode 编辑器,gamescene,学会用Xcode场景编辑器,可快速创建场景
用swift语言代码编辑场景界面动态创建场景视频教程,主讲动态创建场景,代码编辑场景界面,场景界面,GameViewController,学习用swift编程语言代码编辑场景界面
用户触摸交互视频教程主讲touchesbegan,ios uiview touchesbegan,学习用户交互,用户触摸操作处理
SpriteKit物理引擎的使用视频教程,主讲SpriteKit游戏引擎,SpriteKit物理引擎,SpriteKit游戏项目,,physicsbody,ios physicsbody,学习SpriteKit物理引擎的使用
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [用Xcode创建SpriteKit游戏项目]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [用Xcode创建SpriteKit游戏项目]《Swift语言实战晋级
用Swift开发基于UIKit和SpriteKit的游戏与应用 51CTO SwiftV课堂 泰课在线 天地君道培训鼎力 附赠51CTO学院100金币学习卡 SwiftV课堂90元代金券》(老镇)【摘要_书评_试读】- 蔚蓝网
共有图书3043689种
该分类热销推荐
您的浏览历史
顾客评分:
已有0人评论
字数:500000&&&&&
页数:448&&&&&
开本:16开&&&&&
包装:平装
与网站上传播的各种版本的基础教程不同,《Swift语言实战晋级》将深入挖掘Swift语言的使用规律。省略过多讲述基础语法的篇幅,从而把重点放在实践上,通过豆瓣电台、跑酷熊猫、围住神经猫多个案例来与大家一同研究如何用Swift制作有趣的应用和游戏。在51CTO学院、SwiftV课堂发布的相关教学视频可配合使用。《Swift语言实战晋级》中使用的图片素材、代码包均在线共享。51CTO传媒总裁熊平、51CTO学院高级运营经理曹亚莉、SwiftV课堂创始人周鑫、泰课在线创始人杜增强、天地君道培训创始人黑羽鼎力推荐。书内附赠51CTO学院100金币的学习卡、SwiftV课堂90元代金券。
本书主要通过大量实例来讲解Swift语言在软件开发中的实际应用方法。本书共9章,前2章快速讲述Swift的基础内容,即开发环境的搭建和Swift的基础语法。由于本书是晋级篇,故不再大篇幅讲解基础内容。第3~6章以UIKit控件为主要内容,通过拖拖看小游戏、豆瓣电台、任务提醒软件几个案例来充分巩固UIKit从基础到高级的知识体系,其中还会涉及网络数据读取、图片缓存等技术。第7~9章我们共同聊一聊SpriteKit的应用,以围住神经猫、跑酷熊猫两个实例来讲述2D游戏的开发技术。本书适合对Swift语言的基础内容有一定了解的读者提升实战技能。
第1章 Swift开发环境的搭建 1 1.1 下载Xcode 1 1.2 关于Mac操作系统 3 第2章 Swift语法速读 4 2.1 基础知识 4 2.1.1 变量与常量 4 2.1.2 注释 5 2.1.3 整数 5 2.1.4 浮点数 5 2.1.5 类型推测 5 2.1.6 数值型类型转换 5 2.1.7 布尔值 6 2.1.8 元组 6 2.1.9 可选类型 7 2.1.10 断言 8 2.2 基本运算符 9 2.2.1 赋值运算符 9 2.2.2 数值运算 9 2.2.3 自增(自减)运算 9 2.2.4 复合赋值 9 2.2.5 比较运算 10 2.2.6 三元运算符号 10 2.2.7 区间 10 2.2.8 逻辑运算 10 2.2.9 括号优先级 11 2.3 字符串和字符 11 2.3.1 字符串 11 2.3.2 字符 11 2.4 集合类型 13 2.4.1 数组 13 2.4.2 字典 14 2.5 流程控制 16 2.5.1 for循环 16 2.5.2 while循环 17 2.5.3 条件语句 18 2.5.4 控制转移语句 21 2.6 函数 21 2.7 闭包 24 2.8 枚举 24 2.9 类和结构体 25 2.10 属性 26 2.11 方法 29 2.12 下标 30 2.13 继承 32 2.14 构造过程 34 2.15 析构过程 36 2.16 自动引用计数 36 2.17 可选链 37 2.18 类型转换 38 2.19 类型嵌套 40 2.20 扩展 41 2.21 协议 43 2.22 泛型 45 2.23 访问控制 45 2.24 高级运算符 46 第3章 基础UIKit控件概览 49 3.1 创建工程及基本操作 49 3.1.1 创建Single View Application工程 49 3.1.2 基本操作 51 3.2 Button(按钮) 57 3.2.1 Button控件的基本属性 57 3.2.2 Button实例:各类按钮 59 3.3 Label 60 3.3.1 Label控件的基本属性 61 3.3.2 Label实例:各类文本标签 62 3.4 TextField 63 3.4.1 文本框控件的属性 63 3.4.2 实例:登录界面 64 3.4.3 实例:加法计算器 66 3.5 TextView 68 3.5.1 多行文本框的属性 68 3.5.2 实例:自定义选择内容后的菜单 69 3.6 Switch 70 3.6.1 文本框控件的属性 70 3.6.2 Switch控制TextView的可编辑属性 71 3.7 SegmentedControl 72 3.7.1 Segmented Control的属性 72 3.7.2 Segmented Control实例 73 3.8 ImageView 75 3.8.1 图像控件的基本属性 75 3.8.2 图像控件实例 75 3.9 ProgressView 78 3.9.1 进度条控件的属性 78 3.9.2 进度条控件的实例 78 3.10 ActivityIndicator View 79 3.10.1 环形进度条的基本属性 80 3.10.2 环形进度条实例 80 3.11 Slider 82 3.11.1 拖动条的基本属性 82 3.11.2 实例:拖动条控制图片透明度 82 3.12 AlertView 84 3.12.1 警告框的基本属性 84 3.12.2 实例:各式各样的警告框 84 3.13 ActionSheet 88 3.13.1 底部警告框的基本属性 88 3.13.2 底部警告框的实例 88 3.14 DatePicker 89 3.14.1 日期选择器的基本属性 89 3.14.2 日期选择器的实例 90 3.15 PickerView 91 3.15.1 选择器的一些属性 91 3.15.2 选择器的实例 91 3.16 Stepper 96 3.16.1 步进器器的一些属性 96 3.16.2 实例:属性加点器 96 3.17 WebView 98 3.17.1 网页视图控件的一些属性 98 3.17.2 实例:迷你网页浏览器 99 3.18 Toolbar与Bar Button Item 100 3.18.1 工具条的一些属性 100 3.18.2 Bar Button Item的一些属性 101 3.18.3 工具条的实例 102 3.19 TableView 103 3.19.1 TableView的一些属性 103 3.19.2 TableView的一个简单例子 1
摘要与插图
4.2 基本变量和更新函数
当我们完成了界面的设置,就要思考一下代码方面怎么编写。我们从主界面上看到我们需要一个目标数字,我们用targetValue来储存它。还需要一个变量用来记录滑块拖动的位置,用来和targetValue作比较,这个变量我们命名为currentValue。从主界面上,我们看到还需要两个变量用来存储总分数和总回合数,我们可以将它们命名为score和round。 //目标数字 var targetValue :Int = 0 //拖到的数字 var currentValue :Int = 0 //总分数 var score :Int = 0 //总回合数 var round = 0 目标数字每个回合随机生成,范围是1至100的整数。 需要写一个函数用来生成目标数字和更新界面上的targetLabel,scoreLabel,roundLabel的数字。
//界面显示更新函数 func updateLabels(){ //目标值 targetValue = Int(1 + arc4random()%100) //给界面上的目标label赋值 targetLabel!.text = String(targetValue) //给总分label赋值 scoreLabel!.text = String(self.score) //回合数+1 round++ //给总回合数label赋值 roundLabel!.text = String(self.round) //重置滑块的值 slider!.value = 50 } arc4random()这个全局函数会生成9位数的随机整数,对它100取模(%)运算就会得到0至99的之间的随机数,加上1就得到了1至100的随机数。 这时候我们可以来运行一下程序看看效果,因为程序一启动就开始要有个目标值,所以我们的updateLabels函数在viewDidLoad函数内就要运行一次,viewDidLoad函数就是在界面加载完毕的时候运行的函数,代码如下: override func viewDidLoad() { super.viewDidLoad() //首次运行时生成目标值并更新labels updateLabels(); }
0人参与评分
很好(5星,4星):
一般(3星,2星):
不推荐(1星):&&&
写购物评价,赢购物积分,可换购物券!好书不要私藏哦,分享给别人吧!
温馨提示:由于每位咨询者提问时间及蔚蓝网促销等不同原因,以下回复仅对提问者3天内有效,其他网友仅供参考!
1件商品成功放入购物车
购物车共件商品,商品金额合计¥97.10
购物车中已有该商品
非常报歉,本商品没有库存暂时无法购买,如果您仍需要该图书
请输入邮箱做缺货登记,到货后我们会给您发邮件通知。
非常抱歉,您购买的数量超过库存,当前最多可买303件,请您修改。}

我要回帖

更多关于 自己编写php框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信