├── Game assets ├── Overlays │ ├── dpad.png │ ├── MaxIcon.png │ ├── FlowerFull.png │ ├── ItemsPearl.png │ ├── FlowerEmpty.png │ ├── congratulations.png │ └── congratulations_pandaMax.png ├── game.scnassets │ ├── bloc.scn │ ├── walk.scn │ ├── bamboo.scn │ ├── enemy.scn │ ├── flower.scn │ ├── grass.scn │ ├── level.scn │ ├── panda.scn │ ├── pearl.scn │ ├── bamboos.scn │ ├── particles.scn │ ├── sounds │ │ ├── hit.mp3 │ │ ├── wind.m4a │ │ ├── music.m4a │ │ ├── collect1.mp3 │ │ ├── collect2.mp3 │ │ ├── Step_rock_00.mp3 │ │ ├── Step_rock_01.mp3 │ │ ├── Step_rock_02.mp3 │ │ ├── Step_rock_03.mp3 │ │ ├── Step_rock_04.mp3 │ │ ├── Step_rock_05.mp3 │ │ ├── Step_rock_06.mp3 │ │ ├── Step_rock_07.mp3 │ │ ├── Step_rock_08.mp3 │ │ ├── Step_rock_09.mp3 │ │ ├── flamethrower.mp3 │ │ ├── ouch_firehit.mp3 │ │ ├── stone_roll.mp3 │ │ ├── Music_victory.mp3 │ │ ├── Step_grass_00.mp3 │ │ ├── Step_grass_01.mp3 │ │ ├── Step_grass_02.mp3 │ │ ├── Step_grass_03.mp3 │ │ ├── Step_grass_04.mp3 │ │ ├── Step_grass_05.mp3 │ │ ├── Step_grass_06.mp3 │ │ ├── Step_grass_07.mp3 │ │ ├── Step_grass_08.mp3 │ │ ├── Step_grass_09.mp3 │ │ ├── Step_splash_00.mp3 │ │ ├── Step_splash_01.mp3 │ │ ├── Step_splash_02.mp3 │ │ ├── Step_splash_03.mp3 │ │ ├── aah_extinction.mp3 │ │ ├── fire_extinction.mp3 │ │ └── panda_catch_fire.mp3 │ ├── stoneShell01.scn │ ├── stoneShell02.scn │ ├── stoneShell03.scn │ ├── textures │ │ ├── bokeh.png │ │ ├── fire.png │ │ ├── grass.png │ │ ├── smoke.png │ │ ├── spark.png │ │ ├── star.png │ │ ├── grass.pvrtc │ │ ├── splash.png │ │ ├── lightmap.png │ │ ├── ripple01.png │ │ ├── splash02.png │ │ ├── glow_ellipse.png │ │ ├── max_ambiant.png │ │ ├── max_diffuse.png │ │ ├── max_specular.png │ │ ├── moss_diffuse.png │ │ ├── rock_diffuse.png │ │ ├── rock_normal.png │ │ ├── water_normal.png │ │ ├── flower_ambiant.png │ │ ├── flower_diffuse.png │ │ ├── flower_normal.png │ │ ├── flower_normal.pvrtc │ │ ├── grass_ambient.png │ │ ├── grass_diffuse.png │ │ ├── grass_diffuse.pvrtc │ │ ├── grass_specular.png │ │ ├── ground_diffuse.png │ │ ├── ground_normal.png │ │ ├── ground_normal.pvrtc │ │ ├── ground_specular.png │ │ ├── moss_diffuse.pvrtc │ │ ├── moss_specular.png │ │ ├── moss_specular.pvrtc │ │ ├── mountain_normal.png │ │ ├── pearl_ambient.png │ │ ├── pearl_cubemap.png │ │ ├── pearl_diffuse.png │ │ ├── pearl_diffuse.pvrtc │ │ ├── puddle_diffuse.png │ │ ├── puddle_normal.png │ │ ├── rock_diffuse.pvrtc │ │ ├── rock_normal.pvrtc │ │ ├── rock_specular.png │ │ ├── rock_specular.pvrtc │ │ ├── water_ambient.png │ │ ├── water_diffuse.png │ │ ├── flower_diffuse.pvrtc │ │ ├── grass_specular.pvrtc │ │ ├── ground_diffuse.pvrtc │ │ ├── ground_specular.pvrtc │ │ ├── mountain_diffuse.png │ │ ├── mountain_normal.pvrtc │ │ ├── mountain_specular.png │ │ ├── rock_dark_diffuse.png │ │ ├── rock_dark_normal.png │ │ ├── rock_wall_diffuse.png │ │ ├── rock_wall_normal.png │ │ ├── bamboo_trunk_diffuse.png │ │ ├── flameThrower_ambient.png │ │ ├── flameThrower_diffuse.png │ │ ├── flameThrower_normal.png │ │ ├── moss_round_diffuse.png │ │ ├── moss_round_diffuse.pvrtc │ │ ├── moss_round_specular.png │ │ ├── mountain_diffuse.pvrtc │ │ ├── mountain_specular.pvrtc │ │ ├── rock_dark_diffuse.pvrtc │ │ ├── rock_dark_normal.pvrtc │ │ ├── rock_wall_diffuse.pvrtc │ │ ├── rock_wall_normal.pvrtc │ │ ├── rock_wall_specular.png │ │ ├── rock_wall_specular.pvrtc │ │ ├── bamboo_leaves_diffuse.png │ │ ├── bamboo_trunk_diffuse.pvrtc │ │ ├── flameThrower_ambient.pvrtc │ │ ├── flameThrower_diffuse.pvrtc │ │ ├── flameThrower_normal.pvrtc │ │ ├── flameThrower_specular.png │ │ ├── moss_round_specular.pvrtc │ │ ├── rock_wall_arch_diffuse.png │ │ ├── rock_wall_arch_normal.png │ │ ├── rock_wall_dark_diffuse.png │ │ ├── bamboo_leaves_diffuse.pvrtc │ │ ├── flameThrower_base_diffuse.png │ │ ├── flameThrower_specular.pvrtc │ │ ├── rock_wall_dark_diffuse.pvrtc │ │ ├── rock_wall_diffuse_noLine.png │ │ ├── rock_wall_normal_noLine.png │ │ ├── rock_wall_normal_noLine.pvrtc │ │ ├── flameThrower_base_diffuse.pvrtc │ │ ├── reflection_blurred_low_row.png │ │ ├── rock_wall_diffuse_noLine.pvrtc │ │ ├── rock_wall_arch_flower_diffuse.png │ │ ├── rock_wall_arch_flower_normal.png │ │ ├── rock_wall_arch_flower_normal.pvrtc │ │ ├── rock_wall_arch_nologo_diffuse.png │ │ ├── rock_wall_arch_flower_diffuse.pvrtc │ │ └── rock_wall_arch_nologo_diffuse.pvrtc │ └── skybox │ │ └── skybox01_cube.png └── Particle systems │ ├── glow01.png │ ├── collect.scnp │ ├── confetti.png │ └── confetti.scnp ├── Objective-C ├── iOS │ ├── Images.xcassets │ │ ├── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── ipad-29x29.png │ │ │ ├── ipad-40x40.png │ │ │ ├── ipad-76x76.png │ │ │ ├── ipad-29x29@2x.png │ │ │ ├── ipad-40x40@2x.png │ │ │ ├── ipad-76x76@2x.png │ │ │ ├── iphone-29x29@2x.png │ │ │ ├── iphone-29x29@3x.png │ │ │ ├── iphone-40x40@2x.png │ │ │ ├── iphone-40x40@3x.png │ │ │ ├── iphone-60x60@2x.png │ │ │ ├── iphone-60x60@3x.png │ │ │ ├── iphone-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── broadcast_button@2x.png │ ├── broadcast_button_on@2x.png │ ├── AAPLAppDelegate.m │ ├── AAPLAppDelegate.h │ ├── main.m │ ├── Info.plist │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Launch Screen.storyboard ├── tvOS │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── App Icon & Top Shelf Image.brandassets │ │ │ ├── App Icon - Large.imagestack │ │ │ │ ├── Back.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer1.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Front.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer3.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Middle.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer2.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Near.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer4.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Background.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer0.png │ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── App Icon - Small.imagestack │ │ │ │ ├── Back.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer1.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Front.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer3.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Middle.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer2.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Near.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer4.png │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Background.imagestacklayer │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Content.imageset │ │ │ │ │ │ ├── tvos-layer0.png │ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Top Shelf Image.imageset │ │ │ │ ├── top-shelf.png │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ └── LaunchImage.launchimage │ │ │ └── Contents.json │ ├── AAPLAppDelegate.m │ ├── AAPLAppDelegate.h │ ├── main.m │ ├── Info.plist │ └── Base.lproj │ │ └── Main.storyboard ├── OSX │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ ├── osx-16x16.png │ │ │ ├── osx-32x32.png │ │ │ ├── osx-128x128.png │ │ │ ├── osx-16x16@2x.png │ │ │ ├── osx-256x256.png │ │ │ ├── osx-32x32@2x.png │ │ │ ├── osx-512x512.png │ │ │ ├── osx-128x128@2x.png │ │ │ ├── osx-256x256@2x.png │ │ │ ├── osx-512x512@2x.png │ │ │ └── Contents.json │ ├── AAPLAppDelegate.h │ ├── AAPLAppDelegate.m │ ├── main.m │ └── Info.plist ├── Common │ ├── AAPLCharacter.h │ ├── AAPLGameViewController.h │ ├── AAPLGameView.h │ ├── AAPLGameViewControllerPrivate.h │ ├── AAPLGameControls.m │ ├── AAPLGameView.m │ ├── AAPLCharacter.m │ └── AAPLGameViewController.m └── Fox.xcodeproj │ └── project.pbxproj ├── README.md ├── LICENSE.txt └── .gitignore /Game assets/Overlays/dpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Overlays/dpad.png -------------------------------------------------------------------------------- /Game assets/Overlays/MaxIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Overlays/MaxIcon.png -------------------------------------------------------------------------------- /Game assets/Overlays/FlowerFull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Overlays/FlowerFull.png -------------------------------------------------------------------------------- /Game assets/Overlays/ItemsPearl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Overlays/ItemsPearl.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/bloc.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/bloc.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/walk.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/walk.scn -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Game assets/Overlays/FlowerEmpty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Overlays/FlowerEmpty.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/bamboo.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/bamboo.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/enemy.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/enemy.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/flower.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/flower.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/grass.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/grass.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/level.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/level.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/panda.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/panda.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/pearl.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/pearl.scn -------------------------------------------------------------------------------- /Game assets/Overlays/congratulations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Overlays/congratulations.png -------------------------------------------------------------------------------- /Game assets/Particle systems/glow01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Particle systems/glow01.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/bamboos.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/bamboos.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/particles.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/particles.scn -------------------------------------------------------------------------------- /Objective-C/iOS/broadcast_button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/broadcast_button@2x.png -------------------------------------------------------------------------------- /Game assets/Particle systems/collect.scnp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Particle systems/collect.scnp -------------------------------------------------------------------------------- /Game assets/Particle systems/confetti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Particle systems/confetti.png -------------------------------------------------------------------------------- /Game assets/Particle systems/confetti.scnp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Particle systems/confetti.scnp -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/hit.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/hit.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/wind.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/wind.m4a -------------------------------------------------------------------------------- /Objective-C/iOS/broadcast_button_on@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/broadcast_button_on@2x.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/music.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/music.m4a -------------------------------------------------------------------------------- /Game assets/game.scnassets/stoneShell01.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/stoneShell01.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/stoneShell02.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/stoneShell02.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/stoneShell03.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/stoneShell03.scn -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/bokeh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/bokeh.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/fire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/fire.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/grass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/grass.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/smoke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/smoke.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/spark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/spark.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/star.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/collect1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/collect1.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/collect2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/collect2.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/grass.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/grass.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/splash.png -------------------------------------------------------------------------------- /Game assets/Overlays/congratulations_pandaMax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/Overlays/congratulations_pandaMax.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_00.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_00.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_01.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_02.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_02.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_03.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_03.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_04.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_04.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_05.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_05.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_06.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_06.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_07.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_07.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_08.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_08.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_rock_09.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_rock_09.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/flamethrower.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/flamethrower.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/ouch_firehit.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/ouch_firehit.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/stone_roll.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/stone_roll.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/lightmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/lightmap.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/ripple01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/ripple01.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/splash02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/splash02.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/skybox/skybox01_cube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/skybox/skybox01_cube.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Music_victory.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Music_victory.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_00.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_00.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_01.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_02.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_02.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_03.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_03.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_04.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_04.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_05.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_05.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_06.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_06.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_07.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_07.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_08.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_08.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_grass_09.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_grass_09.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_splash_00.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_splash_00.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_splash_01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_splash_01.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_splash_02.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_splash_02.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/Step_splash_03.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/Step_splash_03.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/aah_extinction.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/aah_extinction.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/glow_ellipse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/glow_ellipse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/max_ambiant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/max_ambiant.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/max_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/max_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/max_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/max_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/water_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/water_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/fire_extinction.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/fire_extinction.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/sounds/panda_catch_fire.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/sounds/panda_catch_fire.mp3 -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flower_ambiant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flower_ambiant.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flower_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flower_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flower_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flower_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flower_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flower_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/grass_ambient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/grass_ambient.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/grass_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/grass_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/grass_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/grass_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/grass_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/grass_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/ground_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/ground_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/ground_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/ground_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/ground_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/ground_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/ground_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/ground_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/mountain_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/mountain_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/pearl_ambient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/pearl_ambient.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/pearl_cubemap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/pearl_cubemap.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/pearl_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/pearl_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/pearl_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/pearl_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/puddle_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/puddle_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/puddle_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/puddle_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/water_ambient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/water_ambient.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/water_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/water_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flower_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flower_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/grass_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/grass_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/ground_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/ground_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/ground_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/ground_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/mountain_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/mountain_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/mountain_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/mountain_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/mountain_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/mountain_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_dark_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_dark_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_dark_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_dark_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/bamboo_trunk_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/bamboo_trunk_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_ambient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_ambient.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_round_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_round_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_round_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_round_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_round_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_round_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/mountain_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/mountain_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/mountain_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/mountain_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_dark_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_dark_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_dark_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_dark_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/bamboo_leaves_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/bamboo_leaves_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/bamboo_trunk_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/bamboo_trunk_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_ambient.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_ambient.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_specular.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/moss_round_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/moss_round_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_dark_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_dark_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/bamboo_leaves_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/bamboo_leaves_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_base_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_base_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_specular.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_specular.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_dark_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_dark_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_diffuse_noLine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_diffuse_noLine.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_normal_noLine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_normal_noLine.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_normal_noLine.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_normal_noLine.pvrtc -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-16x16.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-32x32.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-29x29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-29x29.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-40x40.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-76x76.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/flameThrower_base_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/flameThrower_base_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/reflection_blurred_low_row.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/reflection_blurred_low_row.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_diffuse_noLine.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_diffuse_noLine.pvrtc -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-128x128.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-16x16@2x.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-256x256.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-32x32@2x.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-512x512.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_flower_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_flower_diffuse.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_flower_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_flower_normal.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_flower_normal.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_flower_normal.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_nologo_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_nologo_diffuse.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-128x128@2x.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-256x256@2x.png -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/OSX/Images.xcassets/AppIcon.appiconset/osx-512x512@2x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-29x29@2x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-40x40@2x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/ipad-76x76@2x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-29x29@2x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-29x29@3x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-40x40@2x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-40x40@3x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-60x60@2x.png -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-60x60@3x.png -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_flower_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_flower_diffuse.pvrtc -------------------------------------------------------------------------------- /Game assets/game.scnassets/textures/rock_wall_arch_nologo_diffuse.pvrtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Game assets/game.scnassets/textures/rock_wall_arch_nologo_diffuse.pvrtc -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/iOS/Images.xcassets/AppIcon.appiconset/iphone-83.5x83.5@2x.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Near.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Near.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Background.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Background.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/top-shelf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/top-shelf.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "top-shelf.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/tvos-layer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/tvos-layer1.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/tvos-layer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/tvos-layer3.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/tvos-layer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/tvos-layer2.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Near.imagestacklayer/Content.imageset/tvos-layer4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Near.imagestacklayer/Content.imageset/tvos-layer4.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/tvos-layer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/tvos-layer1.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/tvos-layer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/tvos-layer3.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/tvos-layer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/tvos-layer2.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Near.imagestacklayer/Content.imageset/tvos-layer4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Near.imagestacklayer/Content.imageset/tvos-layer4.png -------------------------------------------------------------------------------- /Objective-C/iOS/AAPLAppDelegate.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The iOS implementation of the application delegate of the game. 7 | */ 8 | 9 | #import "AAPLAppDelegate.h" 10 | 11 | @implementation AAPLAppDelegate 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Objective-C/tvOS/AAPLAppDelegate.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The tvOS implementation of the application delegate of the game. 7 | */ 8 | 9 | #import "AAPLAppDelegate.h" 10 | 11 | @implementation AAPLAppDelegate 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Background.imagestacklayer/Content.imageset/tvos-layer0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Background.imagestacklayer/Content.imageset/tvos-layer0.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Background.imagestacklayer/Content.imageset/tvos-layer0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mobcrush/ReplayKitDemo/HEAD/Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Background.imagestacklayer/Content.imageset/tvos-layer0.png -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer1.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer3.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Near.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer4.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer1.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer3.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Near.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer4.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "landscape", 5 | "idiom" : "tv", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "9.0", 8 | "scale" : "1x" 9 | } 10 | ], 11 | "info" : { 12 | "version" : 1, 13 | "author" : "xcode" 14 | } 15 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Background.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer0.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer2.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Background.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer0.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "filename" : "tvos-layer2.png", 6 | "scale" : "1x" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "xcode" 12 | } 13 | } -------------------------------------------------------------------------------- /Objective-C/OSX/AAPLAppDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The OS X implementation of the application delegate of the game. 7 | */ 8 | 9 | @import Cocoa; 10 | 11 | @interface AAPLAppDelegate : NSObject 12 | 13 | @property (weak) IBOutlet NSWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Objective-C/iOS/AAPLAppDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The iOS implementation of the application delegate of the game. 7 | */ 8 | 9 | @import UIKit; 10 | 11 | @interface AAPLAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Objective-C/tvOS/AAPLAppDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The tvOS implementation of the application delegate of the game. 7 | */ 8 | 9 | @import UIKit; 10 | 11 | @interface AAPLAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Objective-C/OSX/AAPLAppDelegate.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The OS X implementation of the application delegate of the game. 7 | */ 8 | 9 | #import "AAPLAppDelegate.h" 10 | 11 | @implementation AAPLAppDelegate 12 | 13 | - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(nonnull NSApplication *)sender { 14 | return YES; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "layers" : [ 3 | { 4 | "filename" : "Near.imagestacklayer" 5 | }, 6 | { 7 | "filename" : "Front.imagestacklayer" 8 | }, 9 | { 10 | "filename" : "Middle.imagestacklayer" 11 | }, 12 | { 13 | "filename" : "Back.imagestacklayer" 14 | }, 15 | { 16 | "filename" : "Background.imagestacklayer" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "layers" : [ 3 | { 4 | "filename" : "Near.imagestacklayer" 5 | }, 6 | { 7 | "filename" : "Front.imagestacklayer" 8 | }, 9 | { 10 | "filename" : "Middle.imagestacklayer" 11 | }, 12 | { 13 | "filename" : "Back.imagestacklayer" 14 | }, 15 | { 16 | "filename" : "Background.imagestacklayer" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Objective-C/tvOS/Images.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets" : [ 3 | { 4 | "size" : "1280x768", 5 | "idiom" : "tv", 6 | "filename" : "App Icon - Large.imagestack", 7 | "role" : "primary-app-icon" 8 | }, 9 | { 10 | "size" : "400x240", 11 | "idiom" : "tv", 12 | "filename" : "App Icon - Small.imagestack", 13 | "role" : "primary-app-icon" 14 | }, 15 | { 16 | "size" : "1920x720", 17 | "idiom" : "tv", 18 | "filename" : "Top Shelf Image.imageset", 19 | "role" : "top-shelf-image" 20 | } 21 | ], 22 | "info" : { 23 | "version" : 1, 24 | "author" : "xcode" 25 | } 26 | } -------------------------------------------------------------------------------- /Objective-C/OSX/main.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | This sample code demonstrates how to use Xcode to build a SceneKit level, choose the renderer in between Metal and OpenGL ES, add positional audio triggers, and setup light maps with the new material properties. 7 | It also demonstrates the usage of particle systems, complex material settings including normal and illumination maps. SceneKit's physics is used to detect collisions with walls, ground, enemy and to collect collectable items. 8 | This sample app also show how to use SpriteKit to achieve the 2D game overlays (for score and congratulations screen). 9 | */ 10 | 11 | @import Cocoa; 12 | 13 | int main(int argc, const char * argv[]) { 14 | return NSApplicationMain(argc, argv); 15 | } 16 | -------------------------------------------------------------------------------- /Objective-C/Common/AAPLCharacter.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | This class manages the main character, including its animations, sounds and direction. 7 | */ 8 | 9 | @import Foundation; 10 | 11 | typedef NS_ENUM(NSUInteger, AAPLGroundType) { 12 | AAPLGroundTypeGrass, 13 | AAPLGroundTypeRock, 14 | AAPLGroundTypeWater, 15 | AAPLGroundTypeInTheAir, 16 | AAPLGroundTypeCount 17 | }; 18 | 19 | @interface AAPLCharacter : NSObject 20 | 21 | @property(nonatomic, readonly) SCNNode *node; 22 | 23 | - (SCNNode *)walkInDirection:(vector_float3)direction time:(NSTimeInterval)time scene:(SCNScene *)scene groundTypeFromMaterial:(AAPLGroundType(^)(SCNMaterial *))groundTypeFromMaterial; 24 | - (void)catchFire; 25 | - (void)haltFire; 26 | 27 | @end 28 | 29 | -------------------------------------------------------------------------------- /Objective-C/iOS/main.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | This sample code demonstrates how to use Xcode to build a SceneKit level, choose the renderer in between Metal and OpenGL ES, add positional audio triggers, and setup light maps with the new material properties. 7 | It also demonstrates the usage of particle systems, complex material settings including normal and illumination maps. SceneKit's physics is used to detect collisions with walls, ground, enemy and to collect collectable items. 8 | This sample app also show how to use SpriteKit to achieve the 2D game overlays (for score and congratulations screen). 9 | */ 10 | 11 | @import UIKit; 12 | 13 | #import "AAPLAppDelegate.h" 14 | 15 | int main(int argc, char * argv[]) { 16 | @autoreleasepool { 17 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AAPLAppDelegate class])); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Objective-C/tvOS/main.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | This sample code demonstrates how to use Xcode to build a SceneKit level, choose the renderer in between Metal and OpenGL ES, add positional audio triggers, and setup light maps with the new material properties. 7 | It also demonstrates the usage of particle systems, complex material settings including normal and illumination maps. SceneKit's physics is used to detect collisions with walls, ground, enemy and to collect collectable items. 8 | This sample app also show how to use SpriteKit to achieve the 2D game overlays (for score and congratulations screen). 9 | */ 10 | 11 | @import UIKit; 12 | 13 | #import "AAPLAppDelegate.h" 14 | 15 | int main(int argc, char * argv[]) { 16 | @autoreleasepool { 17 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AAPLAppDelegate class])); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Objective-C/Common/AAPLGameViewController.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | This class manages most of the game logic. 7 | */ 8 | 9 | @import SceneKit; 10 | 11 | #import "AAPLGameView.h" 12 | 13 | // Collision bit masks 14 | typedef NS_OPTIONS(NSUInteger, AAPLBitmask) { 15 | AAPLBitmaskCollision = 1UL << 2, 16 | AAPLBitmaskCollectable = 1UL << 3, 17 | AAPLBitmaskEnemy = 1UL << 4, 18 | AAPLBitmaskSuperCollectable = 1UL << 5, 19 | AAPLBitmaskWater = 1UL << 6 20 | }; 21 | 22 | #if TARGET_OS_IOS || TARGET_OS_TV 23 | typedef UIViewController AAPLViewController; 24 | #else 25 | typedef NSViewController AAPLViewController; 26 | #endif 27 | 28 | @interface AAPLGameViewController : AAPLViewController 29 | 30 | @property (nonatomic, readonly) AAPLGameView *gameView; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /Objective-C/tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | arm64 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Objective-C/Common/AAPLGameView.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The view displaying the game scene, including the 2D overlay. 7 | */ 8 | 9 | @import simd; 10 | @import SceneKit; 11 | 12 | @protocol AAPLKeyboardAndMouseEventsDelegate 13 | #if !(TARGET_OS_IOS || TARGET_OS_TV) 14 | @required 15 | - (BOOL)mouseDown:(NSView *)view event:(NSEvent *)event; 16 | - (BOOL)mouseDragged:(NSView *)view event:(NSEvent *)event; 17 | - (BOOL)mouseUp:(NSView *)view event:(NSEvent *)event; 18 | - (BOOL)keyDown:(NSView *)view event:(NSEvent *)event; 19 | - (BOOL)keyUp:(NSView *)view event:(NSEvent *)event; 20 | #endif 21 | @end 22 | 23 | @interface AAPLGameView : SCNView 24 | 25 | @property(nonatomic) NSUInteger collectedPearlsCount; 26 | @property(nonatomic) NSUInteger collectedFlowersCount; 27 | 28 | - (void)showEndScreen; 29 | 30 | @property(nonatomic, weak) id eventsDelegate; 31 | 32 | #if TARGET_OS_IOS 33 | - (CGRect)virtualDPadBounds; 34 | #endif 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # ReplayKit Live Demo 3 | 4 | This repository demonstrates how to setup ReplayKit Live using a SceneKit demo game. See https://github.com/Mobcrush/ReplayKitDemo/blob/master/Objective-C/Common/AAPLGameViewController.m for the reference implementation. 5 | 6 | 7 | # Fox: Building a SceneKit Game with the Xcode Scene Editor 8 | 9 | This sample code demonstrates how to use Xcode to build a SceneKit level, choose the renderer in between Metal and OpenGL ES, add positional audio triggers, and setup light maps with the new material properties. 10 | It also demonstrates the usage of particle systems, complex material settings including normal and illumination maps. SceneKit's physics is used to detect collisions with walls, ground, enemy and to collect collectable items. 11 | This sample app also show how to use SpriteKit to achieve the 2D game overlays (for score and congratulations screen). 12 | 13 | ## Requirements 14 | 15 | ### Build 16 | 17 | Xcode 7.3, iOS 9.0 SDK, tvOS 9.0 SDK, OS X 10.11 SDK 18 | 19 | ### Runtime 20 | 21 | iOS 9.0, tvOS 9.0, OS X 10.11 22 | 23 | Copyright (C) 2016 Apple Inc. All rights reserved. 24 | -------------------------------------------------------------------------------- /Objective-C/OSX/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2015 Apple Inc. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Objective-C/tvOS/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Objective-C/OSX/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "osx-16x16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "osx-16x16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "osx-32x32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "osx-32x32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "osx-128x128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "osx-128x128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "osx-256x256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "osx-256x256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "osx-512x512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "osx-512x512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Objective-C/iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | Launch Screen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UIRequiresFullScreen 34 | 35 | UIStatusBarHidden 36 | 37 | UISupportedInterfaceOrientations 38 | 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | NSCameraUsageDescription 43 | Front-facing camera during gameplay 44 | NSMicrophoneUsageDescription 45 | Record microphone for commentary 46 | UISupportedInterfaceOrientations~ipad 47 | 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Objective-C/iOS/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /Objective-C/iOS/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "iphone-29x29@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "29x29", 11 | "idiom" : "iphone", 12 | "filename" : "iphone-29x29@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "40x40", 17 | "idiom" : "iphone", 18 | "filename" : "iphone-40x40@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "40x40", 23 | "idiom" : "iphone", 24 | "filename" : "iphone-40x40@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "60x60", 29 | "idiom" : "iphone", 30 | "filename" : "iphone-60x60@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "iphone-60x60@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "29x29", 41 | "idiom" : "ipad", 42 | "filename" : "ipad-29x29.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "29x29", 47 | "idiom" : "ipad", 48 | "filename" : "ipad-29x29@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "40x40", 53 | "idiom" : "ipad", 54 | "filename" : "ipad-40x40.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "40x40", 59 | "idiom" : "ipad", 60 | "filename" : "ipad-40x40@2x.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "76x76", 65 | "idiom" : "ipad", 66 | "filename" : "ipad-76x76.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "76x76", 71 | "idiom" : "ipad", 72 | "filename" : "ipad-76x76@2x.png", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "83.5x83.5", 77 | "idiom" : "ipad", 78 | "filename" : "iphone-83.5x83.5@2x.png", 79 | "scale" : "2x" 80 | } 81 | ], 82 | "info" : { 83 | "version" : 1, 84 | "author" : "xcode" 85 | } 86 | } -------------------------------------------------------------------------------- /Objective-C/Common/AAPLGameViewControllerPrivate.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | */ 6 | 7 | @import simd; 8 | @import SceneKit; 9 | @import GameController; 10 | 11 | #import "AAPLGameViewController.h" 12 | #import "AAPLCharacter.h" 13 | 14 | @interface AAPLGameViewController() { 15 | // Nodes to manipulate the camera 16 | SCNNode *_cameraYHandle; 17 | SCNNode *_cameraXHandle; 18 | 19 | // The character 20 | AAPLCharacter *_character; 21 | 22 | // Game states 23 | BOOL _gameIsComplete; 24 | BOOL _lockCamera; 25 | 26 | SCNMaterial *_grassArea; 27 | SCNMaterial *_waterArea; 28 | NSArray *_flames; 29 | NSArray *_enemies; 30 | 31 | // Sounds 32 | SCNAudioSource *_collectPearlSound; 33 | SCNAudioSource *_collectFlowerSound; 34 | SCNAudioPlayer *_flameThrowerSound; 35 | SCNAudioSource *_victoryMusic; 36 | 37 | // Particles 38 | SCNParticleSystem *_confettiParticleSystem; 39 | SCNParticleSystem *_collectFlowerParticleSystem; 40 | 41 | NSUInteger _collectedPearlsCount; 42 | NSUInteger _collectedFlowersCount; 43 | 44 | // Collisions 45 | CGFloat _maxPenetrationDistance; 46 | SCNVector3 _replacementPosition; 47 | BOOL _replacementPositionIsValid; 48 | 49 | // For automatic camera animation 50 | SCNNode *_currentGround; 51 | SCNNode *_mainGround; 52 | NSMapTable *_groundToCameraPosition; 53 | 54 | // Game controls 55 | GCControllerDirectionPad *_controllerDPad; 56 | vector_float2 _controllerDirection; 57 | 58 | #if !(TARGET_OS_IOS || TARGET_OS_TV) 59 | CGPoint _lastMousePosition; 60 | #elif TARGET_OS_IOS 61 | UITouch *_padTouch; 62 | UITouch *_panningTouch; 63 | #endif 64 | } 65 | 66 | - (void)panCamera:(CGPoint)direction; 67 | 68 | @end 69 | 70 | @interface AAPLGameViewController (GameControls) 71 | 72 | - (void)setupGameControllers; 73 | @property(nonatomic, readonly) vector_float2 controllerDirection; 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Sample code project: Fox: Building a SceneKit Game with the Xcode Scene Editor 2 | Version: 2.1 3 | 4 | IMPORTANT: This Apple software is supplied to you by Apple 5 | Inc. ("Apple") in consideration of your agreement to the following 6 | terms, and your use, installation, modification or redistribution of 7 | this Apple software constitutes acceptance of these terms. If you do 8 | not agree with these terms, please do not use, install, modify or 9 | redistribute this Apple software. 10 | 11 | In consideration of your agreement to abide by the following terms, and 12 | subject to these terms, Apple grants you a personal, non-exclusive 13 | license, under Apple's copyrights in this original Apple software (the 14 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 15 | Software, with or without modifications, in source and/or binary forms; 16 | provided that if you redistribute the Apple Software in its entirety and 17 | without modifications, you must retain this notice and the following 18 | text and disclaimers in all such redistributions of the Apple Software. 19 | Neither the name, trademarks, service marks or logos of Apple Inc. may 20 | be used to endorse or promote products derived from the Apple Software 21 | without specific prior written permission from Apple. Except as 22 | expressly stated in this notice, no other rights or licenses, express or 23 | implied, are granted by Apple herein, including but not limited to any 24 | patent rights that may be infringed by your derivative works or by other 25 | works in which the Apple Software may be incorporated. 26 | 27 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 28 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 29 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 30 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 31 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 32 | 33 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 34 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 35 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 36 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 37 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 38 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 39 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 40 | POSSIBILITY OF SUCH DAMAGE. 41 | 42 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node 2 | /node_modules 3 | 4 | # Xcode 5 | *.build 6 | *.dia 7 | *.tlog 8 | *.o 9 | *.d 10 | *.obj 11 | *.log 12 | *.cache 13 | *.dll 14 | *.lib 15 | *.idb 16 | *.pdb 17 | .DS_Store 18 | build/ 19 | *.pbxuser 20 | !default.pbxuser 21 | *.mode1v3 22 | !default.mode1v3 23 | *.mode2v3 24 | !default.mode2v3 25 | *.perspectivev3 26 | !default.perspectivev3 27 | *.xcworkspace 28 | !default.xcworkspace 29 | xcuserdata 30 | profile 31 | *.moved-aside 32 | DerivedData 33 | .idea/ 34 | .plugin 35 | 36 | # CocoaPods 37 | Pods/ 38 | 39 | # CocoaSeeds 40 | Seeds/ 41 | 42 | ## Ignore Visual Studio temporary files, build results, and 43 | ## files generated by popular Visual Studio add-ons. 44 | 45 | # User-specific files 46 | *.suo 47 | *.user 48 | *.sln.docstates 49 | 50 | # Build results 51 | 52 | [Dd]ebug/ 53 | [Rr]elease/ 54 | x64/ 55 | build/ 56 | [Bb]in/ 57 | [Oo]bj/ 58 | 59 | # MSTest test Results 60 | [Tt]est[Rr]esult*/ 61 | [Bb]uild[Ll]og.* 62 | 63 | *_i.c 64 | *_p.c 65 | *.ilk 66 | *.meta 67 | *.obj 68 | *.pch 69 | *.pdb 70 | *.pgc 71 | *.pgd 72 | *.rsp 73 | *.sbr 74 | *.tlb 75 | *.tli 76 | *.tlh 77 | *.tmp 78 | *.tmp_proj 79 | *.log 80 | *.vspscc 81 | *.vssscc 82 | .builds 83 | *.pidb 84 | *.log 85 | *.scc 86 | 87 | # Visual C++ cache files 88 | ipch/ 89 | *.aps 90 | *.ncb 91 | *.opensdf 92 | *.sdf 93 | *.cachefile 94 | 95 | # Visual Studio profiler 96 | *.psess 97 | *.vsp 98 | *.vspx 99 | 100 | # Guidance Automation Toolkit 101 | *.gpState 102 | 103 | # ReSharper is a .NET coding add-in 104 | _ReSharper*/ 105 | *.[Rr]e[Ss]harper 106 | 107 | # TeamCity is a build add-in 108 | _TeamCity* 109 | 110 | # DotCover is a Code Coverage Tool 111 | *.dotCover 112 | 113 | # NCrunch 114 | *.ncrunch* 115 | .*crunch*.local.xml 116 | 117 | # Installshield output folder 118 | [Ee]xpress/ 119 | 120 | # DocProject is a documentation generator add-in 121 | DocProject/buildhelp/ 122 | DocProject/Help/*.HxT 123 | DocProject/Help/*.HxC 124 | DocProject/Help/*.hhc 125 | DocProject/Help/*.hhk 126 | DocProject/Help/*.hhp 127 | DocProject/Help/Html2 128 | DocProject/Help/html 129 | 130 | # Click-Once directory 131 | publish/ 132 | 133 | # Publish Web Output 134 | *.Publish.xml 135 | *.pubxml 136 | 137 | # NuGet Packages Directory 138 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 139 | #packages/ 140 | 141 | # Windows Azure Build Output 142 | csx 143 | *.build.csdef 144 | 145 | # Windows Store app package directory 146 | AppPackages/ 147 | 148 | # Others 149 | sql/ 150 | *.Cache 151 | ClientBin/ 152 | [Ss]tyle[Cc]op.* 153 | ~$* 154 | *~ 155 | *.dbmdl 156 | *.[Pp]ublish.xml 157 | *.pfx 158 | *.publishsettings 159 | 160 | # RIA/Silverlight projects 161 | Generated_Code/ 162 | 163 | # Backup & report files from converting an old project file to a newer 164 | # Visual Studio version. Backup files are not needed, because we have git ;-) 165 | _UpgradeReport_Files/ 166 | Backup*/ 167 | UpgradeLog*.XML 168 | UpgradeLog*.htm 169 | 170 | # SQL Server files 171 | App_Data/*.mdf 172 | App_Data/*.ldf 173 | 174 | # ========================= 175 | # Windows detritus 176 | # ========================= 177 | 178 | # Windows image file caches 179 | Thumbs.db 180 | ehthumbs.db 181 | 182 | # Folder config file 183 | Desktop.ini 184 | 185 | # Recycle Bin used on file shares 186 | $RECYCLE.BIN/ 187 | 188 | # Mac crap 189 | .DS_Store 190 | -------------------------------------------------------------------------------- /Objective-C/iOS/Launch Screen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /Objective-C/iOS/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 27 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Objective-C/Common/AAPLGameControls.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | Handles keyboard (OS X), touch (iOS) and controller (iOS, tvOS) input for controlling the game. 7 | */ 8 | 9 | #import "AAPLGameViewControllerPrivate.h" 10 | 11 | static CGFloat const AAPLControllerAcceleration = 1.0 / 10.0; 12 | static CGFloat const AAPLControllerDirectionLimit = 1.0; 13 | 14 | @implementation AAPLGameViewController (GameControls) 15 | 16 | #pragma mark - Controller orientation 17 | 18 | - (vector_float2)controllerDirection { 19 | // Poll when using a game controller 20 | if (_controllerDPad) { 21 | if (_controllerDPad.xAxis.value == 0.0 && _controllerDPad.yAxis.value == 0.0) { 22 | _controllerDirection = (vector_float2){0.0, 0.0}; 23 | } else { 24 | _controllerDirection = vector_clamp(_controllerDirection + (vector_float2){_controllerDPad.xAxis.value, -_controllerDPad.yAxis.value} * AAPLControllerAcceleration, -AAPLControllerDirectionLimit, AAPLControllerDirectionLimit); 25 | } 26 | } 27 | 28 | return _controllerDirection; 29 | } 30 | 31 | #pragma mark - Game Controller Events 32 | 33 | - (void)setupGameControllers { 34 | #if !(TARGET_OS_IOS || TARGET_OS_TV) 35 | self.gameView.eventsDelegate = self; 36 | #endif 37 | 38 | [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(handleControllerDidConnectNotification:) name:GCControllerDidConnectNotification object:nil]; 39 | } 40 | 41 | - (void)handleControllerDidConnectNotification:(NSNotification *)notification { 42 | GCController *gameController = notification.object; 43 | [self registerCharacterMovementEvents:gameController]; 44 | } 45 | 46 | - (void)registerCharacterMovementEvents:(GCController *)gameController { 47 | 48 | // An analog movement handler for D-pads and thumbsticks. 49 | __weak typeof(self) weakSelf = self; 50 | GCControllerDirectionPadValueChangedHandler movementHandler = ^(GCControllerDirectionPad *dpad, float xValue, float yValue) { 51 | typeof(self) strongSelf = weakSelf; 52 | strongSelf->_controllerDPad = dpad; 53 | }; 54 | 55 | #if TARGET_OS_TV 56 | 57 | // Apple TV remote 58 | GCMicroGamepad *microGamepad = gameController.microGamepad; 59 | // Allow the gamepad to handle transposing D-pad values when rotating the controller. 60 | microGamepad.allowsRotation = YES; 61 | microGamepad.dpad.valueChangedHandler = movementHandler; 62 | 63 | #endif 64 | 65 | // Gamepad D-pad 66 | GCGamepad *gamepad = gameController.gamepad; 67 | gamepad.dpad.valueChangedHandler = movementHandler; 68 | 69 | // Extended gamepad left thumbstick 70 | GCExtendedGamepad *extendedGamepad = gameController.extendedGamepad; 71 | extendedGamepad.leftThumbstick.valueChangedHandler = movementHandler; 72 | } 73 | 74 | #pragma mark - Touch Events 75 | 76 | #if TARGET_OS_IOS 77 | 78 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 79 | for (UITouch *touch in touches) { 80 | if (CGRectContainsPoint(self.gameView.virtualDPadBounds, [touch locationInView:self.gameView])) { 81 | // We're in the dpad 82 | if (_padTouch == nil) { 83 | _padTouch = touch; 84 | _controllerDirection = (vector_float2){0.0, 0.0}; 85 | } 86 | } 87 | else if (_panningTouch == nil) { 88 | // Start panning 89 | _panningTouch = [touches anyObject]; 90 | } 91 | 92 | if (_padTouch && _panningTouch) 93 | break; // We already have what we need 94 | } 95 | } 96 | 97 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 98 | if (_panningTouch) { 99 | CGPoint p0 = [_panningTouch previousLocationInView:self.view]; 100 | CGPoint p1 = [_panningTouch locationInView:self.view]; 101 | CGPoint displacement = CGPointMake(p1.x - p0.x, p1.y - p0.y); 102 | [self panCamera:displacement]; 103 | } 104 | 105 | if (_padTouch) { 106 | CGPoint p0 = [_padTouch previousLocationInView:self.view]; 107 | CGPoint p1 = [_padTouch locationInView:self.view]; 108 | vector_float2 displacement = {p1.x - p0.x, p1.y - p0.y}; 109 | _controllerDirection = vector_clamp(vector_mix(_controllerDirection, displacement, AAPLControllerAcceleration), -AAPLControllerDirectionLimit, AAPLControllerDirectionLimit); 110 | } 111 | } 112 | 113 | - (void)commonTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 114 | if (_panningTouch) { 115 | if ([touches containsObject:_panningTouch]) { 116 | _panningTouch = nil; 117 | } 118 | } 119 | 120 | if (_padTouch) { 121 | if ([touches containsObject:_padTouch] || [[event touchesForView:self.view] containsObject:_padTouch] == NO) { 122 | _padTouch = nil; 123 | _controllerDirection = (vector_float2){0.0, 0.0}; 124 | } 125 | } 126 | } 127 | 128 | - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 129 | [self commonTouchesEnded:touches withEvent:event]; 130 | } 131 | 132 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 133 | [self commonTouchesEnded:touches withEvent:event]; 134 | } 135 | 136 | #endif 137 | 138 | #pragma mark - Mouse and Keyboard Events 139 | 140 | #if !(TARGET_OS_IOS || TARGET_OS_TV) 141 | 142 | - (BOOL)mouseDown:(NSView *)view event:(NSEvent *)theEvent { 143 | // Remember last mouse position for dragging. 144 | _lastMousePosition = [self.view convertPoint:theEvent.locationInWindow fromView:nil]; 145 | return YES; 146 | } 147 | 148 | - (BOOL)mouseDragged:(NSView *)view event:(NSEvent *)theEvent { 149 | CGPoint mousePosition = [self.view convertPoint:theEvent.locationInWindow fromView:nil]; 150 | [self panCamera:CGPointMake(mousePosition.x - _lastMousePosition.x, mousePosition.y - _lastMousePosition.y)]; 151 | _lastMousePosition = mousePosition; 152 | 153 | return YES; 154 | } 155 | 156 | - (BOOL)mouseUp:(NSView *)view event:(NSEvent *)theEvent { 157 | return YES; 158 | } 159 | 160 | - (BOOL)keyDown:(NSView *)view event:(NSEvent *)theEvent { 161 | switch (theEvent.keyCode) { 162 | case 126: // Up 163 | if (!theEvent.isARepeat) { 164 | _controllerDirection += (vector_float2){ 0, -1}; 165 | } 166 | return YES; 167 | case 125: // Down 168 | if (!theEvent.isARepeat) { 169 | _controllerDirection += (vector_float2){ 0, 1}; 170 | } 171 | return YES; 172 | case 123: // Left 173 | if (!theEvent.isARepeat) { 174 | _controllerDirection += (vector_float2){-1, 0}; 175 | } 176 | return YES; 177 | case 124: // Right 178 | if (!theEvent.isARepeat) { 179 | _controllerDirection += (vector_float2){ 1, 0}; 180 | } 181 | return YES; 182 | } 183 | 184 | return NO; 185 | } 186 | 187 | - (BOOL)keyUp:(NSView *)view event:(NSEvent *)theEvent { 188 | switch (theEvent.keyCode) { 189 | case 126: // Up 190 | if (!theEvent.isARepeat) { 191 | _controllerDirection -= (vector_float2){ 0, -1}; 192 | } 193 | return YES; 194 | case 125: // Down 195 | if (!theEvent.isARepeat) { 196 | _controllerDirection -= (vector_float2){ 0, 1}; 197 | } 198 | return YES; 199 | case 123: // Left 200 | if (!theEvent.isARepeat) { 201 | _controllerDirection -= (vector_float2){-1, 0}; 202 | } 203 | return YES; 204 | case 124: // Right 205 | if (!theEvent.isARepeat) { 206 | _controllerDirection -= (vector_float2){ 1, 0}; 207 | } 208 | return YES; 209 | } 210 | 211 | return NO; 212 | } 213 | 214 | #endif 215 | 216 | @end 217 | -------------------------------------------------------------------------------- /Objective-C/Common/AAPLGameView.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | The view displaying the game scene, including the 2D overlay. 7 | */ 8 | 9 | @import SpriteKit; 10 | 11 | #import "AAPLGameView.h" 12 | 13 | @implementation AAPLGameView { 14 | SKNode *_overlayNode; 15 | SKNode *_congratulationsGroupNode; 16 | SKLabelNode *_collectedPearlCountLabel; 17 | NSMutableArray *_collectedFlowerSprites; 18 | } 19 | 20 | #pragma mark - 2D Overlay 21 | 22 | #if TARGET_OS_IOS || TARGET_OS_TV 23 | 24 | - (void)awakeFromNib { 25 | [super awakeFromNib]; 26 | [self setup2DOverlay]; 27 | } 28 | 29 | - (void)layoutSubviews { 30 | [super layoutSubviews]; 31 | [self layout2DOverlay]; 32 | } 33 | 34 | #else 35 | 36 | - (void)viewDidMoveToWindow { 37 | [super viewDidMoveToWindow]; 38 | [self setup2DOverlay]; 39 | } 40 | 41 | - (void)setFrameSize:(NSSize)newSize { 42 | [super setFrameSize:newSize]; 43 | [self layout2DOverlay]; 44 | } 45 | 46 | #endif 47 | 48 | - (void)layout2DOverlay { 49 | _overlayNode.position = CGPointMake(0.0, self.bounds.size.height); 50 | 51 | _congratulationsGroupNode.position = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5); 52 | 53 | _congratulationsGroupNode.xScale = 1.0; 54 | _congratulationsGroupNode.yScale = 1.0; 55 | CGRect currentBbox = [_congratulationsGroupNode calculateAccumulatedFrame]; 56 | 57 | CGFloat margin = 25.0; 58 | CGRect maximumAllowedBbox = CGRectInset(self.bounds, margin, margin); 59 | 60 | CGFloat top = CGRectGetMaxY(currentBbox) - _congratulationsGroupNode.position.y; 61 | CGFloat bottom = _congratulationsGroupNode.position.y - CGRectGetMinY(currentBbox); 62 | CGFloat maxTopAllowed = CGRectGetMaxY(maximumAllowedBbox) - _congratulationsGroupNode.position.y; 63 | CGFloat maxBottomAllowed = _congratulationsGroupNode.position.y - CGRectGetMinY(maximumAllowedBbox); 64 | 65 | CGFloat left = _congratulationsGroupNode.position.x - CGRectGetMinX(currentBbox); 66 | CGFloat right = CGRectGetMaxX(currentBbox) - _congratulationsGroupNode.position.x; 67 | CGFloat maxLeftAllowed = _congratulationsGroupNode.position.x - CGRectGetMinX(maximumAllowedBbox); 68 | CGFloat maxRightAllowed = CGRectGetMaxX(maximumAllowedBbox) - _congratulationsGroupNode.position.x; 69 | 70 | CGFloat topScale = top > maxTopAllowed ? maxTopAllowed / top : 1; 71 | CGFloat bottomScale = bottom > maxBottomAllowed ? maxBottomAllowed / bottom : 1; 72 | CGFloat leftScale = left > maxLeftAllowed ? maxLeftAllowed / left : 1; 73 | CGFloat rightScale = right > maxRightAllowed ? maxRightAllowed / right : 1; 74 | 75 | CGFloat scale = MIN(topScale, MIN(bottomScale, MIN(leftScale, rightScale))); 76 | 77 | _congratulationsGroupNode.xScale = scale; 78 | _congratulationsGroupNode.yScale = scale; 79 | } 80 | 81 | - (void)setup2DOverlay { 82 | CGFloat w = self.bounds.size.width; 83 | CGFloat h = self.bounds.size.height; 84 | 85 | _overlayNode = [[SKNode alloc] init]; 86 | 87 | _collectedFlowerSprites = [[NSMutableArray alloc] init]; 88 | 89 | // Setup the game overlays using SpriteKit. 90 | SKScene *skScene = [SKScene sceneWithSize:CGSizeMake(w, h)]; 91 | skScene.scaleMode = SKSceneScaleModeResizeFill; 92 | 93 | [skScene addChild:_overlayNode]; 94 | _overlayNode.position = CGPointMake(0.0, h); 95 | 96 | // The Max icon. 97 | SKSpriteNode *characterNode = [SKSpriteNode spriteNodeWithImageNamed:@"MaxIcon.png"]; 98 | characterNode.position = CGPointMake(50, -50); 99 | characterNode.xScale = 0.5; 100 | characterNode.yScale = 0.5; 101 | [_overlayNode addChild:characterNode]; 102 | 103 | // The flowers. 104 | for (NSUInteger i = 0; i < 3; i++) { 105 | SKSpriteNode *flowerNode = [SKSpriteNode spriteNodeWithImageNamed:@"FlowerEmpty.png"]; 106 | flowerNode.position = CGPointMake(110 + i * 40, -50); 107 | flowerNode.xScale = 0.25; 108 | flowerNode.yScale = 0.25; 109 | [_overlayNode addChild:flowerNode]; 110 | [_collectedFlowerSprites addObject:flowerNode]; 111 | } 112 | 113 | // The pearl icon and count. 114 | SKSpriteNode *pearlNode = [SKSpriteNode spriteNodeWithImageNamed:@"ItemsPearl.png"]; 115 | pearlNode.position = CGPointMake(110, -100); 116 | pearlNode.xScale = 0.5; 117 | pearlNode.yScale = 0.5; 118 | [_overlayNode addChild:pearlNode]; 119 | 120 | _collectedPearlCountLabel = [[SKLabelNode alloc] initWithFontNamed:@"Chalkduster"]; 121 | _collectedPearlCountLabel.text = @"x0"; 122 | _collectedPearlCountLabel.position = CGPointMake(152, -113); 123 | [_overlayNode addChild:_collectedPearlCountLabel]; 124 | 125 | // The virtual D-pad 126 | #if TARGET_OS_IOS 127 | 128 | CGRect virtualDPadBounds = self.virtualDPadBoundsInScene; 129 | SKSpriteNode *dpadSprite = [SKSpriteNode spriteNodeWithImageNamed:@"dpad.png"]; 130 | dpadSprite.anchorPoint = CGPointMake(0.0, 0.0); 131 | dpadSprite.position = virtualDPadBounds.origin; 132 | dpadSprite.size = virtualDPadBounds.size; 133 | [skScene addChild:dpadSprite]; 134 | 135 | #endif 136 | 137 | // Assign the SpriteKit overlay to the SceneKit view. 138 | self.overlaySKScene = skScene; 139 | skScene.userInteractionEnabled = NO; 140 | } 141 | 142 | - (void)setCollectedPearlsCount:(NSUInteger)collectedPearlsCount { 143 | _collectedPearlsCount = collectedPearlsCount; 144 | if (_collectedPearlsCount == 10) { 145 | _collectedPearlCountLabel.position = CGPointMake(158, _collectedPearlCountLabel.position.y); 146 | } 147 | _collectedPearlCountLabel.text = [NSString stringWithFormat:@"x%d", (uint32_t)collectedPearlsCount]; 148 | } 149 | 150 | - (void)setCollectedFlowersCount:(NSUInteger)collectedFlowersCount { 151 | _collectedFlowerSprites[collectedFlowersCount - 1].texture = [SKTexture textureWithImageNamed:@"FlowerFull.png"]; 152 | } 153 | 154 | #pragma mark - Congratulating the Player 155 | 156 | - (void)showEndScreen { 157 | // Congratulation title 158 | SKSpriteNode *congratulationsNode = [SKSpriteNode spriteNodeWithImageNamed:@"congratulations.png"]; 159 | 160 | // Max image 161 | SKSpriteNode *characterNode = [SKSpriteNode spriteNodeWithImageNamed:@"congratulations_pandaMax.png"]; 162 | characterNode.position = CGPointMake(0.0, -220.0); 163 | characterNode.anchorPoint = CGPointMake(0.5, 0.0); 164 | 165 | _congratulationsGroupNode = [[SKNode alloc] init]; 166 | 167 | [_congratulationsGroupNode addChild:characterNode]; 168 | [_congratulationsGroupNode addChild:congratulationsNode]; 169 | 170 | SKScene *overlayScene = self.overlaySKScene; 171 | [overlayScene addChild:_congratulationsGroupNode]; 172 | 173 | // Layout the overlay 174 | [self layout2DOverlay]; 175 | 176 | // Animate 177 | congratulationsNode.alpha = 0.0; 178 | congratulationsNode.xScale = 0.0; 179 | congratulationsNode.yScale = 0.0; 180 | [congratulationsNode runAction:[SKAction group:@[[SKAction fadeInWithDuration:0.25], 181 | [SKAction sequence:@[[SKAction scaleTo:1.22 duration:0.25], [SKAction scaleTo:1.0 duration:0.1]]]]]]; 182 | 183 | 184 | characterNode.alpha = 0.0; 185 | characterNode.xScale = 0.0; 186 | characterNode.yScale = 0.0; 187 | [characterNode runAction:[SKAction sequence:@[[SKAction waitForDuration:0.5], [SKAction group:@[[SKAction fadeInWithDuration:0.5], 188 | [SKAction sequence:@[[SKAction scaleTo:1.22 duration:0.25], [SKAction scaleTo:1.0 duration:0.1]]]]]]]]; 189 | } 190 | 191 | #pragma mark - Mouse and Keyboard Events 192 | 193 | #if !(TARGET_OS_IOS || TARGET_OS_TV) 194 | 195 | - (void)mouseDown:(NSEvent *)theEvent { 196 | if (!_eventsDelegate || [_eventsDelegate mouseDown:self event:theEvent] == NO) { 197 | [super mouseDown:theEvent]; 198 | } 199 | } 200 | 201 | - (void)mouseDragged:(NSEvent *)theEvent { 202 | if (!_eventsDelegate || [_eventsDelegate mouseDragged:self event:theEvent] == NO) { 203 | [super mouseDragged:theEvent]; 204 | } 205 | } 206 | 207 | - (void)mouseUp:(NSEvent *)theEvent { 208 | if (!_eventsDelegate || [_eventsDelegate mouseUp:self event:theEvent] == NO) { 209 | [super mouseUp:theEvent]; 210 | } 211 | } 212 | 213 | - (void)keyDown:(NSEvent *)theEvent { 214 | if (!_eventsDelegate || [_eventsDelegate keyDown:self event:theEvent] == NO) { 215 | [super keyDown:theEvent]; 216 | } 217 | } 218 | 219 | - (void)keyUp:(NSEvent *)theEvent { 220 | if (!_eventsDelegate || [_eventsDelegate keyUp:self event:theEvent] == NO) { 221 | [super keyUp:theEvent]; 222 | } 223 | } 224 | 225 | #endif 226 | 227 | #pragma mark - Virtual D-pad 228 | 229 | #if TARGET_OS_IOS 230 | 231 | - (CGRect)virtualDPadBoundsInScene { 232 | return CGRectMake(10.0, 10.0, 150.0, 150.0); 233 | } 234 | 235 | - (CGRect)virtualDPadBounds { 236 | CGRect virtualDPadBounds = [self virtualDPadBoundsInScene]; 237 | virtualDPadBounds.origin.y = self.bounds.size.height - virtualDPadBounds.size.height + virtualDPadBounds.origin.y; 238 | return virtualDPadBounds; 239 | } 240 | 241 | #endif 242 | 243 | @end 244 | -------------------------------------------------------------------------------- /Objective-C/Common/AAPLCharacter.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | This class manages the main character, including its animations, sounds and direction. 7 | */ 8 | 9 | @import SceneKit; 10 | 11 | #import "AAPLCharacter.h" 12 | #import "AAPLGameViewController.h" 13 | 14 | static CGFloat const AAPLCharacterSpeedFactor = 1.538; 15 | static NSUInteger const AAPLCharacterStepsCount = 11; 16 | 17 | @implementation AAPLCharacter { 18 | // Character handle 19 | SCNNode *_node; 20 | 21 | // Controlling the character 22 | AAPLGroundType _groundType; 23 | NSTimeInterval _previousUpdateTime; 24 | CGFloat _walkSpeed; 25 | CGFloat _accelerationY; 26 | CGFloat _directionAngle; 27 | BOOL _isWalking; 28 | BOOL _isBurning; 29 | BOOL _isInvincible; 30 | 31 | // Particle systems 32 | SCNNode *_fireEmitter; 33 | SCNNode *_smokeEmitter; 34 | SCNNode *_whiteSmokeEmitter; 35 | CGFloat _fireEmitterBirthRate; 36 | CGFloat _smokeEmitterBirthRate; 37 | CGFloat _whiteSmokeEmitterBirthRate; 38 | 39 | // Sound effects 40 | SCNAudioSource *_reliefSound; 41 | SCNAudioSource *_haltFireSound; 42 | SCNAudioSource *_catchFireSound; 43 | SCNAudioSource *_steps[AAPLCharacterStepsCount][AAPLGroundTypeCount]; 44 | 45 | // Animations 46 | CAAnimation *_walkAnimation; 47 | } 48 | 49 | #pragma mark - Initialization 50 | 51 | - (instancetype)init { 52 | if (self = [super init]) { 53 | 54 | /// Load character from external file 55 | 56 | _node = [SCNNode node]; 57 | SCNScene *characterScene = [SCNScene sceneNamed:@"game.scnassets/panda.scn"]; 58 | SCNNode *characterTopLevelNode = characterScene.rootNode.childNodes[0]; 59 | [_node addChildNode:characterTopLevelNode]; 60 | 61 | 62 | /// Configure collision capsule 63 | 64 | // Collisions are handled by the physics engine. The character is approximated by 65 | // a capsule that is configured to collide with collectables, enemies and walls 66 | 67 | SCNVector3 min, max; 68 | [_node getBoundingBoxMin:&min max:&max]; 69 | CGFloat collisionCapsuleRadius = (max.x - min.x) * 0.4; 70 | CGFloat collisionCapsuleHeight = (max.y - min.y); 71 | 72 | SCNNode *characterCollisionNode = [SCNNode node]; 73 | characterCollisionNode.name = @"collider"; 74 | characterCollisionNode.position = SCNVector3Make(0.0, collisionCapsuleHeight * 0.51, 0.0);// a bit too high to not hit the floor 75 | characterCollisionNode.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeKinematic shape:[SCNPhysicsShape shapeWithGeometry:[SCNCapsule capsuleWithCapRadius:collisionCapsuleRadius height:collisionCapsuleHeight] options:nil]]; 76 | characterCollisionNode.physicsBody.contactTestBitMask = AAPLBitmaskSuperCollectable | AAPLBitmaskCollectable | AAPLBitmaskCollision | AAPLBitmaskEnemy; 77 | [_node addChildNode:characterCollisionNode]; 78 | 79 | 80 | /// Load particle systems 81 | 82 | // Particle systems were configured in the SceneKit Scene Editor 83 | // They are retrieved from the scene and their birth rate are stored for later use 84 | 85 | _fireEmitter = [characterTopLevelNode childNodeWithName:@"fire" recursively:YES]; 86 | _fireEmitterBirthRate = _fireEmitter.particleSystems[0].birthRate; 87 | _fireEmitter.particleSystems[0].birthRate = 0; 88 | _fireEmitter.hidden = NO; 89 | 90 | _smokeEmitter = [characterTopLevelNode childNodeWithName:@"smoke" recursively:YES]; 91 | _smokeEmitterBirthRate = _smokeEmitter.particleSystems[0].birthRate; 92 | _smokeEmitter.particleSystems[0].birthRate = 0; 93 | _smokeEmitter.hidden = NO; 94 | 95 | _whiteSmokeEmitter = [characterTopLevelNode childNodeWithName:@"whiteSmoke" recursively:YES]; 96 | _whiteSmokeEmitterBirthRate = _whiteSmokeEmitter.particleSystems[0].birthRate; 97 | _whiteSmokeEmitter.particleSystems[0].birthRate = 0; 98 | _whiteSmokeEmitter.hidden = NO; 99 | 100 | 101 | /// Load sound effects 102 | 103 | _reliefSound = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/aah_extinction.mp3"]; 104 | _reliefSound.volume = 2.0; 105 | [_reliefSound load]; 106 | 107 | _haltFireSound = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/fire_extinction.mp3"]; 108 | _haltFireSound.volume = 2.0; 109 | [_haltFireSound load]; 110 | 111 | _catchFireSound = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/ouch_firehit.mp3"]; 112 | _catchFireSound.volume = 2.0; 113 | [_catchFireSound load]; 114 | 115 | for (NSUInteger i = 0; i < AAPLCharacterStepsCount; i++) { 116 | _steps[i][AAPLGroundTypeGrass] = [SCNAudioSource audioSourceNamed:[NSString stringWithFormat:@"game.scnassets/sounds/Step_grass_0%d.mp3", (uint32_t)i]]; 117 | _steps[i][AAPLGroundTypeGrass].volume = 0.5; 118 | [_steps[i][AAPLGroundTypeGrass] load]; 119 | 120 | _steps[i][AAPLGroundTypeRock] = [SCNAudioSource audioSourceNamed:[NSString stringWithFormat:@"game.scnassets/sounds/Step_rock_0%d.mp3", (uint32_t)i]]; 121 | [_steps[i][AAPLGroundTypeRock] load]; 122 | 123 | _steps[i][AAPLGroundTypeWater] = [SCNAudioSource audioSourceNamed:[NSString stringWithFormat:@"game.scnassets/sounds/Step_splash_0%d.mp3", (uint32_t)i]]; 124 | [_steps[i][AAPLGroundTypeWater] load]; 125 | } 126 | 127 | 128 | /// Configure animations 129 | 130 | // Some animations are already there and can be retrieved from the scene 131 | // The "walk" animation is loaded from a file, it is configured to play foot steps at specific times during the animation 132 | 133 | [characterTopLevelNode enumerateChildNodesUsingBlock:^(SCNNode *child, BOOL *stop) { 134 | for(NSString *key in child.animationKeys) { // for every animation key 135 | CAAnimation *animation = [child animationForKey:key]; // get the animation 136 | animation.usesSceneTimeBase = NO; // make it system time based 137 | animation.repeatCount = FLT_MAX; // make it repeat forever 138 | [child addAnimation:animation forKey:key]; // animations are copied upon addition, so we have to replace the previous animation 139 | } 140 | }]; 141 | 142 | _walkAnimation = [self loadAnimationFromSceneNamed:@"game.scnassets/walk.scn"]; 143 | _walkAnimation.usesSceneTimeBase = NO; 144 | _walkAnimation.fadeInDuration = 0.3; 145 | _walkAnimation.fadeOutDuration = 0.3; 146 | _walkAnimation.repeatCount = FLT_MAX; 147 | _walkAnimation.speed = AAPLCharacterSpeedFactor; 148 | _walkAnimation.animationEvents = @[[SCNAnimationEvent animationEventWithKeyTime:0.1 block:^(CAAnimation *animation, id animatedObject, BOOL playingBackward) { [self playFootStep]; }], 149 | [SCNAnimationEvent animationEventWithKeyTime:0.6 block:^(CAAnimation *animation, id animatedObject, BOOL playingBackward) { [self playFootStep]; }]]; 150 | 151 | 152 | /// Misc 153 | 154 | _walkSpeed = 1.0; 155 | } 156 | 157 | return self; 158 | } 159 | 160 | #pragma mark - Retrieving nodes 161 | 162 | - (SCNNode *)node { 163 | return _node; 164 | } 165 | 166 | #pragma mark - Controlling the character 167 | 168 | - (void)setDirectionAngle:(CGFloat)directionAngle { 169 | _directionAngle = directionAngle; 170 | [_node runAction:[SCNAction rotateToX:0.0 y:directionAngle z:0.0 duration:0.1 shortestUnitArc:YES]]; 171 | } 172 | 173 | - (SCNNode *)walkInDirection:(vector_float3)direction time:(NSTimeInterval)time scene:(SCNScene *)scene groundTypeFromMaterial:(AAPLGroundType(^)(SCNMaterial *))groundTypeFromMaterial { 174 | // delta time since last update 175 | if (_previousUpdateTime == 0.0) { 176 | _previousUpdateTime = time; 177 | } 178 | 179 | NSTimeInterval deltaTime = MIN(time - _previousUpdateTime, 1.0 / 60.0); 180 | CGFloat characterSpeed = deltaTime * AAPLCharacterSpeedFactor * 0.84; 181 | _previousUpdateTime = time; 182 | 183 | SCNVector3 initialPosition = _node.position; 184 | 185 | // move 186 | if (direction.x != 0.0 && direction.z != 0.0) { 187 | // move character 188 | vector_float3 position = SCNVector3ToFloat3(_node.position); 189 | _node.position = SCNVector3FromFloat3(position + direction * characterSpeed); 190 | 191 | // update orientation 192 | self.directionAngle = atan2(direction.x, direction.z); 193 | 194 | self.walking = YES; 195 | } 196 | else { 197 | self.walking = NO; 198 | } 199 | 200 | // Update the altitude of the character 201 | 202 | SCNVector3 position = _node.position; 203 | SCNVector3 p0 = position; 204 | SCNVector3 p1 = position; 205 | 206 | static CGFloat const kMaxRise = 0.08; 207 | static CGFloat const kMaxJump = 10.0; 208 | p0.y -= kMaxJump; 209 | p1.y += kMaxRise; 210 | 211 | // Do a vertical ray intersection 212 | SCNNode *groundNode = nil; 213 | NSArray *results = [scene.physicsWorld rayTestWithSegmentFromPoint:p1 toPoint:p0 options:@{SCNPhysicsTestCollisionBitMaskKey: @(AAPLBitmaskCollision | AAPLBitmaskWater), SCNPhysicsTestSearchModeKey : SCNPhysicsTestSearchModeClosest}]; 214 | 215 | SCNHitTestResult *result = results.firstObject; 216 | if (result) { 217 | CGFloat groundAltitude = result.worldCoordinates.y; 218 | groundNode = result.node; 219 | 220 | SCNMaterial *groundMaterial = result.node.childNodes[0].geometry.firstMaterial; 221 | _groundType = groundTypeFromMaterial(groundMaterial); 222 | 223 | if (_groundType == AAPLGroundTypeWater) { 224 | if (_isBurning) { 225 | [self haltFire]; 226 | } 227 | 228 | // do a new ray test without the water to get the altitude of the ground (under the water). 229 | results = [scene.physicsWorld rayTestWithSegmentFromPoint:p1 toPoint:p0 options:@{SCNPhysicsTestCollisionBitMaskKey : @(AAPLBitmaskCollision), SCNPhysicsTestSearchModeKey : SCNPhysicsTestSearchModeClosest}]; 230 | 231 | result = results.firstObject; 232 | groundAltitude = result.worldCoordinates.y; 233 | } 234 | 235 | static CGFloat const kThreshold = 1e-5; 236 | static CGFloat const kGravityAcceleration = 0.18; 237 | 238 | if (groundAltitude < position.y - kThreshold) { 239 | _accelerationY += deltaTime * kGravityAcceleration; // approximation of acceleration for a delta time. 240 | if (groundAltitude < position.y - 0.2) { 241 | _groundType = AAPLGroundTypeInTheAir; 242 | } 243 | } 244 | else { 245 | _accelerationY = 0; 246 | } 247 | 248 | position.y -= _accelerationY; 249 | 250 | // reset acceleration if we touch the ground 251 | if (groundAltitude > position.y) { 252 | _accelerationY = 0; 253 | position.y = groundAltitude; 254 | } 255 | 256 | // Finally, update the position of the character. 257 | _node.position = position; 258 | 259 | } 260 | else { 261 | // no result, we are probably out the bounds of the level -> revert the position of the character. 262 | _node.position = initialPosition; 263 | } 264 | 265 | return groundNode; 266 | } 267 | 268 | #pragma mark - Animating the character 269 | 270 | - (void)setWalking:(BOOL)walking { 271 | if (_isWalking != walking) { 272 | _isWalking = walking; 273 | 274 | // Update node animation. 275 | if (_isWalking) { 276 | [_node addAnimation:_walkAnimation forKey:@"walk"]; 277 | } 278 | else { 279 | [_node removeAnimationForKey:@"walk" fadeOutDuration:0.2]; 280 | } 281 | } 282 | } 283 | 284 | - (void)setWalkSpeed:(CGFloat)walkSpeed { 285 | _walkSpeed = walkSpeed; 286 | 287 | // remove current walk animation if any. 288 | BOOL wasWalking = _isWalking; 289 | if (wasWalking) 290 | self.walking = NO; 291 | 292 | _walkAnimation.speed = AAPLCharacterSpeedFactor * _walkSpeed; 293 | 294 | // restore walk animation if needed. 295 | if (wasWalking) 296 | self.walking = YES; 297 | } 298 | 299 | #pragma mark - Dealing with fire 300 | 301 | - (void)catchFire { 302 | if (_isInvincible == NO) { 303 | _isInvincible = YES; 304 | [_node runAction:[SCNAction sequence:@[[SCNAction playAudioSource:_catchFireSound waitForCompletion:NO], 305 | [SCNAction repeatAction:[SCNAction sequence:@[[SCNAction fadeOpacityTo:0.01 duration:0.1], 306 | [SCNAction fadeOpacityTo:1.0 duration:0.1]]] 307 | count:7], 308 | [SCNAction runBlock:^(SCNNode *node) { _isInvincible = NO; }]]]]; 309 | } 310 | 311 | _isBurning = YES; 312 | 313 | // start fire + smoke 314 | _fireEmitter.particleSystems[0].birthRate = _fireEmitterBirthRate; 315 | _smokeEmitter.particleSystems[0].birthRate = _smokeEmitterBirthRate; 316 | 317 | // walk faster 318 | self.walkSpeed = 2.3; 319 | } 320 | 321 | - (void)haltFire { 322 | if (_isBurning) { 323 | _isBurning = NO; 324 | 325 | [_node runAction:[SCNAction sequence:@[[SCNAction playAudioSource:_haltFireSound waitForCompletion:true], 326 | [SCNAction playAudioSource:_reliefSound waitForCompletion:false]]]]; 327 | 328 | // stop fire and smoke 329 | _fireEmitter.particleSystems[0].birthRate = 0; 330 | [SCNTransaction begin]; 331 | [SCNTransaction setAnimationDuration:1.0]; 332 | _smokeEmitter.particleSystems[0].birthRate = 0; 333 | [SCNTransaction commit]; 334 | 335 | // start white smoke 336 | _whiteSmokeEmitter.particleSystems[0].birthRate = _whiteSmokeEmitterBirthRate; 337 | 338 | // progressively stop white smoke 339 | [SCNTransaction begin]; 340 | [SCNTransaction setAnimationDuration:5.0]; 341 | _whiteSmokeEmitter.particleSystems[0].birthRate = 0; 342 | [SCNTransaction commit]; 343 | 344 | // walk normally 345 | self.walkSpeed = 1.0; 346 | } 347 | } 348 | 349 | #pragma mark - Dealing with sound 350 | 351 | - (void)playFootStep { 352 | if (_groundType != AAPLGroundTypeInTheAir) { // We are in the air, no sound to play. 353 | // Play a random step sound. 354 | NSInteger stepSoundIndex = MIN(AAPLCharacterStepsCount - 1, (rand() / (float)RAND_MAX) * AAPLCharacterStepsCount); 355 | [_node runAction:[SCNAction playAudioSource:_steps[stepSoundIndex][_groundType] waitForCompletion:NO]]; 356 | } 357 | } 358 | 359 | #pragma mark - Utils 360 | 361 | - (CAAnimation *)loadAnimationFromSceneNamed:(NSString *)sceneName { 362 | SCNScene *scene = [SCNScene sceneNamed:sceneName]; 363 | 364 | // find top level animation 365 | __block CAAnimation *animation = nil; 366 | [scene.rootNode enumerateChildNodesUsingBlock:^(SCNNode *child, BOOL *stop) { 367 | if (child.animationKeys.count > 0) { 368 | animation = [child animationForKey:child.animationKeys[0]]; 369 | *stop = YES; 370 | } 371 | }]; 372 | 373 | return animation; 374 | } 375 | 376 | @end 377 | -------------------------------------------------------------------------------- /Objective-C/Common/AAPLGameViewController.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | This class manages most of the game logic. 7 | */ 8 | 9 | @import SpriteKit; 10 | @import QuartzCore; 11 | @import AVFoundation; 12 | 13 | #import 14 | #import "AAPLGameViewControllerPrivate.h" 15 | 16 | #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 17 | 18 | 19 | @interface AAPLGameViewController () 20 | { 21 | float _firstX; 22 | float _firstY; 23 | } 24 | @property (nonatomic, weak) RPBroadcastController *broadcastController; 25 | @property (nonatomic, strong) UIWindow *overlayWindow; 26 | @property (nonatomic, strong) UIButton *broadcastButton; 27 | @property (nonatomic, weak) UIView *cameraPreview; 28 | @property (nonatomic, strong) NSURL *chatURL; 29 | @property (nonatomic, strong) UIWebView* chatView; 30 | @property (nonatomic, assign) BOOL allowLive; 31 | @end 32 | 33 | @implementation AAPLGameViewController 34 | 35 | #pragma mark - Initialization 36 | 37 | - (void)viewDidLoad { 38 | [super viewDidLoad]; 39 | 40 | // Create a new scene. 41 | SCNScene *scene = [SCNScene sceneNamed:@"game.scnassets/level.scn"]; 42 | 43 | // Set the scene to the view and loop for the animation of the bamboos. 44 | self.gameView.scene = scene; 45 | self.gameView.playing = YES; 46 | self.gameView.loops = YES; 47 | self.allowLive = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0"); 48 | // Various setup 49 | [self setupCamera]; 50 | [self setupSounds]; 51 | 52 | // Configure particle systems 53 | _collectFlowerParticleSystem = [SCNParticleSystem particleSystemNamed:@"collect.scnp" inDirectory:nil]; 54 | _collectFlowerParticleSystem.loops = NO; 55 | _confettiParticleSystem = [SCNParticleSystem particleSystemNamed:@"confetti.scnp" inDirectory:nil]; 56 | 57 | // Add the character to the scene. 58 | _character = [[AAPLCharacter alloc] init]; 59 | [scene.rootNode addChildNode:_character.node]; 60 | 61 | SCNNode *startPosition = [scene.rootNode childNodeWithName:@"startingPoint" recursively:YES]; 62 | _character.node.transform = startPosition.transform; 63 | 64 | // Retrieve various game elements in one traversal 65 | NSMutableArray *flameNodes = [NSMutableArray array]; 66 | NSMutableArray *enemyNodes = [NSMutableArray array]; 67 | NSMutableArray *collisionNodes = [NSMutableArray array]; 68 | 69 | [scene.rootNode enumerateChildNodesUsingBlock:^(SCNNode * _Nonnull node, BOOL * _Nonnull stop) { 70 | if (node.name.length) { 71 | if ([node.name isEqualToString:@"flame"]) { 72 | node.physicsBody.categoryBitMask = AAPLBitmaskEnemy; 73 | [flameNodes addObject:node]; 74 | } 75 | else if ([node.name isEqualToString:@"enemy"]) { 76 | [enemyNodes addObject:node]; 77 | } 78 | if ([node.name rangeOfString:@"collision"].length > 0) { 79 | [collisionNodes addObject:node]; 80 | } 81 | } 82 | }]; 83 | 84 | _flames = flameNodes; 85 | _enemies = enemyNodes; 86 | 87 | for (SCNNode *node in collisionNodes) { 88 | node.hidden = NO; 89 | [self setupCollisionNode:node]; 90 | } 91 | 92 | // Setup delegates 93 | self.gameView.scene.physicsWorld.contactDelegate = self; 94 | self.gameView.delegate = self; 95 | 96 | [self setupAutomaticCameraPositions]; 97 | [self setupGameControllers]; 98 | 99 | 100 | // Setup the broadcast controls only if we are on iOS >= 10 101 | // 102 | // 103 | if(self.allowLive) 104 | { 105 | [self setupBroadcastUI]; 106 | } 107 | } 108 | 109 | #pragma mark - Setup ReplayKit Live 110 | - (void)setupBroadcastUI { 111 | UIViewController *rootViewController = [[UIViewController alloc] init]; 112 | self.overlayWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 113 | self.overlayWindow.hidden = NO; 114 | self.overlayWindow.userInteractionEnabled = NO; 115 | self.overlayWindow.backgroundColor = nil; 116 | self.overlayWindow.rootViewController = rootViewController; 117 | 118 | self.broadcastButton = [UIButton buttonWithType:UIButtonTypeCustom]; 119 | 120 | [self.broadcastButton setImage:[UIImage imageNamed:@"broadcast_button"] forState:UIControlStateNormal]; 121 | self.broadcastButton.frame = CGRectMake(self.view.frame.size.width - 120.0, -15.0, 125.0, 125.0); 122 | [self.broadcastButton addTarget:self action:@selector(didPressBroadcast) forControlEvents:UIControlEventTouchUpInside]; 123 | [self.view addSubview:self.broadcastButton]; 124 | 125 | // 126 | // Enable Microphone and Camera 127 | // 128 | RPScreenRecorder * recorder = [RPScreenRecorder sharedRecorder]; 129 | 130 | 131 | if([recorder respondsToSelector:@selector(setCameraEnabled:)]) 132 | { 133 | // This test will fail on devices < iOS 9 134 | 135 | [RPScreenRecorder sharedRecorder].microphoneEnabled = YES; 136 | [RPScreenRecorder sharedRecorder].cameraEnabled = YES; 137 | 138 | [[AVAudioSession sharedInstance] requestRecordPermission: ^(BOOL granted){ 139 | 140 | }]; 141 | // Get notified when app is returned to active state or 142 | // is moved into the foreground 143 | // 144 | [[NSNotificationCenter defaultCenter] addObserver:self 145 | selector:@selector(resumeBroadcast) 146 | name:UIApplicationDidBecomeActiveNotification 147 | object:[UIApplication sharedApplication]]; 148 | [[NSNotificationCenter defaultCenter] addObserver:self 149 | selector:@selector(resumeBroadcast) 150 | name:UIApplicationWillEnterForegroundNotification 151 | object:[UIApplication sharedApplication]]; 152 | } 153 | 154 | } 155 | - (void) resumeBroadcast 156 | { 157 | // Tell ReplayKit to Resume broadcasting 158 | 159 | if(self.broadcastController.paused) 160 | { 161 | [self.broadcastController resumeBroadcast]; 162 | } 163 | } 164 | 165 | #pragma mark - Handle Broadcast Button Touch 166 | - (void)didPressBroadcast { 167 | 168 | __weak AAPLGameViewController* bSelf = self; 169 | if (![RPScreenRecorder sharedRecorder].isRecording) { 170 | 171 | // We aren't currently broadcasting, bring up the share sheet. 172 | 173 | [RPBroadcastActivityViewController loadBroadcastActivityViewControllerWithHandler:^(RPBroadcastActivityViewController * _Nullable broadcastActivityViewController, NSError * _Nullable error) { 174 | 175 | 176 | // Here we are going to bring up the Broadcast share sheet where the user will be able to pick 177 | // a broadcast provider 178 | 179 | broadcastActivityViewController.delegate = bSelf; 180 | broadcastActivityViewController.modalPresentationStyle = UIModalPresentationPopover; 181 | 182 | if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 183 | { 184 | broadcastActivityViewController.popoverPresentationController.sourceRect = bSelf.broadcastButton.frame; 185 | broadcastActivityViewController.popoverPresentationController.sourceView = bSelf.broadcastButton; 186 | } 187 | 188 | 189 | [bSelf presentViewController:broadcastActivityViewController animated:YES completion:nil]; 190 | }]; 191 | 192 | } else { 193 | // We are currently broadcasting, disconnect. 194 | NSLog(@"Disconnecting"); 195 | [self.broadcastController finishBroadcastWithHandler:^(NSError * _Nullable error) { 196 | bSelf.chatURL = nil; 197 | [bSelf tap:nil]; 198 | [bSelf.broadcastButton setImage:[UIImage imageNamed:@"broadcast_button"] forState:UIControlStateNormal]; 199 | [bSelf.cameraPreview removeFromSuperview]; 200 | 201 | }]; 202 | } 203 | } 204 | #pragma mark - Broadcasting 205 | - (void)broadcastActivityViewController:(RPBroadcastActivityViewController *)broadcastActivityViewController 206 | didFinishWithBroadcastController:(RPBroadcastController *)broadcastController 207 | error:(NSError *)error 208 | { 209 | 210 | NSLog(@"BAC: %@ didFinishWBC: %@, err: %@", 211 | broadcastActivityViewController, 212 | broadcastController, 213 | error); 214 | 215 | // User has selected a broadcast service, now we should start streaming. 216 | 217 | [broadcastActivityViewController dismissViewControllerAnimated:YES completion:nil]; 218 | 219 | if([broadcastController.broadcastExtensionBundleID rangeOfString:@"com.mobcrush.Mobcrush"].location != NSNotFound) 220 | { 221 | // User has chosen Mobcrush. We can use the broadcast URL to generate the user's chat URL by 222 | // appending "/chat" to the end of it. 223 | self.chatURL = [NSURL URLWithString:[broadcastController.broadcastURL.absoluteString stringByAppendingString:@"/chat"]]; 224 | } 225 | self.broadcastController = broadcastController; 226 | 227 | __weak AAPLGameViewController* bSelf = self; 228 | if(!error) 229 | { 230 | [broadcastController startBroadcastWithHandler:^(NSError * _Nullable error) { 231 | 232 | NSLog(@"broadcastControllerHandler"); 233 | if (!error) { 234 | 235 | // Broadcast has started 236 | bSelf.broadcastController.delegate = self; 237 | 238 | [bSelf.broadcastButton setImage:[UIImage imageNamed:@"broadcast_button_on"] forState:UIControlStateNormal]; 239 | 240 | UIView* cameraView = [[RPScreenRecorder sharedRecorder] cameraPreviewView]; 241 | bSelf.cameraPreview = cameraView; 242 | 243 | if(cameraView) 244 | { 245 | // If the camera is enabled, create the camera preview and add it to the game's UIView 246 | 247 | cameraView.frame = CGRectMake(0, 0, 200, 200); 248 | [bSelf.view addSubview:cameraView]; 249 | { 250 | // Add a gesture recognizer so the user can drag the camera around the screen 251 | UIPanGestureRecognizer* gr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 252 | [gr setMinimumNumberOfTouches:1]; 253 | [gr setMaximumNumberOfTouches:1]; 254 | [cameraView addGestureRecognizer:gr]; 255 | } 256 | { 257 | UITapGestureRecognizer* gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)]; 258 | [cameraView addGestureRecognizer:gr]; 259 | } 260 | } 261 | 262 | } 263 | else { 264 | // Some error has occurred starting the broadcast, surface it to the user. 265 | UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Error" 266 | message:error.localizedDescription 267 | preferredStyle:UIAlertControllerStyleAlert]; 268 | 269 | [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" 270 | style:UIAlertActionStyleCancel 271 | handler:nil]]; 272 | 273 | [self presentViewController:alertController 274 | animated:YES 275 | completion:nil]; 276 | 277 | } 278 | }]; 279 | } 280 | else 281 | { 282 | NSLog(@"Error returning from Broadcast Activity: %@", error); 283 | } 284 | 285 | } 286 | 287 | // Watch for service info from broadcast service 288 | - (void)broadcastController:(RPBroadcastController *)broadcastController 289 | didUpdateServiceInfo:(NSDictionary *> *)serviceInfo 290 | { 291 | NSLog(@"didUpdateServiceInfo: %@", serviceInfo); 292 | } 293 | 294 | // Broadcast service encountered an error 295 | - (void)broadcastController:(RPBroadcastController *)broadcastController 296 | didFinishWithError:(NSError *)error 297 | { 298 | NSLog(@"didFinishWithError: %@", error); 299 | 300 | __weak AAPLGameViewController* bSelf = self; 301 | dispatch_async(dispatch_get_main_queue(), ^{ 302 | bSelf.chatURL = nil; 303 | [bSelf tap:nil]; 304 | [bSelf.broadcastButton setImage:[UIImage imageNamed:@"broadcast_button"] forState:UIControlStateNormal]; 305 | [bSelf.cameraPreview removeFromSuperview]; 306 | }); 307 | } 308 | #pragma mark - Gesture Recognizers for Camera 309 | - (void) pan: (UIPanGestureRecognizer*) sender 310 | { 311 | // Move the Camera view around by dragging 312 | CGPoint translation = [sender translationInView:self.view]; 313 | 314 | { 315 | CGRect recognizerFrame = sender.view.frame; 316 | recognizerFrame.origin.x += translation.x; 317 | recognizerFrame.origin.y += translation.y; 318 | 319 | sender.view.frame = recognizerFrame; 320 | } 321 | if(self.chatView) 322 | { 323 | CGRect recognizerFrame = self.chatView.frame; 324 | recognizerFrame.origin.x += translation.x; 325 | recognizerFrame.origin.y += translation.y; 326 | 327 | self.chatView.frame = recognizerFrame; 328 | } 329 | 330 | [sender setTranslation:CGPointMake(0, 0) inView:self.view]; 331 | } 332 | 333 | - (void) tap: (UITapGestureRecognizer*) sender 334 | { 335 | // Load the chat view if we have a chat URL 336 | if(!self.chatView && self.chatURL) 337 | { 338 | self.chatView = [[UIWebView alloc] initWithFrame:CGRectMake(self.cameraPreview.frame.origin.x, 339 | CGRectGetMaxY(self.cameraPreview.frame), 340 | 300, 341 | 500)]; 342 | 343 | NSURLRequest* request = [NSURLRequest requestWithURL:self.chatURL]; 344 | [self.chatView loadRequest:request]; 345 | [self.chatView setBackgroundColor:[UIColor clearColor]]; 346 | [self.chatView setOpaque:NO]; 347 | [self.view addSubview:self.chatView]; 348 | } 349 | else if(self.chatView) 350 | { 351 | [self.chatView removeFromSuperview]; 352 | self.chatView = nil; 353 | } 354 | } 355 | 356 | #pragma mark - Game view 357 | 358 | - (AAPLGameView *)gameView { 359 | return (AAPLGameView *)self.view; 360 | } 361 | 362 | #pragma mark - Managing the Camera 363 | 364 | - (void)panCamera:(CGPoint)direction { 365 | if (_lockCamera) { 366 | return; 367 | } 368 | 369 | #if TARGET_OS_IOS || TARGET_OS_TV 370 | direction.y *= -1.0; 371 | #endif 372 | 373 | static const CGFloat F = 0.005; 374 | 375 | // Make sure the camera handles are correctly reset (because automatic camera animations may have put the "rotation" in a weird state. 376 | [SCNTransaction begin]; 377 | [SCNTransaction setAnimationDuration:0.0]; 378 | 379 | [_cameraYHandle removeAllActions]; 380 | [_cameraXHandle removeAllActions]; 381 | 382 | if (_cameraYHandle.rotation.y < 0) { 383 | _cameraYHandle.rotation = SCNVector4Make(0, 1, 0, -_cameraYHandle.rotation.w); 384 | } 385 | 386 | if (_cameraXHandle.rotation.x < 0) { 387 | _cameraXHandle.rotation = SCNVector4Make(1, 0, 0, -_cameraXHandle.rotation.w); 388 | } 389 | 390 | [SCNTransaction commit]; 391 | 392 | // Update the camera position with some inertia. 393 | [SCNTransaction begin]; 394 | [SCNTransaction setAnimationDuration:0.5]; 395 | [SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; 396 | 397 | _cameraYHandle.rotation = SCNVector4Make(0, 1, 0, _cameraYHandle.rotation.y * (_cameraYHandle.rotation.w - direction.x * F)); 398 | _cameraXHandle.rotation = SCNVector4Make(1, 0, 0, (MAX(-M_PI_2, MIN(0.13, _cameraXHandle.rotation.w + direction.y * F)))); 399 | 400 | [SCNTransaction commit]; 401 | } 402 | 403 | - (void)updateCameraWithCurrentGround:(SCNNode *)node { 404 | if (_gameIsComplete) { 405 | return; 406 | } 407 | 408 | if (_currentGround == nil) { 409 | _currentGround = node; 410 | return; 411 | } 412 | 413 | // Automatically update the position of the camera when we move to another block. 414 | if (node != _currentGround) { 415 | _currentGround = node; 416 | 417 | NSValue *positionValue = [_groundToCameraPosition objectForKey:node]; 418 | if (positionValue) { 419 | SCNVector3 position = positionValue.SCNVector3Value; 420 | 421 | if (node == _mainGround && _character.node.position.x < 2.5) { 422 | position = SCNVector3Make(-0.098175, 3.926991, 0.0); 423 | } 424 | 425 | SCNAction *actionY = [SCNAction rotateToX:0 y:position.y z:0 duration:3.0 shortestUnitArc:YES]; 426 | actionY.timingMode = SCNActionTimingModeEaseInEaseOut; 427 | 428 | SCNAction *actionX = [SCNAction rotateToX:position.x y:0 z:0 duration:3.0 shortestUnitArc:YES]; 429 | actionX.timingMode = SCNActionTimingModeEaseInEaseOut; 430 | 431 | [_cameraYHandle runAction:actionY]; 432 | [_cameraXHandle runAction:actionX]; 433 | } 434 | } 435 | } 436 | 437 | #pragma mark - Moving the Character 438 | 439 | - (vector_float3)characterDirection { 440 | vector_float2 controllerDirection = self.controllerDirection; 441 | vector_float3 direction = {controllerDirection.x, 0.0, controllerDirection.y}; 442 | 443 | SCNNode *pov = self.gameView.pointOfView; 444 | if (pov) { 445 | SCNVector3 p1 = [pov.presentationNode convertPosition:SCNVector3Make(direction.x, direction.y, direction.z) toNode:nil]; 446 | SCNVector3 p0 = [pov.presentationNode convertPosition:SCNVector3Zero toNode:nil]; 447 | direction = (vector_float3){p1.x - p0.x, 0.0, p1.z - p0.z}; 448 | 449 | if (direction.x != 0.0 || direction.z != 0.0) { 450 | direction = vector_normalize(direction); 451 | } 452 | } 453 | 454 | return direction; 455 | } 456 | 457 | #pragma mark - SCNSceneRendererDelegate Conformance (Game Loop) 458 | 459 | // SceneKit calls this method exactly once per frame, so long as the SCNView object (or other SCNSceneRenderer object) displaying the scene is not paused. 460 | // Implement this method to add game logic to the rendering loop. Any changes you make to the scene graph during this method are immediately reflected in the displayed scene. 461 | 462 | - (AAPLGroundType)groundTypeFromMaterial:(SCNMaterial *)material { 463 | if (material == _grassArea) { 464 | return AAPLGroundTypeGrass; 465 | } 466 | if (material == _waterArea) { 467 | return AAPLGroundTypeWater; 468 | } 469 | else { 470 | return AAPLGroundTypeRock; 471 | } 472 | } 473 | 474 | - (void)renderer:(id )renderer updateAtTime:(NSTimeInterval)time { 475 | // Reset some states every frame 476 | _replacementPositionIsValid = NO; 477 | _maxPenetrationDistance = 0; 478 | 479 | SCNScene *scene = self.gameView.scene; 480 | vector_float3 direction = self.characterDirection; 481 | 482 | SCNNode *groundNode = [_character walkInDirection:direction time:time scene:scene groundTypeFromMaterial:^AAPLGroundType(SCNMaterial *material) { return [self groundTypeFromMaterial:material]; }]; 483 | if (groundNode) { 484 | [self updateCameraWithCurrentGround:groundNode]; 485 | } 486 | 487 | // Flames are static physics bodies, but they are moved by an action - So we need to tell the physics engine that the transforms did change. 488 | for (SCNNode *flame in _flames) { 489 | [flame.physicsBody resetTransform]; 490 | } 491 | 492 | // Adjust the volume of the enemy based on the distance with the character. 493 | float distanceToClosestEnemy = FLT_MAX; 494 | vector_float3 characterPosition = SCNVector3ToFloat3(_character.node.position); 495 | for (SCNNode *enemy in _enemies) { 496 | //distance to enemy 497 | SCNMatrix4 enemyTransform = enemy.worldTransform; 498 | vector_float3 enemyPosition = (vector_float3){enemyTransform.m41, enemyTransform.m42, enemyTransform.m43}; 499 | float distance = vector_distance(characterPosition, enemyPosition); 500 | distanceToClosestEnemy = MIN(distanceToClosestEnemy, distance); 501 | } 502 | 503 | // Adjust sounds volumes based on distance with the enemy. 504 | if (!_gameIsComplete) { 505 | AVAudioMixerNode *mixer = (AVAudioMixerNode *)_flameThrowerSound.audioNode; 506 | mixer.volume = 0.3 * MAX(0, MIN(1, 1 - ((distanceToClosestEnemy - 1.2) / 1.6))); 507 | } 508 | } 509 | 510 | - (void)renderer:(id )renderer didSimulatePhysicsAtTime:(NSTimeInterval)time { 511 | // If we hit a wall, position needs to be adjusted 512 | if (_replacementPositionIsValid) { 513 | _character.node.position = _replacementPosition; 514 | } 515 | } 516 | 517 | #pragma mark - SCNPhysicsContactDelegate Conformance 518 | 519 | // To receive contact messages, you set the contactDelegate property of an SCNPhysicsWorld object. 520 | // SceneKit calls your delegate methods when a contact begins, when information about the contact changes, and when the contact ends. 521 | 522 | - (void)physicsWorld:(SCNPhysicsWorld *)world didBeginContact:(SCNPhysicsContact *)contact { 523 | if (contact.nodeA.physicsBody.categoryBitMask == AAPLBitmaskCollision) { 524 | [self characterNode:contact.nodeB hitWall:contact.nodeA withContact:contact]; 525 | } 526 | if (contact.nodeB.physicsBody.categoryBitMask == AAPLBitmaskCollision) { 527 | [self characterNode:contact.nodeA hitWall:contact.nodeB withContact:contact]; 528 | } 529 | if (contact.nodeA.physicsBody.categoryBitMask == AAPLBitmaskCollectable) { 530 | [self collectPearl:contact.nodeA]; 531 | } 532 | if (contact.nodeB.physicsBody.categoryBitMask == AAPLBitmaskCollectable) { 533 | [self collectPearl:contact.nodeB]; 534 | } 535 | if (contact.nodeA.physicsBody.categoryBitMask == AAPLBitmaskSuperCollectable) { 536 | [self collectFlower:contact.nodeA]; 537 | } 538 | if (contact.nodeB.physicsBody.categoryBitMask == AAPLBitmaskSuperCollectable) { 539 | [self collectFlower:contact.nodeB]; 540 | } 541 | if (contact.nodeA.physicsBody.categoryBitMask == AAPLBitmaskEnemy) { 542 | [_character catchFire]; 543 | } 544 | if (contact.nodeB.physicsBody.categoryBitMask == AAPLBitmaskEnemy) { 545 | [_character catchFire]; 546 | } 547 | } 548 | 549 | - (void)physicsWorld:(SCNPhysicsWorld *)world didUpdateContact:(SCNPhysicsContact *)contact { 550 | if (contact.nodeA.physicsBody.categoryBitMask == AAPLBitmaskCollision) { 551 | [self characterNode:contact.nodeB hitWall:contact.nodeA withContact:contact]; 552 | } 553 | if (contact.nodeB.physicsBody.categoryBitMask == AAPLBitmaskCollision) { 554 | [self characterNode:contact.nodeA hitWall:contact.nodeB withContact:contact]; 555 | } 556 | } 557 | 558 | - (void)characterNode:(SCNNode *)characterNode hitWall:(SCNNode *)wall withContact:(SCNPhysicsContact *)contact { 559 | if (characterNode.parentNode != _character.node) { 560 | return; 561 | } 562 | 563 | if (_maxPenetrationDistance > contact.penetrationDistance) { 564 | return; 565 | } 566 | 567 | _maxPenetrationDistance = contact.penetrationDistance; 568 | 569 | vector_float3 characterPosition = SCNVector3ToFloat3(_character.node.position); 570 | vector_float3 positionOffset = SCNVector3ToFloat3(contact.contactNormal) * contact.penetrationDistance; 571 | positionOffset.y = 0; 572 | characterPosition += positionOffset; 573 | 574 | _replacementPosition = SCNVector3FromFloat3(characterPosition); 575 | _replacementPositionIsValid = YES; 576 | } 577 | 578 | #pragma mark - Scene Setup 579 | 580 | - (void)setupCamera { 581 | static CGFloat const ALTITUDE = 1.0; 582 | static CGFloat const DISTANCE = 10.0; 583 | 584 | // We create 2 nodes to manipulate the camera: 585 | // The first node "_cameraXHandle" is at the center of the world (0, ALTITUDE, 0) and will only rotate on the X axis 586 | // The second node "_cameraYHandle" is a child of the first one and will ony rotate on the Y axis 587 | // The camera node is a child of the "_cameraYHandle" at a specific distance (DISTANCE). 588 | // So rotating _cameraYHandle and _cameraXHandle will update the camera position and the camera will always look at the center of the scene. 589 | 590 | SCNNode *pov = self.gameView.pointOfView; 591 | pov.eulerAngles = SCNVector3Zero; 592 | pov.position = SCNVector3Make(0.0, 0.0, DISTANCE); 593 | 594 | _cameraXHandle = [[SCNNode alloc] init]; 595 | _cameraXHandle.rotation = SCNVector4Make(1.0, 0.0, 0.0, -M_PI_4 * 0.125); 596 | [_cameraXHandle addChildNode:pov]; 597 | 598 | _cameraYHandle = [[SCNNode alloc] init]; 599 | _cameraYHandle.position = SCNVector3Make(0.0, ALTITUDE, 0.0); 600 | _cameraYHandle.rotation = SCNVector4Make(0.0, 1.0, 0.0, M_PI_2 + M_PI_4 * 3.0); 601 | [_cameraYHandle addChildNode:_cameraXHandle]; 602 | 603 | [self.gameView.scene.rootNode addChildNode:_cameraYHandle]; 604 | 605 | // Animate camera on launch and prevent the user from manipulating the camera until the end of the animation. 606 | [SCNTransaction begin]; 607 | [SCNTransaction setCompletionBlock:^{ _lockCamera = NO; }]; 608 | 609 | _lockCamera = YES; 610 | 611 | // Create 2 additive animations that converge to 0 612 | // That way at the end of the animation, the camera will be at its default position. 613 | CABasicAnimation *cameraYAnimation = [CABasicAnimation animationWithKeyPath:@"rotation.w"]; 614 | cameraYAnimation.fromValue = @(M_PI * 2.0 - _cameraYHandle.rotation.w); 615 | cameraYAnimation.toValue = @(0.0); 616 | cameraYAnimation.additive = YES; 617 | cameraYAnimation.beginTime = CACurrentMediaTime() + 3.0; // wait a little bit before stating 618 | cameraYAnimation.fillMode = kCAFillModeBoth; 619 | cameraYAnimation.duration = 5.0; 620 | cameraYAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 621 | [_cameraYHandle addAnimation:cameraYAnimation forKey:nil]; 622 | 623 | CABasicAnimation *cameraXAnimation = [cameraYAnimation copy]; 624 | cameraXAnimation.fromValue = @(-M_PI_2 + _cameraXHandle.rotation.w); 625 | [_cameraXHandle addAnimation:cameraXAnimation forKey:nil]; 626 | 627 | [SCNTransaction commit]; 628 | } 629 | 630 | - (void)setupAutomaticCameraPositions { 631 | SCNNode *rootNode = self.gameView.scene.rootNode; 632 | 633 | _mainGround = [rootNode childNodeWithName:@"bloc05_collisionMesh_02" recursively:YES]; 634 | 635 | _groundToCameraPosition = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsOpaqueMemory valueOptions:NSPointerFunctionsStrongMemory]; 636 | 637 | [_groundToCameraPosition setObject:[NSValue valueWithSCNVector3:SCNVector3Make(-0.188683, 4.719608, 0.0)] forKey:[rootNode childNodeWithName:@"bloc04_collisionMesh_02" recursively:YES]]; 638 | [_groundToCameraPosition setObject:[NSValue valueWithSCNVector3:SCNVector3Make(-0.435909, 6.297167, 0.0)] forKey:[rootNode childNodeWithName:@"bloc03_collisionMesh" recursively:YES]]; 639 | [_groundToCameraPosition setObject:[NSValue valueWithSCNVector3:SCNVector3Make( -0.333663, 7.868592, 0.0)] forKey:[rootNode childNodeWithName:@"bloc07_collisionMesh" recursively:YES]]; 640 | [_groundToCameraPosition setObject:[NSValue valueWithSCNVector3:SCNVector3Make(-0.575011, 8.739003, 0.0)] forKey:[rootNode childNodeWithName:@"bloc08_collisionMesh" recursively:YES]]; 641 | [_groundToCameraPosition setObject:[NSValue valueWithSCNVector3:SCNVector3Make( -1.095519, 9.425292, 0.0)] forKey:[rootNode childNodeWithName:@"bloc06_collisionMesh" recursively:YES]]; 642 | [_groundToCameraPosition setObject:[NSValue valueWithSCNVector3:SCNVector3Make(-0.072051, 8.202264, 0.0)] forKey:[rootNode childNodeWithName:@"bloc05_collisionMesh_02" recursively:YES]]; 643 | [_groundToCameraPosition setObject:[NSValue valueWithSCNVector3:SCNVector3Make(-0.072051, 8.202264, 0.0)] forKey:[rootNode childNodeWithName:@"bloc05_collisionMesh_01" recursively:YES]]; 644 | } 645 | 646 | - (void)setupCollisionNode:(SCNNode *)node { 647 | if (node.geometry) { 648 | // Collision meshes must use a concave shape for intersection correctness. 649 | node.physicsBody = [SCNPhysicsBody staticBody]; 650 | node.physicsBody.categoryBitMask = AAPLBitmaskCollision; 651 | node.physicsBody.physicsShape = [SCNPhysicsShape shapeWithNode:node options:@{SCNPhysicsShapeTypeKey : SCNPhysicsShapeTypeConcavePolyhedron}]; 652 | 653 | // Get grass area to play the right sound steps 654 | if ([node.geometry.firstMaterial.name isEqualToString:@"grass-area"]) { 655 | if (_grassArea) { 656 | node.geometry.firstMaterial = _grassArea; 657 | } else { 658 | _grassArea = node.geometry.firstMaterial; 659 | } 660 | } 661 | 662 | // Get the water area 663 | if ([node.geometry.firstMaterial.name isEqualToString:@"water"]) { 664 | _waterArea = node.geometry.firstMaterial; 665 | } 666 | 667 | // Temporary workaround because concave shape created from geometry instead of node fails 668 | SCNNode *childNode = [SCNNode node]; 669 | [node addChildNode:childNode]; 670 | childNode.hidden = YES; 671 | childNode.geometry = node.geometry; 672 | node.geometry = nil; 673 | node.hidden = NO; 674 | 675 | if ([node.name isEqualToString:@"water"]) { 676 | node.physicsBody.categoryBitMask = AAPLBitmaskWater; 677 | } 678 | } 679 | 680 | for (SCNNode *childNode in node.childNodes) { 681 | if (childNode.hidden == NO) { 682 | [self setupCollisionNode:childNode]; 683 | } 684 | } 685 | } 686 | 687 | - (void)setupSounds { 688 | // Get an arbitrary node to attach the sounds to. 689 | SCNNode *node = self.gameView.scene.rootNode; 690 | 691 | SCNAudioSource *musicSource = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/music.m4a"]; 692 | musicSource.loops = YES; 693 | musicSource.volume = 0.25; 694 | musicSource.positional = NO; 695 | musicSource.shouldStream = YES; 696 | [node addAudioPlayer:[SCNAudioPlayer audioPlayerWithSource:musicSource]]; 697 | 698 | SCNAudioSource *windSource = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/wind.m4a"]; 699 | windSource.loops = YES; 700 | windSource.volume = 0.3; 701 | windSource.positional = NO; 702 | windSource.shouldStream = YES; 703 | [node addAudioPlayer:[SCNAudioPlayer audioPlayerWithSource:windSource]]; 704 | 705 | SCNAudioSource *flameThrowerSource = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/flamethrower.mp3"]; 706 | flameThrowerSource.loops = YES; 707 | flameThrowerSource.volume = 0; 708 | flameThrowerSource.positional = NO; 709 | _flameThrowerSound = [SCNAudioPlayer audioPlayerWithSource:flameThrowerSource]; 710 | [node addAudioPlayer:_flameThrowerSound]; 711 | 712 | _collectPearlSound = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/collect1.mp3"]; 713 | _collectPearlSound.volume = 0.5; 714 | [_collectPearlSound load]; 715 | 716 | _collectFlowerSound = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/collect2.mp3"]; 717 | [_collectFlowerSound load]; 718 | 719 | _victoryMusic = [SCNAudioSource audioSourceNamed:@"game.scnassets/sounds/Music_victory.mp3"]; 720 | _victoryMusic.volume = 0.5; 721 | } 722 | 723 | #pragma mark - Collecting Items 724 | 725 | - (void)removeNode:(SCNNode *)node soundToPlay:(SCNAudioSource *)sound { 726 | SCNNode *parentNode = node.parentNode; 727 | if (parentNode) { 728 | SCNNode *soundEmitter = [SCNNode node]; 729 | soundEmitter.position = node.position; 730 | [parentNode addChildNode:soundEmitter]; 731 | 732 | [soundEmitter runAction:[SCNAction sequence:@[[SCNAction playAudioSource:sound waitForCompletion:YES], 733 | [SCNAction removeFromParentNode]]]]; 734 | 735 | [node removeFromParentNode]; 736 | } 737 | } 738 | 739 | - (void)collectPearl:(SCNNode *)pearlNode { 740 | if (pearlNode.parentNode != nil) { 741 | [self removeNode:pearlNode soundToPlay:_collectPearlSound]; 742 | self.gameView.collectedPearlsCount = ++_collectedPearlsCount; 743 | } 744 | } 745 | 746 | - (NSUInteger)collectedFlowersCount { 747 | return _collectedFlowersCount; 748 | } 749 | 750 | - (void)setCollectedFlowersCount:(NSUInteger)collectedFlowersCount { 751 | _collectedFlowersCount = collectedFlowersCount; 752 | 753 | self.gameView.collectedFlowersCount = _collectedFlowersCount; 754 | if (_collectedFlowersCount == 3) { 755 | [self showEndScreen]; 756 | } 757 | } 758 | 759 | - (void)collectFlower:(SCNNode *)flowerNode { 760 | if (flowerNode.parentNode != nil) { 761 | // Emit particles. 762 | SCNMatrix4 particleSystemPosition = flowerNode.worldTransform; 763 | particleSystemPosition.m42 += 0.1; 764 | [self.gameView.scene addParticleSystem:_collectFlowerParticleSystem withTransform:particleSystemPosition]; 765 | 766 | // Remove the flower from the scene. 767 | [self removeNode:flowerNode soundToPlay:_collectFlowerSound]; 768 | self.collectedFlowersCount++; 769 | } 770 | } 771 | 772 | #pragma mark - Congratulating the Player 773 | 774 | - (void)showEndScreen { 775 | _gameIsComplete = YES; 776 | 777 | // Add confettis 778 | SCNMatrix4 particleSystemPosition = SCNMatrix4MakeTranslation(0.0, 8.0, 0.0); 779 | [self.gameView.scene addParticleSystem:_confettiParticleSystem withTransform:particleSystemPosition]; 780 | 781 | // Stop the music. 782 | [self.gameView.scene.rootNode removeAllAudioPlayers]; 783 | 784 | // Play the congrat sound. 785 | [self.gameView.scene.rootNode addAudioPlayer:[SCNAudioPlayer audioPlayerWithSource:_victoryMusic]]; 786 | 787 | // Animate the camera forever 788 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 789 | [_cameraYHandle runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:-1 z:0 duration:3]]]; 790 | [_cameraXHandle runAction:[SCNAction rotateToX:-M_PI_4 y:0 z:0 duration:5.0]]; 791 | }); 792 | 793 | [self.gameView showEndScreen]; 794 | } 795 | 796 | @end 797 | -------------------------------------------------------------------------------- /Objective-C/Fox.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 47; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 83040D181CF7AA5900F24728 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83040D171CF7AA5900F24728 /* ReplayKit.framework */; }; 11 | 8392792E1CF7B347000952E3 /* broadcast_button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8392792D1CF7B347000952E3 /* broadcast_button@2x.png */; }; 12 | 839279301CF7B451000952E3 /* broadcast_button_on@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8392792F1CF7B451000952E3 /* broadcast_button_on@2x.png */; }; 13 | 9C0EAE021BA9D44F004F26CB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C0EAE011BA9D44F004F26CB /* main.m */; }; 14 | 9C0EAE0A1BA9D44F004F26CB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C0EAE081BA9D44F004F26CB /* Main.storyboard */; }; 15 | 9C0EAE111BA9D4AF004F26CB /* AAPLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C0EAE101BA9D4AF004F26CB /* AAPLAppDelegate.m */; }; 16 | 9C0EAE131BA9D4C0004F26CB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9C0EAE121BA9D4C0004F26CB /* Images.xcassets */; }; 17 | 9C0EAE141BA9D4CA004F26CB /* game.scnassets in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1471B68E4CE00686987 /* game.scnassets */; }; 18 | 9C0EAE1C1BA9D4DA004F26CB /* AAPLGameView.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA652E1ADBF90F006293CF /* AAPLGameView.m */; }; 19 | 9C0EAE1D1BA9D4DA004F26CB /* AAPLGameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA65311ADBF90F006293CF /* AAPLGameViewController.m */; }; 20 | 9C0EAE1E1BA9D4DA004F26CB /* AAPLCharacter.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA65501ADC127F006293CF /* AAPLCharacter.m */; }; 21 | 9C0EAE261BA9D864004F26CB /* congratulations.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14D1B68E4CE00686987 /* congratulations.png */; }; 22 | 9C0EAE271BA9D864004F26CB /* congratulations_pandaMax.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14E1B68E4CE00686987 /* congratulations_pandaMax.png */; }; 23 | 9C0EAE281BA9D864004F26CB /* dpad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14F1B68E4CE00686987 /* dpad.png */; }; 24 | 9C0EAE291BA9D864004F26CB /* FlowerEmpty.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1501B68E4CE00686987 /* FlowerEmpty.png */; }; 25 | 9C0EAE2A1BA9D864004F26CB /* FlowerFull.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1511B68E4CE00686987 /* FlowerFull.png */; }; 26 | 9C0EAE2B1BA9D864004F26CB /* ItemsPearl.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1521B68E4CE00686987 /* ItemsPearl.png */; }; 27 | 9C0EAE2C1BA9D864004F26CB /* MaxIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1531B68E4CE00686987 /* MaxIcon.png */; }; 28 | 9C25F2B21BECE9F20018B67F /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C25F2B11BECE9F20018B67F /* Launch Screen.storyboard */; }; 29 | 9C7D93A41BAC863900DB9637 /* AAPLGameControls.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C7D93A31BAC863900DB9637 /* AAPLGameControls.m */; }; 30 | 9C7D93A51BAC863900DB9637 /* AAPLGameControls.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C7D93A31BAC863900DB9637 /* AAPLGameControls.m */; }; 31 | 9C7D93A61BAC863900DB9637 /* AAPLGameControls.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C7D93A31BAC863900DB9637 /* AAPLGameControls.m */; }; 32 | 9C8180B71BDA675800FE8C68 /* collect.scnp in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B31BDA675800FE8C68 /* collect.scnp */; }; 33 | 9C8180B81BDA675800FE8C68 /* collect.scnp in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B31BDA675800FE8C68 /* collect.scnp */; }; 34 | 9C8180B91BDA675800FE8C68 /* collect.scnp in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B31BDA675800FE8C68 /* collect.scnp */; }; 35 | 9C8180BA1BDA675800FE8C68 /* confetti.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B41BDA675800FE8C68 /* confetti.png */; }; 36 | 9C8180BB1BDA675800FE8C68 /* confetti.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B41BDA675800FE8C68 /* confetti.png */; }; 37 | 9C8180BC1BDA675800FE8C68 /* confetti.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B41BDA675800FE8C68 /* confetti.png */; }; 38 | 9C8180BD1BDA675800FE8C68 /* confetti.scnp in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B51BDA675800FE8C68 /* confetti.scnp */; }; 39 | 9C8180BE1BDA675800FE8C68 /* confetti.scnp in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B51BDA675800FE8C68 /* confetti.scnp */; }; 40 | 9C8180BF1BDA675800FE8C68 /* confetti.scnp in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B51BDA675800FE8C68 /* confetti.scnp */; }; 41 | 9C8180C01BDA675800FE8C68 /* glow01.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B61BDA675800FE8C68 /* glow01.png */; }; 42 | 9C8180C11BDA675800FE8C68 /* glow01.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B61BDA675800FE8C68 /* glow01.png */; }; 43 | 9C8180C21BDA675800FE8C68 /* glow01.png in Resources */ = {isa = PBXBuildFile; fileRef = 9C8180B61BDA675800FE8C68 /* glow01.png */; }; 44 | 9CF835DD1BA9BF6D004F41D1 /* AAPLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF835DC1BA9BF6D004F41D1 /* AAPLAppDelegate.m */; }; 45 | 9CF835E51BA9BF6D004F41D1 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9CF835E31BA9BF6D004F41D1 /* Main.storyboard */; }; 46 | 9CF835E71BA9BF6D004F41D1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9CF835E61BA9BF6D004F41D1 /* Images.xcassets */; }; 47 | 9CF835EF1BA9C041004F41D1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF835EE1BA9C041004F41D1 /* main.m */; }; 48 | 9CF835F11BA9C336004F41D1 /* game.scnassets in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1471B68E4CE00686987 /* game.scnassets */; }; 49 | 9CF835F21BA9C33A004F41D1 /* congratulations.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14D1B68E4CE00686987 /* congratulations.png */; }; 50 | 9CF835F31BA9C33A004F41D1 /* congratulations_pandaMax.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14E1B68E4CE00686987 /* congratulations_pandaMax.png */; }; 51 | 9CF835F41BA9C33A004F41D1 /* dpad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14F1B68E4CE00686987 /* dpad.png */; }; 52 | 9CF835F51BA9C33A004F41D1 /* FlowerEmpty.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1501B68E4CE00686987 /* FlowerEmpty.png */; }; 53 | 9CF835F61BA9C33A004F41D1 /* FlowerFull.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1511B68E4CE00686987 /* FlowerFull.png */; }; 54 | 9CF835F71BA9C33A004F41D1 /* ItemsPearl.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1521B68E4CE00686987 /* ItemsPearl.png */; }; 55 | 9CF835F81BA9C33A004F41D1 /* MaxIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1531B68E4CE00686987 /* MaxIcon.png */; }; 56 | 9CF835F91BA9C340004F41D1 /* AAPLGameView.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA652E1ADBF90F006293CF /* AAPLGameView.m */; }; 57 | 9CF835FA1BA9C340004F41D1 /* AAPLGameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA65311ADBF90F006293CF /* AAPLGameViewController.m */; }; 58 | 9CF835FB1BA9C340004F41D1 /* AAPLCharacter.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA65501ADC127F006293CF /* AAPLCharacter.m */; }; 59 | 9CFCF1541B68E4CE00686987 /* game.scnassets in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1471B68E4CE00686987 /* game.scnassets */; }; 60 | 9CFCF15E1B68E4CE00686987 /* congratulations.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14D1B68E4CE00686987 /* congratulations.png */; }; 61 | 9CFCF1601B68E4CE00686987 /* congratulations_pandaMax.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14E1B68E4CE00686987 /* congratulations_pandaMax.png */; }; 62 | 9CFCF1621B68E4CE00686987 /* dpad.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF14F1B68E4CE00686987 /* dpad.png */; }; 63 | 9CFCF1641B68E4CE00686987 /* FlowerEmpty.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1501B68E4CE00686987 /* FlowerEmpty.png */; }; 64 | 9CFCF1661B68E4CE00686987 /* FlowerFull.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1511B68E4CE00686987 /* FlowerFull.png */; }; 65 | 9CFCF1681B68E4CE00686987 /* ItemsPearl.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1521B68E4CE00686987 /* ItemsPearl.png */; }; 66 | 9CFCF16A1B68E4CE00686987 /* MaxIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CFCF1531B68E4CE00686987 /* MaxIcon.png */; }; 67 | E549666A1AF778A6001ADED6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E54966691AF778A6001ADED6 /* main.m */; }; 68 | E549666D1AF778A6001ADED6 /* AAPLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E549666C1AF778A6001ADED6 /* AAPLAppDelegate.m */; }; 69 | E54966751AF778A6001ADED6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E54966731AF778A6001ADED6 /* Main.storyboard */; }; 70 | E54966771AF778A6001ADED6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E54966761AF778A6001ADED6 /* Images.xcassets */; }; 71 | E565868B1AF779A600A24465 /* AAPLGameView.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA652E1ADBF90F006293CF /* AAPLGameView.m */; }; 72 | E565868C1AF779B100A24465 /* AAPLGameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA65311ADBF90F006293CF /* AAPLGameViewController.m */; }; 73 | E565868D1AF77A8200A24465 /* AAPLCharacter.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CA65501ADC127F006293CF /* AAPLCharacter.m */; }; 74 | /* End PBXBuildFile section */ 75 | 76 | /* Begin PBXFileReference section */ 77 | 83040D171CF7AA5900F24728 /* ReplayKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReplayKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/ReplayKit.framework; sourceTree = DEVELOPER_DIR; }; 78 | 8392792D1CF7B347000952E3 /* broadcast_button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "broadcast_button@2x.png"; sourceTree = ""; }; 79 | 8392792F1CF7B451000952E3 /* broadcast_button_on@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "broadcast_button_on@2x.png"; sourceTree = ""; }; 80 | 94CA652D1ADBF90F006293CF /* AAPLGameView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AAPLGameView.h; sourceTree = ""; }; 81 | 94CA652E1ADBF90F006293CF /* AAPLGameView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AAPLGameView.m; sourceTree = ""; }; 82 | 94CA65301ADBF90F006293CF /* AAPLGameViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AAPLGameViewController.h; sourceTree = ""; }; 83 | 94CA65311ADBF90F006293CF /* AAPLGameViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AAPLGameViewController.m; sourceTree = ""; }; 84 | 94CA65501ADC127F006293CF /* AAPLCharacter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAPLCharacter.m; sourceTree = ""; }; 85 | 94CA65521ADC129A006293CF /* AAPLCharacter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AAPLCharacter.h; sourceTree = ""; }; 86 | 9C0EADFB1BA9D44F004F26CB /* Fox (Objective-C).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Fox (Objective-C).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 87 | 9C0EAE011BA9D44F004F26CB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 88 | 9C0EAE091BA9D44F004F26CB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 89 | 9C0EAE0B1BA9D44F004F26CB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 90 | 9C0EAE0F1BA9D4AF004F26CB /* AAPLAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLAppDelegate.h; sourceTree = ""; }; 91 | 9C0EAE101BA9D4AF004F26CB /* AAPLAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAPLAppDelegate.m; sourceTree = ""; }; 92 | 9C0EAE121BA9D4C0004F26CB /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 93 | 9C25F2B11BECE9F20018B67F /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; 94 | 9C7D93A31BAC863900DB9637 /* AAPLGameControls.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAPLGameControls.m; sourceTree = ""; }; 95 | 9C7D93A71BAC8D7E00DB9637 /* AAPLGameViewControllerPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AAPLGameViewControllerPrivate.h; sourceTree = ""; }; 96 | 9C8180B31BDA675800FE8C68 /* collect.scnp */ = {isa = PBXFileReference; lastKnownFileType = file.scp; path = collect.scnp; sourceTree = ""; }; 97 | 9C8180B41BDA675800FE8C68 /* confetti.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = confetti.png; sourceTree = ""; }; 98 | 9C8180B51BDA675800FE8C68 /* confetti.scnp */ = {isa = PBXFileReference; lastKnownFileType = file.scp; path = confetti.scnp; sourceTree = ""; }; 99 | 9C8180B61BDA675800FE8C68 /* glow01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = glow01.png; sourceTree = ""; }; 100 | 9CF835D61BA9BF6D004F41D1 /* Fox (Objective-C).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Fox (Objective-C).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 101 | 9CF835DB1BA9BF6D004F41D1 /* AAPLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AAPLAppDelegate.h; sourceTree = ""; }; 102 | 9CF835DC1BA9BF6D004F41D1 /* AAPLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AAPLAppDelegate.m; sourceTree = ""; }; 103 | 9CF835E41BA9BF6D004F41D1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 104 | 9CF835E61BA9BF6D004F41D1 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 105 | 9CF835E81BA9BF6D004F41D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 106 | 9CF835EE1BA9C041004F41D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 107 | 9CFCF1471B68E4CE00686987 /* game.scnassets */ = {isa = PBXFileReference; lastKnownFileType = wrapper.scnassets; path = game.scnassets; sourceTree = ""; }; 108 | 9CFCF14D1B68E4CE00686987 /* congratulations.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = congratulations.png; sourceTree = ""; }; 109 | 9CFCF14E1B68E4CE00686987 /* congratulations_pandaMax.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = congratulations_pandaMax.png; sourceTree = ""; }; 110 | 9CFCF14F1B68E4CE00686987 /* dpad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dpad.png; sourceTree = ""; }; 111 | 9CFCF1501B68E4CE00686987 /* FlowerEmpty.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FlowerEmpty.png; sourceTree = ""; }; 112 | 9CFCF1511B68E4CE00686987 /* FlowerFull.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FlowerFull.png; sourceTree = ""; }; 113 | 9CFCF1521B68E4CE00686987 /* ItemsPearl.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ItemsPearl.png; sourceTree = ""; }; 114 | 9CFCF1531B68E4CE00686987 /* MaxIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MaxIcon.png; sourceTree = ""; }; 115 | 9CFEBECF1B1F80F7002C687D /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 116 | E54966661AF778A6001ADED6 /* Fox (Objective-C).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Fox (Objective-C).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 117 | E54966691AF778A6001ADED6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 118 | E549666B1AF778A6001ADED6 /* AAPLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AAPLAppDelegate.h; sourceTree = ""; }; 119 | E549666C1AF778A6001ADED6 /* AAPLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AAPLAppDelegate.m; sourceTree = ""; }; 120 | E54966741AF778A6001ADED6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 121 | E54966761AF778A6001ADED6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 122 | E549667B1AF778A6001ADED6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 123 | /* End PBXFileReference section */ 124 | 125 | /* Begin PBXFrameworksBuildPhase section */ 126 | 9C0EADF81BA9D44F004F26CB /* Frameworks */ = { 127 | isa = PBXFrameworksBuildPhase; 128 | buildActionMask = 2147483647; 129 | files = ( 130 | ); 131 | runOnlyForDeploymentPostprocessing = 0; 132 | }; 133 | 9CF835D31BA9BF6D004F41D1 /* Frameworks */ = { 134 | isa = PBXFrameworksBuildPhase; 135 | buildActionMask = 2147483647; 136 | files = ( 137 | ); 138 | runOnlyForDeploymentPostprocessing = 0; 139 | }; 140 | E54966631AF778A6001ADED6 /* Frameworks */ = { 141 | isa = PBXFrameworksBuildPhase; 142 | buildActionMask = 2147483647; 143 | files = ( 144 | 83040D181CF7AA5900F24728 /* ReplayKit.framework in Frameworks */, 145 | ); 146 | runOnlyForDeploymentPostprocessing = 0; 147 | }; 148 | /* End PBXFrameworksBuildPhase section */ 149 | 150 | /* Begin PBXGroup section */ 151 | 83040D161CF7AA5800F24728 /* Frameworks */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 83040D171CF7AA5900F24728 /* ReplayKit.framework */, 155 | ); 156 | name = Frameworks; 157 | sourceTree = ""; 158 | }; 159 | 94CA651B1ADBF90F006293CF = { 160 | isa = PBXGroup; 161 | children = ( 162 | 9CFEBECF1B1F80F7002C687D /* README.md */, 163 | 9CFCF1461B68E4CE00686987 /* Game assets */, 164 | 9CFEBECE1B1F7D04002C687D /* Common */, 165 | E54966671AF778A6001ADED6 /* iOS */, 166 | 9CF835D71BA9BF6D004F41D1 /* tvOS */, 167 | 9C0EADFC1BA9D44F004F26CB /* OS X */, 168 | 94CA65251ADBF90F006293CF /* Products */, 169 | 83040D161CF7AA5800F24728 /* Frameworks */, 170 | ); 171 | sourceTree = ""; 172 | }; 173 | 94CA65251ADBF90F006293CF /* Products */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 9CF835D61BA9BF6D004F41D1 /* Fox (Objective-C).app */, 177 | E54966661AF778A6001ADED6 /* Fox (Objective-C).app */, 178 | 9C0EADFB1BA9D44F004F26CB /* Fox (Objective-C).app */, 179 | ); 180 | name = Products; 181 | sourceTree = ""; 182 | }; 183 | 9C0EADFC1BA9D44F004F26CB /* OS X */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | 9C0EAE0F1BA9D4AF004F26CB /* AAPLAppDelegate.h */, 187 | 9C0EAE101BA9D4AF004F26CB /* AAPLAppDelegate.m */, 188 | 9C0EAE121BA9D4C0004F26CB /* Images.xcassets */, 189 | 9C0EAE081BA9D44F004F26CB /* Main.storyboard */, 190 | 9C0EAE0B1BA9D44F004F26CB /* Info.plist */, 191 | 9C0EAE001BA9D44F004F26CB /* Supporting Files */, 192 | ); 193 | name = "OS X"; 194 | path = OSX; 195 | sourceTree = ""; 196 | }; 197 | 9C0EAE001BA9D44F004F26CB /* Supporting Files */ = { 198 | isa = PBXGroup; 199 | children = ( 200 | 9C0EAE011BA9D44F004F26CB /* main.m */, 201 | ); 202 | name = "Supporting Files"; 203 | sourceTree = ""; 204 | }; 205 | 9C8180B21BDA675800FE8C68 /* Particle systems */ = { 206 | isa = PBXGroup; 207 | children = ( 208 | 9C8180B31BDA675800FE8C68 /* collect.scnp */, 209 | 9C8180B41BDA675800FE8C68 /* confetti.png */, 210 | 9C8180B51BDA675800FE8C68 /* confetti.scnp */, 211 | 9C8180B61BDA675800FE8C68 /* glow01.png */, 212 | ); 213 | path = "Particle systems"; 214 | sourceTree = ""; 215 | }; 216 | 9CF835D71BA9BF6D004F41D1 /* tvOS */ = { 217 | isa = PBXGroup; 218 | children = ( 219 | 9CF835DB1BA9BF6D004F41D1 /* AAPLAppDelegate.h */, 220 | 9CF835DC1BA9BF6D004F41D1 /* AAPLAppDelegate.m */, 221 | 9CF835E31BA9BF6D004F41D1 /* Main.storyboard */, 222 | 9CF835E61BA9BF6D004F41D1 /* Images.xcassets */, 223 | 9CF835E81BA9BF6D004F41D1 /* Info.plist */, 224 | 9CF835F01BA9C04A004F41D1 /* Supporting Files */, 225 | ); 226 | path = tvOS; 227 | sourceTree = ""; 228 | }; 229 | 9CF835F01BA9C04A004F41D1 /* Supporting Files */ = { 230 | isa = PBXGroup; 231 | children = ( 232 | 9CF835EE1BA9C041004F41D1 /* main.m */, 233 | ); 234 | name = "Supporting Files"; 235 | sourceTree = ""; 236 | }; 237 | 9CFCF1461B68E4CE00686987 /* Game assets */ = { 238 | isa = PBXGroup; 239 | children = ( 240 | 9CFCF1471B68E4CE00686987 /* game.scnassets */, 241 | 9CFCF14C1B68E4CE00686987 /* Overlays */, 242 | 9C8180B21BDA675800FE8C68 /* Particle systems */, 243 | ); 244 | name = "Game assets"; 245 | path = "../Game assets"; 246 | sourceTree = ""; 247 | }; 248 | 9CFCF14C1B68E4CE00686987 /* Overlays */ = { 249 | isa = PBXGroup; 250 | children = ( 251 | 9CFCF14D1B68E4CE00686987 /* congratulations.png */, 252 | 9CFCF14E1B68E4CE00686987 /* congratulations_pandaMax.png */, 253 | 9CFCF14F1B68E4CE00686987 /* dpad.png */, 254 | 9CFCF1501B68E4CE00686987 /* FlowerEmpty.png */, 255 | 9CFCF1511B68E4CE00686987 /* FlowerFull.png */, 256 | 9CFCF1521B68E4CE00686987 /* ItemsPearl.png */, 257 | 9CFCF1531B68E4CE00686987 /* MaxIcon.png */, 258 | ); 259 | path = Overlays; 260 | sourceTree = ""; 261 | }; 262 | 9CFEBECE1B1F7D04002C687D /* Common */ = { 263 | isa = PBXGroup; 264 | children = ( 265 | 94CA65521ADC129A006293CF /* AAPLCharacter.h */, 266 | 94CA65501ADC127F006293CF /* AAPLCharacter.m */, 267 | 94CA652D1ADBF90F006293CF /* AAPLGameView.h */, 268 | 94CA652E1ADBF90F006293CF /* AAPLGameView.m */, 269 | 94CA65301ADBF90F006293CF /* AAPLGameViewController.h */, 270 | 9C7D93A71BAC8D7E00DB9637 /* AAPLGameViewControllerPrivate.h */, 271 | 94CA65311ADBF90F006293CF /* AAPLGameViewController.m */, 272 | 9C7D93A31BAC863900DB9637 /* AAPLGameControls.m */, 273 | ); 274 | path = Common; 275 | sourceTree = ""; 276 | }; 277 | E54966671AF778A6001ADED6 /* iOS */ = { 278 | isa = PBXGroup; 279 | children = ( 280 | E549666B1AF778A6001ADED6 /* AAPLAppDelegate.h */, 281 | E549666C1AF778A6001ADED6 /* AAPLAppDelegate.m */, 282 | E54966731AF778A6001ADED6 /* Main.storyboard */, 283 | 9C25F2B11BECE9F20018B67F /* Launch Screen.storyboard */, 284 | E54966761AF778A6001ADED6 /* Images.xcassets */, 285 | 8392792D1CF7B347000952E3 /* broadcast_button@2x.png */, 286 | 8392792F1CF7B451000952E3 /* broadcast_button_on@2x.png */, 287 | E549667B1AF778A6001ADED6 /* Info.plist */, 288 | E54966681AF778A6001ADED6 /* Supporting Files */, 289 | ); 290 | path = iOS; 291 | sourceTree = ""; 292 | }; 293 | E54966681AF778A6001ADED6 /* Supporting Files */ = { 294 | isa = PBXGroup; 295 | children = ( 296 | E54966691AF778A6001ADED6 /* main.m */, 297 | ); 298 | name = "Supporting Files"; 299 | sourceTree = ""; 300 | }; 301 | /* End PBXGroup section */ 302 | 303 | /* Begin PBXNativeTarget section */ 304 | 9C0EADFA1BA9D44F004F26CB /* Fox OS X (Objective-C) */ = { 305 | isa = PBXNativeTarget; 306 | buildConfigurationList = 9C0EAE0C1BA9D44F004F26CB /* Build configuration list for PBXNativeTarget "Fox OS X (Objective-C)" */; 307 | buildPhases = ( 308 | 9C0EADF71BA9D44F004F26CB /* Sources */, 309 | 9C0EADF81BA9D44F004F26CB /* Frameworks */, 310 | 9C0EADF91BA9D44F004F26CB /* Resources */, 311 | ); 312 | buildRules = ( 313 | ); 314 | dependencies = ( 315 | ); 316 | name = "Fox OS X (Objective-C)"; 317 | productName = "Fox OS X (Objective-C)"; 318 | productReference = 9C0EADFB1BA9D44F004F26CB /* Fox (Objective-C).app */; 319 | productType = "com.apple.product-type.application"; 320 | }; 321 | 9CF835D51BA9BF6D004F41D1 /* Fox tvOS (Objective-C) */ = { 322 | isa = PBXNativeTarget; 323 | buildConfigurationList = 9CF835EB1BA9BF6D004F41D1 /* Build configuration list for PBXNativeTarget "Fox tvOS (Objective-C)" */; 324 | buildPhases = ( 325 | 9CF835D21BA9BF6D004F41D1 /* Sources */, 326 | 9CF835D31BA9BF6D004F41D1 /* Frameworks */, 327 | 9CF835D41BA9BF6D004F41D1 /* Resources */, 328 | ); 329 | buildRules = ( 330 | ); 331 | dependencies = ( 332 | ); 333 | name = "Fox tvOS (Objective-C)"; 334 | productName = tvOS; 335 | productReference = 9CF835D61BA9BF6D004F41D1 /* Fox (Objective-C).app */; 336 | productType = "com.apple.product-type.application"; 337 | }; 338 | E54966651AF778A6001ADED6 /* Fox iOS (Objective-C) */ = { 339 | isa = PBXNativeTarget; 340 | buildConfigurationList = E549668B1AF778A6001ADED6 /* Build configuration list for PBXNativeTarget "Fox iOS (Objective-C)" */; 341 | buildPhases = ( 342 | E54966621AF778A6001ADED6 /* Sources */, 343 | E54966631AF778A6001ADED6 /* Frameworks */, 344 | E54966641AF778A6001ADED6 /* Resources */, 345 | ); 346 | buildRules = ( 347 | ); 348 | dependencies = ( 349 | ); 350 | name = "Fox iOS (Objective-C)"; 351 | productName = Fox_iOS; 352 | productReference = E54966661AF778A6001ADED6 /* Fox (Objective-C).app */; 353 | productType = "com.apple.product-type.application"; 354 | }; 355 | /* End PBXNativeTarget section */ 356 | 357 | /* Begin PBXProject section */ 358 | 94CA651C1ADBF90F006293CF /* Project object */ = { 359 | isa = PBXProject; 360 | attributes = { 361 | CLASSPREFIX = AAPL; 362 | LastUpgradeCheck = 0720; 363 | ORGANIZATIONNAME = "Apple Inc."; 364 | TargetAttributes = { 365 | 9C0EADFA1BA9D44F004F26CB = { 366 | CreatedOnToolsVersion = 7.1; 367 | }; 368 | 9CF835D51BA9BF6D004F41D1 = { 369 | CreatedOnToolsVersion = 7.1; 370 | }; 371 | E54966651AF778A6001ADED6 = { 372 | CreatedOnToolsVersion = 7.0; 373 | DevelopmentTeam = ZGYT5445XW; 374 | DevelopmentTeamName = "Mobcrush, Inc."; 375 | ProvisioningStyle = Automatic; 376 | }; 377 | }; 378 | }; 379 | buildConfigurationList = 94CA651F1ADBF90F006293CF /* Build configuration list for PBXProject "Fox" */; 380 | compatibilityVersion = "Xcode 6.3"; 381 | developmentRegion = English; 382 | hasScannedForEncodings = 0; 383 | knownRegions = ( 384 | en, 385 | Base, 386 | ); 387 | mainGroup = 94CA651B1ADBF90F006293CF; 388 | productRefGroup = 94CA65251ADBF90F006293CF /* Products */; 389 | projectDirPath = ""; 390 | projectRoot = ""; 391 | targets = ( 392 | E54966651AF778A6001ADED6 /* Fox iOS (Objective-C) */, 393 | 9CF835D51BA9BF6D004F41D1 /* Fox tvOS (Objective-C) */, 394 | 9C0EADFA1BA9D44F004F26CB /* Fox OS X (Objective-C) */, 395 | ); 396 | }; 397 | /* End PBXProject section */ 398 | 399 | /* Begin PBXResourcesBuildPhase section */ 400 | 9C0EADF91BA9D44F004F26CB /* Resources */ = { 401 | isa = PBXResourcesBuildPhase; 402 | buildActionMask = 2147483647; 403 | files = ( 404 | 9C0EAE271BA9D864004F26CB /* congratulations_pandaMax.png in Resources */, 405 | 9C8180BF1BDA675800FE8C68 /* confetti.scnp in Resources */, 406 | 9C0EAE131BA9D4C0004F26CB /* Images.xcassets in Resources */, 407 | 9C0EAE2B1BA9D864004F26CB /* ItemsPearl.png in Resources */, 408 | 9C0EAE281BA9D864004F26CB /* dpad.png in Resources */, 409 | 9C0EAE2A1BA9D864004F26CB /* FlowerFull.png in Resources */, 410 | 9C0EAE291BA9D864004F26CB /* FlowerEmpty.png in Resources */, 411 | 9C0EAE0A1BA9D44F004F26CB /* Main.storyboard in Resources */, 412 | 9C0EAE141BA9D4CA004F26CB /* game.scnassets in Resources */, 413 | 9C8180C21BDA675800FE8C68 /* glow01.png in Resources */, 414 | 9C8180B91BDA675800FE8C68 /* collect.scnp in Resources */, 415 | 9C0EAE261BA9D864004F26CB /* congratulations.png in Resources */, 416 | 9C0EAE2C1BA9D864004F26CB /* MaxIcon.png in Resources */, 417 | 9C8180BC1BDA675800FE8C68 /* confetti.png in Resources */, 418 | ); 419 | runOnlyForDeploymentPostprocessing = 0; 420 | }; 421 | 9CF835D41BA9BF6D004F41D1 /* Resources */ = { 422 | isa = PBXResourcesBuildPhase; 423 | buildActionMask = 2147483647; 424 | files = ( 425 | 9CF835F31BA9C33A004F41D1 /* congratulations_pandaMax.png in Resources */, 426 | 9C8180BE1BDA675800FE8C68 /* confetti.scnp in Resources */, 427 | 9CF835E71BA9BF6D004F41D1 /* Images.xcassets in Resources */, 428 | 9CF835F71BA9C33A004F41D1 /* ItemsPearl.png in Resources */, 429 | 9CF835F41BA9C33A004F41D1 /* dpad.png in Resources */, 430 | 9CF835F61BA9C33A004F41D1 /* FlowerFull.png in Resources */, 431 | 9CF835F51BA9C33A004F41D1 /* FlowerEmpty.png in Resources */, 432 | 9CF835E51BA9BF6D004F41D1 /* Main.storyboard in Resources */, 433 | 9CF835F11BA9C336004F41D1 /* game.scnassets in Resources */, 434 | 9C8180C11BDA675800FE8C68 /* glow01.png in Resources */, 435 | 9C8180B81BDA675800FE8C68 /* collect.scnp in Resources */, 436 | 9CF835F21BA9C33A004F41D1 /* congratulations.png in Resources */, 437 | 9CF835F81BA9C33A004F41D1 /* MaxIcon.png in Resources */, 438 | 9C8180BB1BDA675800FE8C68 /* confetti.png in Resources */, 439 | ); 440 | runOnlyForDeploymentPostprocessing = 0; 441 | }; 442 | E54966641AF778A6001ADED6 /* Resources */ = { 443 | isa = PBXResourcesBuildPhase; 444 | buildActionMask = 2147483647; 445 | files = ( 446 | 9CFCF1601B68E4CE00686987 /* congratulations_pandaMax.png in Resources */, 447 | 9C8180BD1BDA675800FE8C68 /* confetti.scnp in Resources */, 448 | E54966771AF778A6001ADED6 /* Images.xcassets in Resources */, 449 | 9C25F2B21BECE9F20018B67F /* Launch Screen.storyboard in Resources */, 450 | 839279301CF7B451000952E3 /* broadcast_button_on@2x.png in Resources */, 451 | 9CFCF15E1B68E4CE00686987 /* congratulations.png in Resources */, 452 | 8392792E1CF7B347000952E3 /* broadcast_button@2x.png in Resources */, 453 | 9CFCF1681B68E4CE00686987 /* ItemsPearl.png in Resources */, 454 | 9CFCF16A1B68E4CE00686987 /* MaxIcon.png in Resources */, 455 | 9CFCF1621B68E4CE00686987 /* dpad.png in Resources */, 456 | 9CFCF1661B68E4CE00686987 /* FlowerFull.png in Resources */, 457 | E54966751AF778A6001ADED6 /* Main.storyboard in Resources */, 458 | 9C8180C01BDA675800FE8C68 /* glow01.png in Resources */, 459 | 9C8180B71BDA675800FE8C68 /* collect.scnp in Resources */, 460 | 9CFCF1641B68E4CE00686987 /* FlowerEmpty.png in Resources */, 461 | 9CFCF1541B68E4CE00686987 /* game.scnassets in Resources */, 462 | 9C8180BA1BDA675800FE8C68 /* confetti.png in Resources */, 463 | ); 464 | runOnlyForDeploymentPostprocessing = 0; 465 | }; 466 | /* End PBXResourcesBuildPhase section */ 467 | 468 | /* Begin PBXSourcesBuildPhase section */ 469 | 9C0EADF71BA9D44F004F26CB /* Sources */ = { 470 | isa = PBXSourcesBuildPhase; 471 | buildActionMask = 2147483647; 472 | files = ( 473 | 9C0EAE021BA9D44F004F26CB /* main.m in Sources */, 474 | 9C0EAE111BA9D4AF004F26CB /* AAPLAppDelegate.m in Sources */, 475 | 9C0EAE1D1BA9D4DA004F26CB /* AAPLGameViewController.m in Sources */, 476 | 9C0EAE1C1BA9D4DA004F26CB /* AAPLGameView.m in Sources */, 477 | 9C0EAE1E1BA9D4DA004F26CB /* AAPLCharacter.m in Sources */, 478 | 9C7D93A61BAC863900DB9637 /* AAPLGameControls.m in Sources */, 479 | ); 480 | runOnlyForDeploymentPostprocessing = 0; 481 | }; 482 | 9CF835D21BA9BF6D004F41D1 /* Sources */ = { 483 | isa = PBXSourcesBuildPhase; 484 | buildActionMask = 2147483647; 485 | files = ( 486 | 9CF835EF1BA9C041004F41D1 /* main.m in Sources */, 487 | 9CF835DD1BA9BF6D004F41D1 /* AAPLAppDelegate.m in Sources */, 488 | 9CF835FA1BA9C340004F41D1 /* AAPLGameViewController.m in Sources */, 489 | 9CF835F91BA9C340004F41D1 /* AAPLGameView.m in Sources */, 490 | 9CF835FB1BA9C340004F41D1 /* AAPLCharacter.m in Sources */, 491 | 9C7D93A51BAC863900DB9637 /* AAPLGameControls.m in Sources */, 492 | ); 493 | runOnlyForDeploymentPostprocessing = 0; 494 | }; 495 | E54966621AF778A6001ADED6 /* Sources */ = { 496 | isa = PBXSourcesBuildPhase; 497 | buildActionMask = 2147483647; 498 | files = ( 499 | E565868C1AF779B100A24465 /* AAPLGameViewController.m in Sources */, 500 | 9C7D93A41BAC863900DB9637 /* AAPLGameControls.m in Sources */, 501 | E565868D1AF77A8200A24465 /* AAPLCharacter.m in Sources */, 502 | E565868B1AF779A600A24465 /* AAPLGameView.m in Sources */, 503 | E549666D1AF778A6001ADED6 /* AAPLAppDelegate.m in Sources */, 504 | E549666A1AF778A6001ADED6 /* main.m in Sources */, 505 | ); 506 | runOnlyForDeploymentPostprocessing = 0; 507 | }; 508 | /* End PBXSourcesBuildPhase section */ 509 | 510 | /* Begin PBXVariantGroup section */ 511 | 9C0EAE081BA9D44F004F26CB /* Main.storyboard */ = { 512 | isa = PBXVariantGroup; 513 | children = ( 514 | 9C0EAE091BA9D44F004F26CB /* Base */, 515 | ); 516 | name = Main.storyboard; 517 | sourceTree = ""; 518 | }; 519 | 9CF835E31BA9BF6D004F41D1 /* Main.storyboard */ = { 520 | isa = PBXVariantGroup; 521 | children = ( 522 | 9CF835E41BA9BF6D004F41D1 /* Base */, 523 | ); 524 | name = Main.storyboard; 525 | sourceTree = ""; 526 | }; 527 | E54966731AF778A6001ADED6 /* Main.storyboard */ = { 528 | isa = PBXVariantGroup; 529 | children = ( 530 | E54966741AF778A6001ADED6 /* Base */, 531 | ); 532 | name = Main.storyboard; 533 | sourceTree = ""; 534 | }; 535 | /* End PBXVariantGroup section */ 536 | 537 | /* Begin XCBuildConfiguration section */ 538 | 94CA65461ADBF90F006293CF /* Debug */ = { 539 | isa = XCBuildConfiguration; 540 | buildSettings = { 541 | ALWAYS_SEARCH_USER_PATHS = NO; 542 | CLANG_ENABLE_MODULES = YES; 543 | CLANG_ENABLE_OBJC_ARC = YES; 544 | CLANG_WARN_BOOL_CONVERSION = YES; 545 | CLANG_WARN_CONSTANT_CONVERSION = YES; 546 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 547 | CLANG_WARN_EMPTY_BODY = YES; 548 | CLANG_WARN_ENUM_CONVERSION = YES; 549 | CLANG_WARN_INT_CONVERSION = YES; 550 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 551 | CLANG_WARN_UNREACHABLE_CODE = YES; 552 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 553 | CODE_SIGN_IDENTITY = ""; 554 | COPY_PHASE_STRIP = NO; 555 | DEBUG_INFORMATION_FORMAT = dwarf; 556 | DEFINES_MODULE = YES; 557 | ENABLE_STRICT_OBJC_MSGSEND = YES; 558 | ENABLE_TESTABILITY = YES; 559 | GCC_DYNAMIC_NO_PIC = NO; 560 | GCC_NO_COMMON_BLOCKS = YES; 561 | GCC_OPTIMIZATION_LEVEL = 0; 562 | GCC_PREPROCESSOR_DEFINITIONS = ( 563 | "DEBUG=1", 564 | "$(inherited)", 565 | ); 566 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 567 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 568 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 569 | GCC_WARN_UNDECLARED_SELECTOR = YES; 570 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 571 | GCC_WARN_UNUSED_FUNCTION = YES; 572 | GCC_WARN_UNUSED_VARIABLE = YES; 573 | MACOSX_DEPLOYMENT_TARGET = 10.11; 574 | MTL_ENABLE_DEBUG_INFO = YES; 575 | ONLY_ACTIVE_ARCH = YES; 576 | }; 577 | name = Debug; 578 | }; 579 | 94CA65471ADBF90F006293CF /* Release */ = { 580 | isa = XCBuildConfiguration; 581 | buildSettings = { 582 | ALWAYS_SEARCH_USER_PATHS = NO; 583 | CLANG_ENABLE_MODULES = YES; 584 | CLANG_ENABLE_OBJC_ARC = YES; 585 | CLANG_WARN_BOOL_CONVERSION = YES; 586 | CLANG_WARN_CONSTANT_CONVERSION = YES; 587 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 588 | CLANG_WARN_EMPTY_BODY = YES; 589 | CLANG_WARN_ENUM_CONVERSION = YES; 590 | CLANG_WARN_INT_CONVERSION = YES; 591 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 592 | CLANG_WARN_UNREACHABLE_CODE = YES; 593 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 594 | CODE_SIGN_IDENTITY = ""; 595 | COPY_PHASE_STRIP = NO; 596 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 597 | DEFINES_MODULE = YES; 598 | ENABLE_NS_ASSERTIONS = NO; 599 | ENABLE_STRICT_OBJC_MSGSEND = YES; 600 | GCC_NO_COMMON_BLOCKS = YES; 601 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 602 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 603 | GCC_WARN_UNDECLARED_SELECTOR = YES; 604 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 605 | GCC_WARN_UNUSED_FUNCTION = YES; 606 | GCC_WARN_UNUSED_VARIABLE = YES; 607 | MACOSX_DEPLOYMENT_TARGET = 10.11; 608 | MTL_ENABLE_DEBUG_INFO = NO; 609 | }; 610 | name = Release; 611 | }; 612 | 9C0EAE0D1BA9D44F004F26CB /* Debug */ = { 613 | isa = XCBuildConfiguration; 614 | buildSettings = { 615 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 616 | COMBINE_HIDPI_IMAGES = YES; 617 | INFOPLIST_FILE = OSX/Info.plist; 618 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 619 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.fox.objc"; 620 | PRODUCT_MODULE_NAME = AAPLFoxObjC; 621 | PRODUCT_NAME = "Fox (Objective-C)"; 622 | SDKROOT = macosx; 623 | }; 624 | name = Debug; 625 | }; 626 | 9C0EAE0E1BA9D44F004F26CB /* Release */ = { 627 | isa = XCBuildConfiguration; 628 | buildSettings = { 629 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 630 | COMBINE_HIDPI_IMAGES = YES; 631 | INFOPLIST_FILE = OSX/Info.plist; 632 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 633 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.fox.objc"; 634 | PRODUCT_MODULE_NAME = AAPLFoxObjC; 635 | PRODUCT_NAME = "Fox (Objective-C)"; 636 | SDKROOT = macosx; 637 | }; 638 | name = Release; 639 | }; 640 | 9CF835E91BA9BF6D004F41D1 /* Debug */ = { 641 | isa = XCBuildConfiguration; 642 | buildSettings = { 643 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 644 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 645 | CODE_SIGN_IDENTITY = "iPhone Developer"; 646 | INFOPLIST_FILE = tvOS/Info.plist; 647 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 648 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.fox.objc"; 649 | PRODUCT_MODULE_NAME = AAPLFoxObjC; 650 | PRODUCT_NAME = "Fox (Objective-C)"; 651 | SDKROOT = appletvos; 652 | TARGETED_DEVICE_FAMILY = 3; 653 | TVOS_DEPLOYMENT_TARGET = 9.0; 654 | }; 655 | name = Debug; 656 | }; 657 | 9CF835EA1BA9BF6D004F41D1 /* Release */ = { 658 | isa = XCBuildConfiguration; 659 | buildSettings = { 660 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 661 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 662 | CODE_SIGN_IDENTITY = "iPhone Developer"; 663 | INFOPLIST_FILE = tvOS/Info.plist; 664 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 665 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.fox.objc"; 666 | PRODUCT_MODULE_NAME = AAPLFoxObjC; 667 | PRODUCT_NAME = "Fox (Objective-C)"; 668 | SDKROOT = appletvos; 669 | TARGETED_DEVICE_FAMILY = 3; 670 | TVOS_DEPLOYMENT_TARGET = 9.0; 671 | }; 672 | name = Release; 673 | }; 674 | E54966871AF778A6001ADED6 /* Debug */ = { 675 | isa = XCBuildConfiguration; 676 | buildSettings = { 677 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 678 | CODE_SIGN_IDENTITY = "iPhone Developer"; 679 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 680 | INFOPLIST_FILE = iOS/Info.plist; 681 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 682 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 683 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.fox.objc.1"; 684 | PRODUCT_MODULE_NAME = AAPLFoxObjC; 685 | PRODUCT_NAME = "Fox (Objective-C)"; 686 | SDKROOT = iphoneos; 687 | TARGETED_DEVICE_FAMILY = "1,2"; 688 | }; 689 | name = Debug; 690 | }; 691 | E54966881AF778A6001ADED6 /* Release */ = { 692 | isa = XCBuildConfiguration; 693 | buildSettings = { 694 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 695 | CODE_SIGN_IDENTITY = "iPhone Developer"; 696 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 697 | INFOPLIST_FILE = iOS/Info.plist; 698 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 699 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 700 | PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.fox.objc.1"; 701 | PRODUCT_MODULE_NAME = AAPLFoxObjC; 702 | PRODUCT_NAME = "Fox (Objective-C)"; 703 | SDKROOT = iphoneos; 704 | TARGETED_DEVICE_FAMILY = "1,2"; 705 | }; 706 | name = Release; 707 | }; 708 | /* End XCBuildConfiguration section */ 709 | 710 | /* Begin XCConfigurationList section */ 711 | 94CA651F1ADBF90F006293CF /* Build configuration list for PBXProject "Fox" */ = { 712 | isa = XCConfigurationList; 713 | buildConfigurations = ( 714 | 94CA65461ADBF90F006293CF /* Debug */, 715 | 94CA65471ADBF90F006293CF /* Release */, 716 | ); 717 | defaultConfigurationIsVisible = 0; 718 | defaultConfigurationName = Release; 719 | }; 720 | 9C0EAE0C1BA9D44F004F26CB /* Build configuration list for PBXNativeTarget "Fox OS X (Objective-C)" */ = { 721 | isa = XCConfigurationList; 722 | buildConfigurations = ( 723 | 9C0EAE0D1BA9D44F004F26CB /* Debug */, 724 | 9C0EAE0E1BA9D44F004F26CB /* Release */, 725 | ); 726 | defaultConfigurationIsVisible = 0; 727 | defaultConfigurationName = Release; 728 | }; 729 | 9CF835EB1BA9BF6D004F41D1 /* Build configuration list for PBXNativeTarget "Fox tvOS (Objective-C)" */ = { 730 | isa = XCConfigurationList; 731 | buildConfigurations = ( 732 | 9CF835E91BA9BF6D004F41D1 /* Debug */, 733 | 9CF835EA1BA9BF6D004F41D1 /* Release */, 734 | ); 735 | defaultConfigurationIsVisible = 0; 736 | defaultConfigurationName = Release; 737 | }; 738 | E549668B1AF778A6001ADED6 /* Build configuration list for PBXNativeTarget "Fox iOS (Objective-C)" */ = { 739 | isa = XCConfigurationList; 740 | buildConfigurations = ( 741 | E54966871AF778A6001ADED6 /* Debug */, 742 | E54966881AF778A6001ADED6 /* Release */, 743 | ); 744 | defaultConfigurationIsVisible = 0; 745 | defaultConfigurationName = Release; 746 | }; 747 | /* End XCConfigurationList section */ 748 | }; 749 | rootObject = 94CA651C1ADBF90F006293CF /* Project object */; 750 | } 751 | --------------------------------------------------------------------------------