Skip to content

Instantly share code, notes, and snippets.

@mzsima
Created August 18, 2015 14:25
Show Gist options
  • Save mzsima/bad39c473b8741a0705d to your computer and use it in GitHub Desktop.
Save mzsima/bad39c473b8741a0705d to your computer and use it in GitHub Desktop.
subtraction wall
//
// ViewController.swift
// SubtractionWall
//
// Created by MizushimaYusuke on 8/18/15.
// Copyright (c) 2015 MizushimaYusuke. All rights reserved.
//
import UIKit
import SpriteKit
class ViewController: UIViewController {
weak var scene : SKScene?
var cars = Array<SKNode>()
var walls = Array<SKNode>()
override func viewDidLoad() {
super.viewDidLoad()
setupScene()
createBoxes()
createGoal()
// label
let question = "8 - 3 = ?"
let qLabel = SKLabelNode(text: question)
qLabel.fontSize = 60
qLabel.position = CGPoint(x: CGRectGetMidX(view.bounds), y: 140)
scene?.addChild(qLabel)
}
func setupScene() {
let sv = SKView(frame: view.bounds)
let s = SKScene(size: sv.frame.size)
s.backgroundColor = UIColor(hue: 0.25, saturation: 0.3, brightness: 0.7, alpha: 1)
sv.presentScene(s)
view.addSubview(sv)
s.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
scene = s
}
func createBoxes() {
func makeBox(p:CGPoint, name:String) -> SKNode {
let box = SKSpriteNode(color: UIColor(white: 0.9, alpha: 1), size: CGSize(width: 30, height: 30))
box.name = name
box.position = p
self.scene?.addChild(box)
return box
}
for i in 0...9 {
cars.append(makeBox(CGPoint(x: 70, y: i * 40 + 230), "car box"))
walls.append(makeBox(CGPoint(x: CGRectGetMidX(self.view.bounds), y: CGFloat(i) * 40 + 230), "wall box"))
}
}
func createGoal() {
let goal = SKCropNode()
goal.maskNode = SKSpriteNode(color: UIColor.whiteColor(), size: CGSize(width: 60, height: 390))
goal.position = CGPoint(x: CGRectGetMaxX(view.bounds) - 70, y: 210 + 40 * 5)
scene?.addChild(goal)
goal.addChild(SKSpriteNode(color: UIColor.whiteColor(), size: CGSize(width: 60, height: 390)))
for i in 0..<20 {
let tile = SKSpriteNode(color: UIColor(white: 0.7, alpha: 1), size: CGSize(width: 30, height: 20))
tile.position = CGPoint(x: (i%2 == 0) ? -15 : 15, y: 190 - 20 * i)
goal.addChild(tile)
}
}
func showCars(box : SKNode) {
var show = true
for (i, b) in enumerate(cars) {
b.removeAllChildren()
if show {
let car = SKSpriteNode(color: UIColor(hue: CGFloat(i) * 0.1, saturation: 1, brightness: 0.8, alpha: 1), size: CGSize(width: 30, height: 20))
car.name = "touch disabled"
b.addChild(car)
}
if b == box { show = false }
}
}
func showWall(box: SKNode) {
var show = true
for (i, b) in enumerate(walls) {
b.removeAllChildren()
if show {
let wall = SKSpriteNode(color: UIColor.brownColor(), size: CGSize(width: 10, height: 30))
wall.name = "touch disabled"
b.addChild(wall)
}
if b == box { show = false }
}
}
func start() {
cars
.filter {($0 as SKNode).children.count > 0}
.map { n -> SKNode in
return n.children.first as! SKNode
}
.each {n in
n.position = n.parent!.position
n.removeFromParent()
self.scene?.addChild(n)
n.physicsBody = SKPhysicsBody(rectangleOfSize: n.frame.size)
n.physicsBody?.linearDamping = 1.0
n.physicsBody?.restitution = 0
n.physicsBody?.applyImpulse(CGVector(dx: 6.5, dy: 0))
}
walls
.filter {($0 as SKNode).children.count > 0}
.map { n -> SKNode in
return n.children.first as! SKNode
}
.each {n in
n.position = n.parent!.position
n.removeFromParent()
self.scene?.addChild(n)
n.physicsBody = SKPhysicsBody(rectangleOfSize: n.frame.size)
n.physicsBody?.restitution = 0
n.physicsBody?.dynamic = false
}
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch {
let p = touch.locationInNode(self.scene)
var hit = scene?.nodeAtPoint(p)
if hit!.name == "touch disabled" { hit = hit!.parent }
if let name = hit?.name {
if name.hasPrefix("car box") { self.showCars(hit!) }
else if name.hasPrefix("wall box") { self.showWall(hit!) }
} else { start() }
}
}
}
extension Array {
func each(doit:T -> Void) {for i in self {doit(i)}}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment