iOS swift 2048小游戏开发教程(一)
swift 实战项目之 2048游戏
之前看过网上很多写小项目的文章,但大多是旧版或者不全的,这里推出swift5 项目之2048给大家分享
【2020年更新,建议直接看源码:源码地址】
本文将要使用的思路和上面2020更新的源码思路不一样,本文的思路清晰但是代码复杂。
1.首先新建一个项目,自动生成我们的viewController,添加如下代码,构造最简单的起始页面:
class ViewController:UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.black
let wid =view.bounds.width
let hei =view.bounds.height
// 想点button跳转入游戏界面,因此
let startButton1 =UIButton(frame:CGRect(x:0, y:hei/3, width: wid, height:20))
startButton1.setTitleColor(UIColor.red, for: .normal)
startButton1.setTitle("2048",for: .normal)
//文字居中
startButton1.contentHorizontalAlignment = .center
startButton1.addTarget(self,action:#selector(start1),for: .touchUpInside)
view.addSubview(startButton1)
}
// 点击事件:需要新建一个swift文件:GamePanel.swift ,继承UIViewController。点击按钮后就进这个ViewController界面。
func start1(){
self.present( GamePanel(), animated: false, completion: nil)
}
GamePanel.swift:
import Foundation
import UIKit
class GamePanel:UIViewController{
let dimension:Int =4 // 四行四列,等项目做完,试试自定义行列数。
let boardwidth:CGFloat! // 游戏区域宽度
let scorewidth:CGFloat=50 // 记分板垂直方向的宽度
let thinPadding:CGFloat=5 // 最小滑块的间距
var unit:CGFloat! // 最小滑块的边长
var x:CGFloat! // 包容小方块的大正方形的位置 x,y,也就是游戏区域
var y:CGFloat!
说到这,我们有大正方形,有最小滑块,有记分板,那就得先新建三个类:
1、新建: GameView.swift,是大正方形,里面包着16个小正方形
然后:
var game:GameView!
2、新建: ScoreView.swift,是记分板,显示分数
然后:
var scoreBoard:ScoreView!
3、一会再说,大正方形还没写呢,何谈小块?
构造方法
init( ) {
boardwidth = 400 // 设成多宽随意
super.init(nibName: nil, bundle: nil) // 这句没意思 可照抄
}
override func viewDidLoad() {
super.viewDidLoad()
准备好游戏区域大正方形的位置 x,y,为了居中,下面是简单的计算
x = (view.bounds.width-boardwidth)/2
y = (view.bounds.height-boardwidth+scorewidth)/2
self.view.backgroundColor =UIColor(red:0.95, green:0.83, blue:1, alpha:1)
展示大正方形和积分板的俩方法:
showGridView()
showScoreBoard()
}
requiredinit?(coderaDecoder:NSCoder) {
fatalError("init(coder:) has not beenimplemented")
}
GamePanel是负责控制游戏的(Controller),其他view要单设类重写
这两个方法可以在写完那两个类的构造方法再来写,现在先写个方法头扔这就行
1 展示大正方形:
func showGridView(){
unit = (boardwidth-thinPadding*CGFloat(dimension+1))/CGFloat(dimension)
game =GameView(unit:unit,dime:dimension,x:x,y:y,thin:thinPadding) //一会写
view.addSubview(game)
}
2 展示记分板,
func showScoreBoard(){
scoreBoard =ScoreView(unit:unit,y:y,screenX:view.bounds.width) //一会写
scoreBoard.score =0
view.addSubview(scoreBoard)
}
}
大方块GameView.swift:
import Foundation
import UIKit
class GameView:UIView {
var dimension:Int!
var unitwidth:CGFloat!
var thinPadding:CGFloat!
var x:CGFloat!
var y:CGFloat! // 这几个属性看之前注释 一样的意思
构造方法
init(unit:CGFloat,dime:Int,x:CGFloat,y:CGFloat,thin:CGFloat){
self.x= x
self.y= y
self.thinPadding= thin
self.dimension= dime
self.unitwidth= unit
let wid = thinPadding!*CGFloat(dime+1)+unit*CGFloat(dime)
确定frame位置:
super.init(frame:CGRect(x:x, y: y, width: wid, height: wid))
调用下面的方法初始化小单元方格 :
setGrid()
}
required init?(coderaDecoder: NSCoder) {
fatalError("init(coder:) has not beenimplemented")
}
//初始化空的小单元们 PS。这只是初始化单元的位置,不是最小块。
func setGrid(){
layer.cornerRadius =10
clipsToBounds = true
backgroundColor =UIColor(red: 0.73, green: 1, blue: 0.85, alpha: 1)
两个for循环初始化位置:
var tempy:CGFloat= 0
for _ in 0..<dimension{
var tempx:CGFloat =0
for _ in 0..<dimension{
let viewUnit=UIView(frame:CGRect(x:thinPadding+tempx, y:thinPadding+tempy, width:unitwidth,height: unitwidth))
viewUnit.layer.cornerRadius =8
viewUnit.clipsToBounds =true
viewUnit.backgroundColor=UIColor(red: 0.9, green: 1, blue: 0.97, alpha: 1)
addSubview(viewUnit)
tempx += unitwidth+thinPadding
}
tempy += unitwidth+thinPadding
}
}
下面是记分板类ScoreView.swift 继承 UILabel 。你也可以继承UIView。我为了省事就这样了。。
import Foundation
import UIKit
class ScoreView:UILabel{
属性观察者 传score值
var score:Int =0{
didSet{
text ="SCORE:\(score)"
}
}
初始化
init(unit:CGFloat,y:CGFloat,screenX:CGFloat){
let height:CGFloat=68 // 随便
let width =2.5*unit // 自己定
根据屏幕和游戏区位置确定记分板位置:
let localX = (screenX-width)/2
let localY = (y-height)/2
super.init(frame:CGRect(x: localX, y: localY, width: width,height: height))
backgroundColor =UIColor(red: 0.47, green: 0.84, blue: 0.97, alpha: 1)
textColor = UIColor.red
textAlignment = .center
}
required init?(coderaDecoder: NSCoder) {
fatalError("init(coder:) has not beenimplemented")
}
}
写完排排错 运行看看什么样子
iOS swift 2048小游戏开发教程(一)相关推荐
- 微信小游戏开发教程-游戏实现3
微信小游戏开发教程-游戏实现3 对象池 由于游戏过程中会创建很多临时对象,这些对象很快又不再使用,垃圾回收器也能帮我们主动回收这部分垃圾,但是回收时间不可控制,同时增大了创建对象的开销,所以我们使用对 ...
- 微信小游戏开发教程-游戏实现2
微信小游戏开发教程-游戏实现2 绘制地面 类似于绘制背景,读者自行完成代码.src/runtime/land.js 简易View系统 坐标布局对于复杂的页面来说维护相当困难,因此这里我们引入布局的概念 ...
- 微信小游戏开发教程-游戏实现1
微信小游戏开发教程-游戏实现1 概述 微信开发者工具官方提供一个飞机大战的游戏Demo,这里我们不再使用这个demo,我们以FlappyBird为例,为了让读者更加容易理解. 源码 https://g ...
- 微信小游戏开发教程-2D游戏原理讲解
微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...
- 微信小游戏开发教程-新建项目
微信小游戏开发教程-新建项目 1. 新建小游戏项目 我们这回使用空项目,不要勾选使用模板创建. 2. 添加小游戏必要文件 项目创建好以后我们发现缺少一些必要的文件,我们手动添加即可: game.jso ...
- 【cocos 2d微信小游戏开发教程】基础使用笔记分享(三)
富文本(RichText) 优点:自定义颜色,大小,描边,还能加图片.对于复杂的文本表现力更好. 缺点:cocos的富文本是由Label组件拼装实现的.低版本会打断合批.Label太多导致卡顿. 常用 ...
- 微信塔防小游戏开发教程,唤境引擎制作塔防游戏分享
今天带来的是塔防游戏制作攻略! 点击这里来下载工程文件, 点击这里可以下载工程中所用的素材哦~ 预览状态时敌人会从四个生成点随机生成,并且会自动寻路绕过黑色墙体走向红色终点.点击黑色墙体可以创建炮塔, ...
- Flash网页小游戏开发教程
架设服务器 地图 程序员 转载于:https://www.cnblogs.com/2008nmj/p/10593355.html
- 一文梳理2048小游戏从开发到上云全流程
摘要:本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实践的全流程 前言 本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实 ...
- Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
最新文章
- JavaScript学习--闭包
- Access数据库操作软件研究
- 「软件测试基础」理论篇之软件测试概论
- iOS 处理键盘遮挡TextField、TextView问题
- 虚拟机ping不通百度等外部网络
- 扫地机器人欠压检测电路_扫地机器人智能家居必备!靠传感器感知外界环境?...
- EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本...
- 918国际导航网V4.2版整站源码
- 面向消费者的自动文本分析(Automated Text Analysis for Consumer Research) 2017 JCR 论文阅读
- php学习笔记0001 变量作用域
- 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)
- 从队列、二叉树到优先队列
- C++ 内存分配(new,operator new)详解
- 博弈论算法常见模型整理
- mysql数据库如何查看表空间_MYSQL:查看的数据库表空间
- Python2—0704笔记
- unity打包的安卓游戏在某些设备显示异常问题解决
- java中String s=abc及String s=new String(abc)详解
- java打字训练课程设计_JavaFX+Java打字练习软件(布局篇)
- 嵌入式系统概述及特点
热门文章
- [ 4w字 ] JavaSE总结(基础+高级+多线程+面试题)
- VMware - 虚拟机系统中无法使用键盘
- java爬虫乱码_网络爬虫的乱码处理
- 博弈论笔记:重复博弈
- mysql ocp 题库部分解析
- 疫情地图 | 低代码制作全国重点管控地区行政区地图(截至4月16日)
- 网关 架构演进及实践
- 把html转换成word,怎么把html转换成word
- 项目日报模板_能力再强也要常向领导汇报工作,掌握万能模板,不做职场小透明...
- 【Excel技巧必知必会】