mirror of
https://github.com/workinghard/Cube4Fun.git
synced 2025-12-14 04:42:09 +00:00
Init
This commit is contained in:
@@ -8,9 +8,15 @@
|
|||||||
|
|
||||||
import SceneKit
|
import SceneKit
|
||||||
|
|
||||||
|
var lastMousePos: NSPoint = NSPoint()
|
||||||
|
var startAngle: CGFloat = CGFloat()
|
||||||
|
|
||||||
class GameView: SCNView {
|
class GameView: SCNView {
|
||||||
|
|
||||||
|
//var lastMousePos: NSPoint
|
||||||
|
|
||||||
override func mouseDown(theEvent: NSEvent) {
|
override func mouseDown(theEvent: NSEvent) {
|
||||||
|
lastMousePos = theEvent.locationInWindow
|
||||||
/* Called when a mouse click occurs */
|
/* Called when a mouse click occurs */
|
||||||
|
|
||||||
// check what nodes are clicked
|
// check what nodes are clicked
|
||||||
@@ -20,10 +26,55 @@ class GameView: SCNView {
|
|||||||
if hitResults.count > 0 {
|
if hitResults.count > 0 {
|
||||||
// retrieved the first clicked object
|
// retrieved the first clicked object
|
||||||
let result: AnyObject = hitResults[0]
|
let result: AnyObject = hitResults[0]
|
||||||
|
var anim = true
|
||||||
|
|
||||||
// get its material
|
// get its material
|
||||||
let material = result.node!.geometry!.firstMaterial!
|
let material = result.node!.geometry!.firstMaterial!
|
||||||
|
|
||||||
|
// get its name
|
||||||
|
if let node = result.node {
|
||||||
|
if let geom = node.geometry {
|
||||||
|
if let name:NSString = geom.name {
|
||||||
|
let myGeometry:SCNText = self.scene!.rootNode.childNodeWithName("myDescr", recursively: true)?.geometry as SCNText
|
||||||
|
myGeometry.string = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let boxNode = result.node {
|
||||||
|
if boxNode.name == "myBox" {
|
||||||
|
anim = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if let rootNode = self.scene?.rootNode {
|
||||||
|
if let cubeNode = rootNode.childNodeWithName("cubeNode", recursively: true) {
|
||||||
|
if let boxNode = cubeNode.childNodeWithName("myBox", recursively: true ) {
|
||||||
|
//anim = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
|
|
||||||
|
//let name:NSString = result.node!.geometry!.name!
|
||||||
|
/*
|
||||||
|
let myScene:SCNScene = self.scene!
|
||||||
|
let myRootNode:SCNNode = myScene.rootNode
|
||||||
|
let myTextNode:SCNNode = myRootNode.childNodeWithName("myDescr", recursively: false)!
|
||||||
|
let myGeometry:SCNText = myTextNode.geometry as SCNText
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//let nextNode = self.scene
|
||||||
|
//let text = self.scene?.rootNode.childNodeWithName("myDescr", recursively: true)
|
||||||
|
|
||||||
|
|
||||||
|
//println(name);
|
||||||
|
|
||||||
|
if anim {
|
||||||
|
|
||||||
// highlight it
|
// highlight it
|
||||||
SCNTransaction.begin()
|
SCNTransaction.begin()
|
||||||
SCNTransaction.setAnimationDuration(0.5)
|
SCNTransaction.setAnimationDuration(0.5)
|
||||||
@@ -38,13 +89,71 @@ class GameView: SCNView {
|
|||||||
SCNTransaction.commit()
|
SCNTransaction.commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
material.emission.contents = NSColor.redColor()
|
material.emission.contents = NSColor.whiteColor()
|
||||||
|
|
||||||
SCNTransaction.commit()
|
SCNTransaction.commit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
super.mouseDown(theEvent)
|
super.mouseDown(theEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func rotateCamera(var x: CGFloat, var y: CGFloat) {
|
||||||
|
// Save the angle for reset
|
||||||
|
startAngle = startAngle + y
|
||||||
|
|
||||||
|
// rotate
|
||||||
|
if let node = self.scene!.rootNode.childNodeWithName("cubeNode", recursively: true) {
|
||||||
|
node.runAction(SCNAction.rotateByX(0, y: y, z: 0, duration: 0.5))
|
||||||
|
}
|
||||||
|
//println(startAngle)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func mouseUp(theEvent: NSEvent) {
|
||||||
|
// Reset the last location
|
||||||
|
lastMousePos.x = 0.0
|
||||||
|
lastMousePos.y = 0.0
|
||||||
|
|
||||||
|
super.mouseUp(theEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func mouseDragged(theEvent: NSEvent) {
|
||||||
|
let mousePos = theEvent.locationInWindow
|
||||||
|
if lastMousePos.x > 0.0 {
|
||||||
|
let drag = ( (lastMousePos.x - mousePos.x ) / 50 ) * -1
|
||||||
|
rotateCamera(0.0, y: drag)
|
||||||
|
lastMousePos = mousePos
|
||||||
|
//println(drag)
|
||||||
|
}
|
||||||
|
|
||||||
|
super.mouseDragged(theEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func keyDown(theEvent: NSEvent) {
|
||||||
|
|
||||||
|
//let myCamera:SCNNode = self.scene!.rootNode.childNodeWithName("Camera", recursively: true)!
|
||||||
|
|
||||||
|
switch (theEvent.keyCode) {
|
||||||
|
case 123:
|
||||||
|
self.rotateCamera(0.0, y: -0.1)
|
||||||
|
// Left
|
||||||
|
break;
|
||||||
|
case 124:
|
||||||
|
self.rotateCamera(0.0, y: 0.1)
|
||||||
|
//self.rotateByAngle(-1.0);
|
||||||
|
//right
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
// Reset the cube
|
||||||
|
self.rotateCamera(0.0, y: -startAngle)
|
||||||
|
default:
|
||||||
|
super.keyDown(theEvent)
|
||||||
|
}
|
||||||
|
|
||||||
|
println(theEvent.keyCode);
|
||||||
|
|
||||||
|
//super.keyDown(theEvent)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,21 +15,54 @@ class GameViewController: NSViewController {
|
|||||||
|
|
||||||
override func awakeFromNib(){
|
override func awakeFromNib(){
|
||||||
// create a new scene
|
// create a new scene
|
||||||
let scene = SCNScene(named: "art.scnassets/ship.dae")!
|
//let scene = SCNScene(named: "art.scnassets/ship.dae")!
|
||||||
|
let scene = PrimitivesScene();
|
||||||
|
|
||||||
|
|
||||||
// create and add a camera to the scene
|
// create and add a camera to the scene
|
||||||
|
let camera = SCNCamera()
|
||||||
|
camera.usesOrthographicProjection = true
|
||||||
|
camera.orthographicScale = 11
|
||||||
|
camera.zNear = 0
|
||||||
|
camera.zFar = 100
|
||||||
let cameraNode = SCNNode()
|
let cameraNode = SCNNode()
|
||||||
cameraNode.camera = SCNCamera()
|
cameraNode.camera = camera
|
||||||
|
cameraNode.name = "myCamera"
|
||||||
scene.rootNode.addChildNode(cameraNode)
|
scene.rootNode.addChildNode(cameraNode)
|
||||||
|
|
||||||
// place the camera
|
// place the camera
|
||||||
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
|
var newAngle = (CGFloat)(20.0)*(CGFloat)(M_PI)/180.0
|
||||||
|
//newAngle += currentAngle
|
||||||
|
|
||||||
|
// cameraNode.transform = SCNMatrix4MakeRotation(-0.5, 0, 0, 1)
|
||||||
|
|
||||||
|
cameraNode.transform = SCNMatrix4MakeRotation(newAngle, 0, 1, 0)
|
||||||
|
cameraNode.transform = SCNMatrix4MakeRotation(-0.4, 1, 0, 0)
|
||||||
|
cameraNode.position = SCNVector3(x: 0, y: 13, z: 30)
|
||||||
|
//cameraNode.eulerAngles = SCNVector3(x: 1.0, y: 0.0, z: 0.0)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
let camera = SCNCamera()
|
||||||
|
camera.usesOrthographicProjection = true
|
||||||
|
camera.orthographicScale = 9
|
||||||
|
camera.zNear = 0
|
||||||
|
camera.zFar = 100
|
||||||
|
let cameraNode = SCNNode()
|
||||||
|
cameraNode.position = SCNVector3(x: 0, y: 0, z: 20)
|
||||||
|
cameraNode.camera = camera
|
||||||
|
let cameraOrbit = SCNNode()
|
||||||
|
cameraOrbit.name = "myCamera"
|
||||||
|
cameraOrbit.addChildNode(cameraNode)
|
||||||
|
scene.rootNode.addChildNode(cameraOrbit)
|
||||||
|
*/
|
||||||
|
|
||||||
// create and add a light to the scene
|
// create and add a light to the scene
|
||||||
let lightNode = SCNNode()
|
let lightNode = SCNNode()
|
||||||
lightNode.light = SCNLight()
|
lightNode.light = SCNLight()
|
||||||
lightNode.light!.type = SCNLightTypeOmni
|
lightNode.light!.type = SCNLightTypeDirectional
|
||||||
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
|
lightNode.light!.color = NSColor.grayColor()
|
||||||
|
lightNode.position = SCNVector3(x: 20, y: 40, z: 20)
|
||||||
scene.rootNode.addChildNode(lightNode)
|
scene.rootNode.addChildNode(lightNode)
|
||||||
|
|
||||||
// create and add an ambient light to the scene
|
// create and add an ambient light to the scene
|
||||||
@@ -39,6 +72,9 @@ class GameViewController: NSViewController {
|
|||||||
ambientLightNode.light!.color = NSColor.darkGrayColor()
|
ambientLightNode.light!.color = NSColor.darkGrayColor()
|
||||||
scene.rootNode.addChildNode(ambientLightNode)
|
scene.rootNode.addChildNode(ambientLightNode)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
// retrieve the ship node
|
// retrieve the ship node
|
||||||
let ship = scene.rootNode.childNodeWithName("ship", recursively: true)!
|
let ship = scene.rootNode.childNodeWithName("ship", recursively: true)!
|
||||||
|
|
||||||
@@ -48,12 +84,13 @@ class GameViewController: NSViewController {
|
|||||||
animation.duration = 3
|
animation.duration = 3
|
||||||
animation.repeatCount = MAXFLOAT //repeat forever
|
animation.repeatCount = MAXFLOAT //repeat forever
|
||||||
ship.addAnimation(animation, forKey: nil)
|
ship.addAnimation(animation, forKey: nil)
|
||||||
|
*/
|
||||||
|
|
||||||
// set the scene to the view
|
// set the scene to the view
|
||||||
self.gameView!.scene = scene
|
self.gameView!.scene = scene
|
||||||
|
|
||||||
// allows the user to manipulate the camera
|
// allows the user to manipulate the camera
|
||||||
self.gameView!.allowsCameraControl = true
|
//self.gameView!.allowsCameraControl = true
|
||||||
|
|
||||||
// show statistics such as fps and timing information
|
// show statistics such as fps and timing information
|
||||||
self.gameView!.showsStatistics = true
|
self.gameView!.showsStatistics = true
|
||||||
|
|||||||
85
Cube4Fun/PrimitivesScene.swift
Normal file
85
Cube4Fun/PrimitivesScene.swift
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
//
|
||||||
|
// PrimitivesScene.swift
|
||||||
|
// Cube4Fun
|
||||||
|
//
|
||||||
|
// Created by Nik on 27.03.15.
|
||||||
|
// Copyright (c) 2015 DerNik. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Cocoa
|
||||||
|
import SceneKit
|
||||||
|
import QuartzCore
|
||||||
|
|
||||||
|
|
||||||
|
class PrimitivesScene: SCNScene {
|
||||||
|
override init() {
|
||||||
|
super.init()
|
||||||
|
|
||||||
|
var radius:CGFloat = 1.0
|
||||||
|
|
||||||
|
let yCount = 4
|
||||||
|
let zCount = 4
|
||||||
|
let xCount = 4
|
||||||
|
var myIndex = 0
|
||||||
|
|
||||||
|
|
||||||
|
let text = SCNText(string: "Klick", extrusionDepth: 1)
|
||||||
|
let textNode = SCNNode(geometry: text)
|
||||||
|
textNode.name = "myDescr"
|
||||||
|
textNode.position = SCNVector3(x:-12.0 , y: 6.0, z: 0.0)
|
||||||
|
textNode.scale = SCNVector3Make(0.1, 0.1, 0.1);
|
||||||
|
|
||||||
|
self.rootNode.addChildNode(textNode)
|
||||||
|
|
||||||
|
|
||||||
|
let cubeNode = SCNNode()
|
||||||
|
cubeNode.name = "cubeNode"
|
||||||
|
|
||||||
|
let box = SCNBox(width: 11.0, height: 1.0, length: 11.0, chamferRadius: 0.1)
|
||||||
|
box.firstMaterial?.diffuse.contents = NSColor.blueColor()
|
||||||
|
let boxNode = SCNNode(geometry: box)
|
||||||
|
boxNode.name = "myBox"
|
||||||
|
boxNode.position = SCNVector3(x:0.0 , y: -6.0, z: 0.0)
|
||||||
|
cubeNode.addChildNode(boxNode)
|
||||||
|
|
||||||
|
|
||||||
|
var y:CGFloat = -4.5
|
||||||
|
for row in 0..<yCount {
|
||||||
|
var z:CGFloat = -4.5
|
||||||
|
for depth in 0..<zCount {
|
||||||
|
var x:CGFloat = -4.5
|
||||||
|
for column in 0..<xCount {
|
||||||
|
|
||||||
|
let sphereGeometry = SCNSphere(radius: radius)
|
||||||
|
sphereGeometry.name = myIndex.description
|
||||||
|
|
||||||
|
if (row % 2 == 0) {
|
||||||
|
sphereGeometry.firstMaterial?.diffuse.contents = NSColor.redColor()
|
||||||
|
} else {
|
||||||
|
sphereGeometry.firstMaterial?.diffuse.contents = NSColor.greenColor()
|
||||||
|
}
|
||||||
|
|
||||||
|
let sphereNode = SCNNode(geometry: sphereGeometry)
|
||||||
|
sphereNode.position = SCNVector3(x: x, y: y, z: z)
|
||||||
|
|
||||||
|
|
||||||
|
cubeNode.addChildNode(sphereNode)
|
||||||
|
|
||||||
|
x += 3 * CGFloat(radius)
|
||||||
|
myIndex++
|
||||||
|
|
||||||
|
}
|
||||||
|
z += 3 * CGFloat(radius)
|
||||||
|
}
|
||||||
|
y += 3 * CGFloat(radius)
|
||||||
|
}
|
||||||
|
|
||||||
|
cubeNode.runAction(SCNAction.rotateByX(0, y: -0.3, z: 0, duration: 0.0))
|
||||||
|
self.rootNode.addChildNode(cubeNode)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
required init(coder aDecoder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user