Slide 1

Slide 1 text

@giginet

Slide 2

Slide 2 text

&⌚

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

FCEUX(C++)

Slide 9

Slide 9 text

try! Objective-C

Slide 10

Slide 10 text

Metal OpenGL ES RENDERING

Slide 11

Slide 11 text

var texture: SKTexture { guard let videoBuffer: UnsafeRawPointer = emulatorCore.videoBuffer() else { fatalError() } let data = Data(bytes: videoBuffer, count: Int(bufferCount)) let size = CGSize(width: 256, height: 240) return SKTexture(data: data, size: size, flipped: true) }

Slide 12

Slide 12 text

import AVFoundation // let destinationBuffer: AVAudioPCMBuffer! // Get source buffer let sourceBuffer = UnsafeBufferPointer(start: head.assumingMemoryBound(to: Int16.self), count: bufferLength) // Copy samples to AVAudioPCMBuffer for channel in 0..(start: destinationBuffer.floatChannelData?.pointee, count: bufferLength) for frame in 0..

Slide 13

Slide 13 text

â–¸CoreMotion â–¸WKGestureRecognizer â–¸Tap â–¸LongPress â–¸Swipe â–¸Pan â–¸WKCrownDelegate, WKCrownSequencer INPUTS

Slide 14

Slide 14 text

Touch Down Touch Up WKTapGestureRecognizer

Slide 15

Slide 15 text

// super rapidly long press(1 frame) longPressGestureRecognizer.minimumPressDuration = 1.0 / 60.0 WKLongPressGestureRecognizer

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

public enum Button: UInt32 { case a = 1 case b = 2 case select = 4 case start = 8 case up = 16 case down = 32 case left = 64 case right = 128 } if sender.state == .began { controllerState |= button.rawValue } else if sender.state == .ended { controllerState &= ~button.rawValue }

Slide 18

Slide 18 text

https://github.com/giginet/NESEmulator-watchOS

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Have a nice Pokémon GO Life!

Slide 21

Slide 21 text

No content