From 5fb1cec770e4880a7f00ea912bffa59bbc885781 Mon Sep 17 00:00:00 2001 From: Markus Persson Date: Fri, 4 May 2018 21:03:33 +0200 Subject: [PATCH] Add Xcode template for tvOS projects This change adds an Xcode template for generating Imagine Engine game project for tvOS. --- .../tvOS Game.xctemplate/AppDelegate.swift | 16 ++++++ .../tvOS Game.xctemplate/Podfile | 7 +++ .../tvOS Game.xctemplate/TemplateIcon.png | Bin 0 -> 3841 bytes .../tvOS Game.xctemplate/TemplateIcon@2x.png | Bin 0 -> 6611 bytes .../tvOS Game.xctemplate/TemplateInfo.plist | 54 ++++++++++++++++++ .../___PACKAGENAME___Scene.swift | 42 ++++++++++++++ XcodeTemplates/README.md | 1 + 7 files changed, 120 insertions(+) create mode 100644 XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/AppDelegate.swift create mode 100644 XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/Podfile create mode 100644 XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateIcon.png create mode 100644 XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateIcon@2x.png create mode 100644 XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateInfo.plist create mode 100644 XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/___PACKAGENAME___Scene.swift diff --git a/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/AppDelegate.swift b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/AppDelegate.swift new file mode 100644 index 0000000..e5a2b63 --- /dev/null +++ b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/AppDelegate.swift @@ -0,0 +1,16 @@ +import UIKit +import ImagineEngine + +@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + let scene = ___PACKAGENAME___Scene(size: UIScreen.main.bounds.size) + + let window = GameWindow(scene: scene) + window.makeKeyAndVisible() + self.window = window + + return true + } +} diff --git a/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/Podfile b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/Podfile new file mode 100644 index 0000000..dac59d7 --- /dev/null +++ b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/Podfile @@ -0,0 +1,7 @@ +platform :tvos, '10.0' + +target '___PACKAGENAME___' do + use_frameworks! + pod 'ImagineEngine' +end + diff --git a/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateIcon.png b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7abca26e5847a7c7b87c73339c4ad76a8e1778 GIT binary patch literal 3841 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 S$F+_Bw3r$lGQ4Bp68b+!*207U literal 0 HcmV?d00001 diff --git a/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateInfo.plist b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateInfo.plist new file mode 100644 index 0000000..3c0a7ee --- /dev/null +++ b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/TemplateInfo.plist @@ -0,0 +1,54 @@ + + + + + Kind + Xcode.Xcode3.ProjectTemplateUnitKind + Identifier + com.ImagineEngine.Templates.tvOS + Ancestors + + com.apple.dt.unit.tvosApplicationBase + + Concrete + + Description + This template provides a starting point for an tvOS game powered by Imagine Engine. + Options + + + Identifier + languageChoice + Units + + Swift + + Nodes + + ___PACKAGENAME___Scene.swift + ../Podfile + + + + + + Definitions + + AppDelegate.swift + + Path + AppDelegate.swift + + ___PACKAGENAME___Scene.swift + + Path + ___PACKAGENAME___Scene.swift + + ../Podfile + + Path + Podfile + + + + diff --git a/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/___PACKAGENAME___Scene.swift b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/___PACKAGENAME___Scene.swift new file mode 100644 index 0000000..60a3a11 --- /dev/null +++ b/XcodeTemplates/Imagine Engine/tvOS Game.xctemplate/___PACKAGENAME___Scene.swift @@ -0,0 +1,42 @@ +import ImagineEngine + +// A scene acts as a container for your game objects, much like a view controller +// in a tvOS app. You can move between different scene's in a game, so you can +// split your game's menus & levels up into multiple scenes. +final class ___PACKAGENAME___Scene: Scene { + override func setup() { + // Actors are the core objects of any game, they represent all movable & + // scriptable objects - like players, enemies & collectables. + let actor = Actor() + actor.backgroundColor = .red + actor.size = Size(width: 100, height: 100) + actor.position = center + add(actor) + + // Actions enable you to move, rotate & scale your game objects over + // time. You can also define your own actions using the `Action` class + actor.repeat(RotateAction(delta: .pi * 2, duration: 2)) + + // Labels let you easily add text to your game's scenes + let label = Label(text: "Hello Imagine Engine!") + label.font = .boldSystemFont(ofSize: 20) + label.position = center + add(label) + + // Events let you script your game by reacting to things like user input + // or when two objects collided. Each game object has an `events` property + // where you can find all observable events for that object. + events.clicked.addObserver(actor) { actor in + func randomColorValue() -> Metric { + return Metric(arc4random_uniform(101)) / 100 + } + + actor.backgroundColor = Color( + red: randomColorValue(), + green: randomColorValue(), + blue: randomColorValue(), + alpha: 1 + ) + } + } +} diff --git a/XcodeTemplates/README.md b/XcodeTemplates/README.md index bc3c1fd..c279873 100644 --- a/XcodeTemplates/README.md +++ b/XcodeTemplates/README.md @@ -20,6 +20,7 @@ Done! 👌 - Open Xcode and select `New > Project...`. - Under the "iOS" tab, scroll down to the "Imagine Engine" section and select "iOS Game". + - _For tvOS; Select the "tvOS" tab, scroll down to the "Imagine Engine" section and select "tvOS Game"_ - Enter a name for your game and make sure to select "Swift" as language. - Xcode will now create a project for you. Close the project and go to the project's folder on the command line. - Run `pod install`. This will install Imagine Engine through [CocoaPods](https://cocoapods.org).