Skip to content

Commit

Permalink
Merge pull request #129 from alicerunsonfedora/main
Browse files Browse the repository at this point in the history
Add additional macros
  • Loading branch information
migueldeicaza committed Sep 27, 2023
2 parents 844cc7c + 7a17e98 commit 966ef3d
Show file tree
Hide file tree
Showing 26 changed files with 858 additions and 170 deletions.
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

0 comments on commit 966ef3d

Please sign in to comment.