Swift

下面是生成一个“围住神经猫”游戏的初始场景:
1,界面下方会生成9*9共81个圆点,同时圆点内部添加文本标签显示索引
2,默认圆点为灰色,每行随机取两个点变为红色
3,奇数行和偶数行有一定的错位,错位的横向距离是圆的半径

效果图如下:


1,首先给资源库Images.xcassets添加资源图片:



2,圆点类 GaPoint.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import SpriteKit
 
//圆点类型枚举
enum PointType:Int{
    //灰0 红1
    case gray=0,red;
}
 
class GaPoint:SKSpriteNode{
 
    //自身索引
    var index = 0
    //圆点类型,默认为灰色点
    var type = PointType.gray
    //圆点内的文本节点
    var label:SKLabelNode?
     
    //设置文本节点的文字
    func onSetLabel(i:String){
        if label == nil {
            //文本节点的字体
            label = SKLabelNode(fontNamed:"Chalkduster")
            //文本节点的字体大小
            label!.fontSize = 22
            //文本节点的位置
            label!.position = CGPointMake(0, -10)
            //取消文本节点的交互性
            label!.userInteractionEnabled = false
            //将文本节点加入圆点类
            self.addChild(label!)
        }
        //设置文本节点的内容
        label!.text = i
    }
}

3,圆点容器类 PointContainer.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import SpriteKit
 
class PointContainer:SKNode,UIAlertViewDelegate{
    //灰点纹理
    let textPoint1 = SKTexture(imageNamed: "pot1")
    //红点纹理
    let textPoint2 = SKTexture(imageNamed: "pot2")
    //记录所有圆点的数组
    var arrPoint = [GaPoint]()
    
    func onInit(){
        for i in 0...80 {
            //默认为灰色点
            let point = GaPoint(texture: textPoint1)
            //对行数除以9取整,用来为下面判断奇偶行做准备
            let row = Int(i/9)
            //列
            let col = i%9
            //x轴位移
            var gap = 0
            //奇偶行判断
            if Int(row % 2) == 1 {
                gap = Int(textPoint1.size().width)/2
            }else {
                 
            }
            //取得纹理尺寸,用作计算位置
            let width = Int(textPoint1.size().width)
            //计算x坐标
            let x  = col * (width+5) - (9*width)/2 + gap
            //计算y坐标
            let y  = row * width - (9*width)/2
            //设置位置
            point.position = CGPointMake(CGFloat(x),CGFloat(y))
             
            //记录索引
            point.index = i
            point.onSetLabel("(i)")
            //设置z轴排序
            point.zPosition = 10
            //将点加入PointContainer中
            self.addChild(point)
            //将点加入数组中
            arrPoint.append(point)
        }
 
        //随机生成红点
        onCreateRed()
    }
     
    //随机生成红色的点
    func onCreateRed(){
        for i in 0...8 {
            let r1 = Int(arc4random() % 9) + i * 9
            let r2 = Int(arc4random() % 9) + i * 9
            onSetRed(r1)
            onSetRed(r2)
        }
    }
     
    //改变圆点类型
    func onSetRed(index:Int){
        arrPoint[index].type = PointType.red
        arrPoint[index].texture = textPoint2
    }
}

4,主界面 GameScene.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import SpriteKit
 
class GameScene: SKScene {
     
    let pointContainer = PointContainer()
     
    //当切换到这个场景视图后
    override func didMoveToView(view: SKView) {
        //将Images.xcassets中的bg.jpg 来制作背景
        var bg = SKSpriteNode(imageNamed: "bg")
        //设置位置
        bg.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
        self.addChild(bg)
         
        //设置圆点容器
        pointContainer.position = CGPoint(x:CGRectGetMidX(self.frame)-10,
            y:CGRectGetMidY(self.frame)-150);
        self.addChild(pointContainer)
        pointContainer.onInit()
         
    }
    //响应屏幕点击的方法
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
         
    }
}
原文地址:https://www.cnblogs.com/Free-Thinker/p/4841093.html