Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add additional macros #129

Merged
merged 5 commits into from Sep 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 6 additions & 1 deletion Package.swift
Expand Up @@ -92,7 +92,12 @@ let package = Package(
["-Xlinker", "-undefined",
"-Xlinker", "dynamic_lookup"])]),
// Idea: -mark_dead_strippable_dylib

.testTarget(name: "SwiftGodotMacroTests",
dependencies: [
"SwiftGodotMacroLibrary",
.product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax")
])

// Test suite for SwiftGodot
// .testTarget(
// name: "SwiftGodotTests",
Expand Down
Expand Up @@ -7,11 +7,12 @@

import Foundation
import SwiftGodot
import SwiftGodotMacros

@Godot
class MainLevel: Node2D {
var player: PlayerController?
var spawnpoint: Node2D?
var teleportArea: Area2D?
@SceneTree(path: "CharacterBody2D") var player: PlayerController?
@SceneTree(path: "Spawnpoint") var spawnpoint: Node2D?
@SceneTree(path: "Telepoint") var teleportArea: Area2D?

}
Expand Up @@ -7,17 +7,19 @@

import Foundation
import SwiftGodot
import SwiftGodotMacros

@Godot
class MainLevel: Node2D {
var player: PlayerController?
var spawnpoint: Node2D?
var teleportArea: Area2D?
@SceneTree(path: "CharacterBody2D") var player: PlayerController?
@SceneTree(path: "Spawnpoint") var spawnpoint: Node2D?
@SceneTree(path: "Telepoint") var teleportArea: Area2D?

override func _ready() {
self.player = getNodeOrNull(path: "CharacterBody2D") as? PlayerController
self.teleportArea = getNodeOrNull(path: "Telepoint") as? Area2D
self.spawnpoint = getNodeOrNull(path: "Spawnpoint") as? Node2D
super._ready()
private func teleportPlayerToTop() {
guard let player, let spawnpoint else {
GD.pushWarning("Player or spawnpoint is missing.")
return
}

}
}
Expand Up @@ -7,25 +7,20 @@

import Foundation
import SwiftGodot
import SwiftGodotMacros

@Godot
class MainLevel: Node2D {
var player: PlayerController?
var spawnpoint: Node2D?
var teleportArea: Area2D?

override func _ready() {
self.player = getNodeOrNull(path: "CharacterBody2D") as? PlayerController
self.teleportArea = getNodeOrNull(path: "Telepoint") as? Area2D
self.spawnpoint = getNodeOrNull(path: "Spawnpoint") as? Node2D
super._ready()
}
@SceneTree(path: "CharacterBody2D") var player: PlayerController?
@SceneTree(path: "Spawnpoint") var spawnpoint: Node2D?
@SceneTree(path: "Telepoint") var teleportArea: Area2D?

private func teleportPlayerToTop() {
guard let player, let spawnpoint else {
GD.pushWarning("Player or spawnpoint is missing.")
return
}


player.position = Vector2(x: player.position.x, y: spawnpoint.position.y)
}
}
Expand Up @@ -7,17 +7,21 @@

import Foundation
import SwiftGodot
import SwiftGodotMacros

@Godot
class MainLevel: Node2D {
var player: PlayerController?
var spawnpoint: Node2D?
var teleportArea: Area2D?
@SceneTree(path: "CharacterBody2D") var player: PlayerController?
@SceneTree(path: "Spawnpoint") var spawnpoint: Node2D?
@SceneTree(path: "Telepoint") var teleportArea: Area2D?

override func _ready() {
self.player = getNodeOrNull(path: "CharacterBody2D") as? PlayerController
self.teleportArea = getNodeOrNull(path: "Telepoint") as? Area2D
self.spawnpoint = getNodeOrNull(path: "Spawnpoint") as? Node2D
teleportArea?.bodyEntered.connect { [self] enteredBody in
if enteredBody.isClass("\(PlayerController.self)") {
teleportPlayerToTop()
}
}

super._ready()
}

Expand Down

This file was deleted.

Expand Up @@ -7,3 +7,4 @@

import Foundation
import SwiftGodot
import SwiftGodotMacros
Expand Up @@ -2,22 +2,8 @@
// https://docs.swift.org/swift-book

import SwiftGodot
import SwiftGodotMacros

func setupExtension(at level: GDExtension.InitializationLevel) {
if level == .scene {
register(type: PlayerController.self)
register(type: MainLevel.self)
}
}
let allNodes: [Wrapped.Type] = [PlayerController.self, MainLevel.self]

@_cdecl("swift_entry_point")
public func swift_entry_point(interfacePtr: OpaquePointer?,
libraryPtr: OpaquePointer?,
extensionPtr: OpaquePointer?) -> UInt8 {
guard let interfacePtr, let libraryPtr, let extensionPtr else {
print("Not all pointers are available.")
return 0
}
initializeSwiftModule(interfacePtr, libraryPtr, extensionPtr, initHook: setupExtension, deInitHook: { _ in })
return 1
}
#initSwiftExtension(cdecl: "swift_entry_point", types: allNodes)
Expand Up @@ -2,15 +2,6 @@
// https://docs.swift.org/swift-book

import SwiftGodot
import SwiftGodotMacros

@_cdecl("swift_entry_point")
public func swift_entry_point(interfacePtr: OpaquePointer?,
libraryPtr: OpaquePointer?,
extensionPtr: OpaquePointer?) -> UInt8 {
guard let interfacePtr, let libraryPtr, let extensionPtr else {
print("Not all pointers are available.")
return 0
}
initializeSwiftModule(interfacePtr, libraryPtr, extensionPtr, initHook: { _ in }, deInitHook: { _ in })
return 1
}
#initSwiftExtension(cdecl: "swift_entry_point", types: [])
Expand Up @@ -2,21 +2,6 @@
// https://docs.swift.org/swift-book

import SwiftGodot
import SwiftGodotMacros

func setupExtension(at level: GDExtension.InitializationLevel) {
if level == .scene {

}
}

@_cdecl("swift_entry_point")
public func swift_entry_point(interfacePtr: OpaquePointer?,
libraryPtr: OpaquePointer?,
extensionPtr: OpaquePointer?) -> UInt8 {
guard let interfacePtr, let libraryPtr, let extensionPtr else {
print("Not all pointers are available.")
return 0
}
initializeSwiftModule(interfacePtr, libraryPtr, extensionPtr, initHook: setupExtension, deInitHook: { _ in })
return 1
}
#initSwiftExtension(cdecl: "swift_entry_point", types: [PlayerController.self])

This file was deleted.

Expand Up @@ -8,6 +8,7 @@
import Foundation
import SwiftGodotKit
import SwiftGodot
import SwiftGodotMacros


func loadScene (scene: SceneTree) {
Expand Down
Expand Up @@ -70,7 +70,7 @@
@Steps {
@Step {
Create a new Swift file called **MainLevel** in the SimpleRunnerDriver package and import the SwiftGodot
library.
and SwiftGodotMacros libraries.

@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-init.swift", reset: true)
}
Expand All @@ -80,7 +80,8 @@
@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-2.swift")
}
@Step {
Add the `player`, `spawnpoint`, and `teleportArea` properties to `MainLevel.`
Add the `player`, `spawnpoint`, and `teleportArea` properties to `MainLevel`, using the `@SceneTree`
macro to list their names in the scene tree.

Note that these properties are marked optional, as they may not exist in the scene tree.

Expand All @@ -89,25 +90,13 @@
alt: "A screenshot of the scene tree for the main level in Godot.")
}
}
@Step {
In the `_ready()` method, assign the newly created node properties by using `getNodeOrNull(path:)`
method.

Note that the path matches the names as seen in the scene tree. As these nodes are direct children of
the main level node, extra pathing is not required.

@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-4.swift") {
@Image(source: "Godot-MainLevel-SceneTree",
alt: "A screenshot of the scene tree for the main level in Godot.")
}
}
@Step {
Create a new `teleportPlayerToTop()` method and add a guard statement to check that the player and spawn
point exist.

`GD.pushWarning(_:)` allows us to send warning messages to Godot's console.

@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-5.swift")
@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-4.swift")
}
@Step {
Set the player's position so that their horizontal coordinate is kept, but the vertical coordinate is
Expand All @@ -116,20 +105,20 @@
This will effectively teleport the player to the top of the map, preserving where the player was on the
horizontal axis.

@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-6.swift")
@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-5.swift")
}
@Step {
In `_ready()`, connect the teleport area's `bodyEntered` signal method to check if the player has
entered the area and teleport them when necessary.
In the `_ready()` method, connect the teleport area's `bodyEntered` signal method to check if the player
has entered the area and teleport them when necessary.

@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-7.swift")
@Code(name: "MainLevel.swift", file: "MainLevel-multiscript-6.swift")
}
@Step {
Register the class type in `SimpleRunnerDriver.swift` to expose it to Godot.

@Code(name: "SimpleRunnerDriver.swift",
file: "SimpleRunnerDriver-multiscript-2.swift",
previousFile: "SimpleRunnerDriver-starter-4.swift")
previousFile: "SimpleRunnerDriver-starter-3.swift")
}
}
}
Expand Down
Expand Up @@ -47,19 +47,14 @@
@Code(name: "Package.swift", file: "Package-starter-4.swift")
}
@Step {
In SimpleRunnerDriver.swift, import the SwiftGodot library and write a function `swift_entry_point` that
will initialize the extension.
In SimpleRunnerDriver.swift, import the SwiftGodot and SwiftGodotMacros libraries and call the
`initSwiftExtension` macro to create an entry point. For now, we can pass an empty array for the nodes
to be registered.

@Code(name: "SimpleRunnerDriver.swift",
file: "SimpleRunnerDriver-starter-2.swift",
previousFile: "SimpleRunnerDriver-starter-init.swift")
}
@Step {
Write a `setupExtension` method that will handle registering our game script classes, and replace the
initHook parameter in `initializeSwiftModule` with our new function.

@Code(name: "SimpleRunnerDriver.swift", file: "SimpleRunnerDriver-starter-3.swift")
}
}
}

Expand Down Expand Up @@ -129,14 +124,14 @@
@Code(name: "PlayerController.swift", file: "PlayerController-starter-8.swift")
}
@Step {
In the `setupExtension(at:)` function located at SimpleRunnerDriver.swift, register the
`PlayerController` class type.
In, SimpleRunnerDriver.swift, register the `PlayerController` class type by adding this to the array
in `initSwiftExtension`.

This registration call exposed the class type to Godot as a valid node that can be used in the engine.

@Code(name: "SimpleRunnerDriver.swift",
file: "SimpleRunnerDriver-starter-4.swift",
previousFile: "SimpleRunnerDriver-starter-3.swift")
file: "SimpleRunnerDriver-starter-3.swift",
previousFile: "SimpleRunnerDriver-starter-2.swift")
}
}
}
Expand Down