Created
August 18, 2015 14:25
-
-
Save mzsima/bad39c473b8741a0705d to your computer and use it in GitHub Desktop.
subtraction wall
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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