Converted get/set methods pairs to computed properties throughout the Playdate bindings target.
This commit is contained in:
@@ -32,7 +32,7 @@ final class Game {
|
|||||||
private let boxSize = 24
|
private let boxSize = 24
|
||||||
|
|
||||||
func start() {
|
func start() {
|
||||||
Display.setRefreshRate(50)
|
Display.refreshRate = 50
|
||||||
|
|
||||||
System.addMenuItem(title: "reset") { _ in
|
System.addMenuItem(title: "reset") { _ in
|
||||||
Game.shared.reset()
|
Game.shared.reset()
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ final class Game {
|
|||||||
var player = Sprite()
|
var player = Sprite()
|
||||||
|
|
||||||
func start() {
|
func start() {
|
||||||
Display.setRefreshRate(50)
|
Display.refreshRate = 50
|
||||||
|
|
||||||
System.setUpdateCallback {
|
System.setUpdateCallback {
|
||||||
self.update()
|
self.update()
|
||||||
@@ -300,6 +300,7 @@ try Lua.addFunction(double, name: "mylib.double")
|
|||||||
## Conventions
|
## Conventions
|
||||||
|
|
||||||
- **Namespaces.** The subsystem namespaces (`System`, `Graphics`, `Sound`, …) live at the top level of the module; only the raw C API bootstrap stays under `Playdate` (`Playdate.initialize(with:)`, `Playdate.api`). On a name collision with another module, qualify with the module name: `PlaydateKit.System`.
|
- **Namespaces.** The subsystem namespaces (`System`, `Graphics`, `Sound`, …) live at the top level of the module; only the raw C API bootstrap stays under `Playdate` (`Playdate.initialize(with:)`, `Playdate.api`). On a name collision with another module, qualify with the module name: `PlaydateKit.System`.
|
||||||
|
- **Properties vs. methods.** State the OS can report back is a property: read-write where the C API has a get/set pair (`Display.refreshRate`, `Source.volume`), get-only where it only has a getter (`Display.fps`). A `set…` method means the C API is write-only there (`Display.setScale`, `Synth.setAttackTime`) or setting takes extra arguments — a property getter never invents a value the OS can't return. Callbacks are installed with `set…Callback`/`set…Function` methods.
|
||||||
- **Errors.** Fallible operations use typed throws — `throws(PlaydateError)` generally, `throws(Network.NetError)` for network I/O — so `catch` gives you a concrete type, and no `any Error` existentials are needed.
|
- **Errors.** Fallible operations use typed throws — `throws(PlaydateError)` generally, `throws(Network.NetError)` for network I/O — so `catch` gives you a concrete type, and no `any Error` existentials are needed.
|
||||||
- **Ownership.** A wrapper that *creates* a C object frees it on `deinit`; keep the wrapper referenced for as long as you use it. Wrappers vending OS-owned objects (a `Bitmap` from a `BitmapTable`, a track from a `Sequence`, …) don't free them — keep the owner alive instead, as documented on each API. Resources a C object keeps referencing (a sprite's image, a synth's sample, modulators, menu-item option titles) are retained by the wrapper automatically.
|
- **Ownership.** A wrapper that *creates* a C object frees it on `deinit`; keep the wrapper referenced for as long as you use it. Wrappers vending OS-owned objects (a `Bitmap` from a `BitmapTable`, a track from a `Sequence`, …) don't free them — keep the owner alive instead, as documented on each API. Resources a C object keeps referencing (a sprite's image, a synth's sample, modulators, menu-item option titles) are retained by the wrapper automatically.
|
||||||
- **Callbacks.** Where the C API provides a userdata slot, closures are supported everywhere and delivered back with the right wrapper. A few C callbacks have no userdata (serial messages, headphone changes, scoreboard
|
- **Callbacks.** Where the C API provides a userdata slot, closures are supported everywhere and delivered back with the right wrapper. A few C callbacks have no userdata (serial messages, headphone changes, scoreboard
|
||||||
|
|||||||
@@ -13,15 +13,13 @@ extension Display {
|
|||||||
/// The display height in pixels, taking the current scale into account.
|
/// The display height in pixels, taking the current scale into account.
|
||||||
public static var height: Int { Int(api.pointee.getHeight.unsafelyUnwrapped()) }
|
public static var height: Int { Int(api.pointee.getHeight.unsafelyUnwrapped()) }
|
||||||
|
|
||||||
/// Sets the nominal refresh rate in frames per second. Pass 0 to update
|
/// The nominal refresh rate in frames per second. Set to 0 to update
|
||||||
/// as fast as possible (the update callback drives the pace).
|
/// as fast as possible (the update callback drives the pace).
|
||||||
public static func setRefreshRate(_ rate: Float) {
|
public static var refreshRate: Float {
|
||||||
api.pointee.setRefreshRate.unsafelyUnwrapped(rate)
|
get { api.pointee.getRefreshRate.unsafelyUnwrapped() }
|
||||||
|
set { api.pointee.setRefreshRate.unsafelyUnwrapped(newValue) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The current nominal refresh rate.
|
|
||||||
public static var refreshRate: Float { api.pointee.getRefreshRate.unsafelyUnwrapped() }
|
|
||||||
|
|
||||||
/// The measured average frames per second.
|
/// The measured average frames per second.
|
||||||
public static var fps: Float { api.pointee.getFPS.unsafelyUnwrapped() }
|
public static var fps: Float { api.pointee.getFPS.unsafelyUnwrapped() }
|
||||||
|
|
||||||
|
|||||||
@@ -211,13 +211,9 @@ extension Graphics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Extra space added between letters, in pixels.
|
/// Extra space added between letters, in pixels.
|
||||||
public static func setTextTracking(_ tracking: Int) {
|
|
||||||
gfx.pointee.setTextTracking.unsafelyUnwrapped(Int32(tracking))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The extra space currently added between letters, in pixels.
|
|
||||||
public static var textTracking: Int {
|
public static var textTracking: Int {
|
||||||
Int(gfx.pointee.getTextTracking.unsafelyUnwrapped())
|
get { Int(gfx.pointee.getTextTracking.unsafelyUnwrapped()) }
|
||||||
|
set { gfx.pointee.setTextTracking.unsafelyUnwrapped(Int32(newValue)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adjusts the line height used when drawing multi-line text.
|
/// Adjusts the line height used when drawing multi-line text.
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ final class Game {
|
|||||||
nonisolated(unsafe) static let shared = Game()
|
nonisolated(unsafe) static let shared = Game()
|
||||||
|
|
||||||
func start() {
|
func start() {
|
||||||
Display.setRefreshRate(50)
|
Display.refreshRate = 50
|
||||||
|
|
||||||
System.setUpdateCallback {
|
System.setUpdateCallback {
|
||||||
self.update()
|
self.update()
|
||||||
|
|||||||
@@ -119,13 +119,12 @@ extension Sound {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Modulates the channel's volume.
|
/// Modulates the channel's volume.
|
||||||
public func setVolumeModulator(_ modulator: SignalValue?) {
|
|
||||||
retain(modulator)
|
|
||||||
Channel.api.pointee.setVolumeModulator.unsafelyUnwrapped(pointer, modulator?.pointer)
|
|
||||||
}
|
|
||||||
|
|
||||||
public var volumeModulator: SignalValue? {
|
public var volumeModulator: SignalValue? {
|
||||||
SignalValue.wrap(Channel.api.pointee.getVolumeModulator.unsafelyUnwrapped(pointer))
|
get { SignalValue.wrap(Channel.api.pointee.getVolumeModulator.unsafelyUnwrapped(pointer)) }
|
||||||
|
set {
|
||||||
|
retain(newValue)
|
||||||
|
Channel.api.pointee.setVolumeModulator.unsafelyUnwrapped(pointer, newValue?.pointer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The channel's stereo pan: -1 (left) to 1 (right).
|
/// The channel's stereo pan: -1 (left) to 1 (right).
|
||||||
@@ -135,13 +134,12 @@ extension Sound {
|
|||||||
|
|
||||||
/// Modulates the channel's pan. The signal's range 0...1 maps to
|
/// Modulates the channel's pan. The signal's range 0...1 maps to
|
||||||
/// left...right.
|
/// left...right.
|
||||||
public func setPanModulator(_ modulator: SignalValue?) {
|
|
||||||
retain(modulator)
|
|
||||||
Channel.api.pointee.setPanModulator.unsafelyUnwrapped(pointer, modulator?.pointer)
|
|
||||||
}
|
|
||||||
|
|
||||||
public var panModulator: SignalValue? {
|
public var panModulator: SignalValue? {
|
||||||
SignalValue.wrap(Channel.api.pointee.getPanModulator.unsafelyUnwrapped(pointer))
|
get { SignalValue.wrap(Channel.api.pointee.getPanModulator.unsafelyUnwrapped(pointer)) }
|
||||||
|
set {
|
||||||
|
retain(newValue)
|
||||||
|
Channel.api.pointee.setPanModulator.unsafelyUnwrapped(pointer, newValue?.pointer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A signal following the channel's dry (unprocessed) level.
|
/// A signal following the channel's dry (unprocessed) level.
|
||||||
|
|||||||
@@ -16,21 +16,19 @@ extension Sound {
|
|||||||
self.isOwned = isOwned
|
self.isOwned = isOwned
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the playback volume for the left and right channels, 0...1.
|
/// The playback volume of the left and right channels, 0...1.
|
||||||
public func setVolume(left: Float, right: Float) {
|
public var volume: (left: Float, right: Float) {
|
||||||
Source.api.pointee.setVolume.unsafelyUnwrapped(pointer, left, right)
|
get {
|
||||||
|
var left: Float = 0, right: Float = 0
|
||||||
|
Source.api.pointee.getVolume.unsafelyUnwrapped(pointer, &left, &right)
|
||||||
|
return (left, right)
|
||||||
|
}
|
||||||
|
set { Source.api.pointee.setVolume.unsafelyUnwrapped(pointer, newValue.left, newValue.right) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the playback volume of both channels.
|
/// Sets the playback volume of both channels.
|
||||||
public func setVolume(_ volume: Float) {
|
public func setVolume(_ volume: Float) {
|
||||||
setVolume(left: volume, right: volume)
|
self.volume = (volume, volume)
|
||||||
}
|
|
||||||
|
|
||||||
/// The playback volume of the left and right channels.
|
|
||||||
public var volume: (left: Float, right: Float) {
|
|
||||||
var left: Float = 0, right: Float = 0
|
|
||||||
Source.api.pointee.getVolume.unsafelyUnwrapped(pointer, &left, &right)
|
|
||||||
return (left, right)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public var isPlaying: Bool {
|
public var isPlaying: Bool {
|
||||||
|
|||||||
@@ -93,16 +93,14 @@ extension Sound {
|
|||||||
Instrument.api.pointee.allNotesOff.unsafelyUnwrapped(pointer, when)
|
Instrument.api.pointee.allNotesOff.unsafelyUnwrapped(pointer, when)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the volume of the left and right channels, 0...1.
|
/// The volume of the left and right channels, 0...1.
|
||||||
public func setVolume(left: Float, right: Float) {
|
|
||||||
Instrument.api.pointee.setVolume.unsafelyUnwrapped(pointer, left, right)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The volume of the left and right channels.
|
|
||||||
public var volume: (left: Float, right: Float) {
|
public var volume: (left: Float, right: Float) {
|
||||||
var left: Float = 0, right: Float = 0
|
get {
|
||||||
Instrument.api.pointee.getVolume.unsafelyUnwrapped(pointer, &left, &right)
|
var left: Float = 0, right: Float = 0
|
||||||
return (left, right)
|
Instrument.api.pointee.getVolume.unsafelyUnwrapped(pointer, &left, &right)
|
||||||
|
return (left, right)
|
||||||
|
}
|
||||||
|
set { Instrument.api.pointee.setVolume.unsafelyUnwrapped(pointer, newValue.left, newValue.right) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The number of voices currently playing.
|
/// The number of voices currently playing.
|
||||||
|
|||||||
Reference in New Issue
Block a user