import Foundation import simd internal class SpriteTestGame: GameDelegate { private var spriteBatch: SpriteBatch! private var player = TestPlayer(position: .one * 10) private var texture: RendererTexture2D! private var wireShark: RendererTexture2D! private static let levelWidth = 40, levelHeight = 23 private var level: [UInt8] init() { self.level = .init(repeating: 0, count: Self.levelWidth * Self.levelHeight) for i in 0..(renderer.frame.size)) * 0.01), destination: nil, angle: sin(player.rotate) * .pi * 0.1, center: nil, color: .init(renderer.clearColor).setAlpha(0.7)) // Draw level let scale: Float = 64 for y in 0..( origin: .init(4 + cos(player.rotate / 1.2) * 4, 0), size: .init(4 + cos(player.rotate / 1.3) * 4, 16)), position: .init(704 + 24, 1152 + 12), scale: .init(24, 12), angle: doorAngle, origin: SIMD2(repeating: 1), flip: .none, color: .red.mix(.white, 0.3)) // Draw mouse cursor var mpos = Mouse.position if self.spriteBatch.viewport != nil { mpos /= SIMD2(Size(renderer.frame.size)) mpos *= SIMD2(self.spriteBatch.viewport!.size) } let inter = 0.5 + sin(player.rotate * 10) * 0.5 let color = Color.green.mix(.white, 0.3) let mesh = Mesh.init(vertices: [ .init(position: mpos, texCoord: .zero, color: .one), .init(position: mpos + .init(50, 0) + .init(-50, 50) * inter, texCoord: .zero, color: SIMD4(color)), .init(position: mpos + .init(0, 50) + .init( 50, -50) * inter, texCoord: .zero, color: SIMD4(color)), .init(position: mpos + .init(80, 80), texCoord: .zero, color: .zero) ], indices: [ 0, 1, 2, 1, 2, 3 ]) if Mouse.down(.left) { self.spriteBatch.draw(self.texture, mesh: mesh) } else { self.spriteBatch.draw(self.texture, vertices: mesh.vertices[..<3]) } self.spriteBatch.end() } } fileprivate struct TestPlayer { var position: SIMD2 var rotate: Float = 0 } fileprivate extension Color { func setAlpha(_ newAlpha: T) -> Self { return .init(r: r, g: g, b: b, a: newAlpha) } }