Swift framework for working with Tiled assets in SpriteKit

Overview

SKTiled

SKTiled is a framework for integrating Tiled assets with Apple's SpriteKit, built from the ground up with Swift. This project began life as an exercise to learn Apple's new programming language for a game project, but I've decided to release it as open source with the hopes that others will find it useful. SKTiled is up-to-date and supports Tiled's major features, including all map & object types.

Demo Image

Check out the Official Documentation.

Features

  • iOS & macOS versions
  • tvOS version
  • parses inline & external tilesets
  • translates custom properties for maps, layers, objects & tiles
  • renders all projections: (orthogonal, isometric, hexagonal & isometric staggered)
  • renders all layer types: (tile, object, image, group)
  • supports all compression types: (base64, zlib, gzip)
  • renders animated and flipped tiles
  • pre-loading of tilesets
  • group nodes
  • tile objects
  • text objects
  • template objects
  • custom tile & object classes
  • generate GKGridGraph graphs from custom attributes
  • user-definable cost properties for GKGridGraph nodes
  • infinite maps
  • tile collision objects
  • Zstandard compression support
  • layer tinting
  • file properties

Requirements

  • iOS 12
  • tvOS 12
  • macOS 11
  • Xcode 11/Swift 5

Installation

Carthage

For Carthage installation, create a Cartfile in the root of your project:

github "mfessenden/SKTiled" ~> 1.2

To use the new binary framework format, pass the --use-xcframeworks parameter to the build command:

carthage update --use-xcframeworks

For more information, see the Carthage Installation documentation.

CocoaPods

For CocoaPods, install via a reference in your podfile:

pod 'SKTiled', '~> 1.2'

Usage

Loading a tilemap is very straightforward:

if let tilemap = SKTilemap.load(tmxFile: "sample-map") {
    scene.addChild(tilemap)
}

Once loaded, the rendered SKTilemap node reflects the various properties defined in the originating scene:

  • SKTilemap.size: size of the map in tiles.
  • SKTilemap.tileSize: size of individual tiles.
  • SKTilemap.orientation: map orientation (ie orthogonal, isometric, etc).

The SKTilemap node also gives users access to child layers, tilesets, objects or individual tiles.

Working with Layers

Layers represent containers that hold various types of data:

  • tile layers hold an array of tile sprites and associated tileset data
  • object groups contain vector shape objects
  • image layers display a single image
  • group layers encapsulate other layers

All SKTiled layer types are subclasses of the base SKTiledLayerObject object and provide access to coordinate transformation and positioning information. Additionally, every layer type can have individual offset transforms and rendering flags.

Layers can be accessed by type, name or index:

// query layers by type
let tileLayers = tilemap.tileLayers
let objectGroups = tilemap.objectGroups
let imageLayers = tilemap.imageLayers
let groupLayers = tilemap.groupLayers

// query named layers
let groundLayers = tilemap.getLayers(named: "Ground") as! [SKTileLayer]
let objectGroups = tilemap.getLayers(named: "Objects") as! [SKObjectGroup]
let hudLayers = tilemap.getLayers(named: "HUD") as! [SKImageLayer]

// query layer at a specific index
if let firstLayer = tilemap.getLayer(atIndex: 1) as! SKTileLayer {
    firstLayer.visible = true
}

Working with Tiles

There are a number of ways to access and manipulate tile objects. Tiles can be queried from the SKTilemap node, or the parent SKTileLayer layer:

// access a tile via CGPoint
let tileCoord = CGPoint(x: 7, y: 12)
if let tile = groundLayer.tileAt(coord: tileCoord) {
    tile.tileData.tileOffset.x += 8
}

// access a tile with integer coordinates
if let tile = groundLayer.tileAt(7, 12) {
    tile.tileData.tileOffset.x += 8
}

// query tiles at a specific coordinate (all layers)
let tiles = tilemap.tilesAt(2, 4)

Tiles assigned custom properties in Tiled can be accessed in SKTiled:

// query tiles of a certain type
if let fireTiles = tilemap.getTiles(ofType: "fire") {
    // do something fiery here...
}

You can also return tiles with a specific ID value:

if let waterTiles = waterLayer.getTiles(globalID: 17) {
    // do something watery here...
}

Working with Objects

SKTileObject objects can be queried from both the SKTilemap and SKObjectGroup nodes:

let allObjects = tilemap.getObjects()
let allTreeObjects = tilemap.getObjects(named: "Tree")
let allCollisionObjects = tilemap.getObjects(ofType: "Collision")

// get objects from the objects group layer
let entrances = objectsLayer.getObjects(ofType: "Entrance")

Acessing Tile Data

The SKTilemap node stores an array of individual tilesets parsed from the original Tiled document. Individual tile data is accessible from either the SKTileset object:

let tileSet = tilemap.getTileset("spritesheet-16x16")
// get data for a specific id
let tileData = tileSet.getTileData(globalID: 177)

and the parent SKTilemap:

let tileData = tilemap.getTileData(globalID: 177)

Adding Nodes

Tile data includes texture data, and SKTile objects are SKSpriteNode subclasses that can be initialized with tileset data:

let newTile = SKTile(data: tileData)
scene.addChild(newTile)

Coordinate information is available from each layer via the SKTiledLayerObject.pointForCoordinate method:

let tilePoint = groundLayer.pointForCoordinate(4, 5)
tile.position = tilePoint

New nodes (any SKNode type) can be added directly to any layer. All SKTiledLayerObject layer types have expanded convenience methods for adding child nodes with coordinates and z-position.

let roadRoot = SKNode()
groundLayer.addChild(roadRoot, 4, 5, zpos: 100.0)

SKTiled also provides methods for getting coordinate data from UITouch and NSEvent mouse events:

// get the coordinate at the location of a touch event
let touchLocation: CGPoint = objectsLayer.coordinateAtTouchLocation(touch)

Animated Tiles

Tiles with animation will animate automatically when the tilemap node is added to the SKScene.update method. Animated tiles can be accesssed from the either the SKTilemap node or the parent layer.

// get all animated tiles, including nested layers
let allAnimated = tilemap.animatedTiles(recursive: true)

// pause/unpause tile animation
for tile in allAnimated {
    tile.isPaused = true
}

// run animation backwards
for tile in allAnimated {
    tile.speed = -1.0
}

// get animated tiles from individual layers
let layerAnimated = groundLayer.animatedTiles()

Custom Properties

Custom properties are supported on all object types. All SKTiled objects conform to the SKTiledObject protocol and allow access to and parsing of custom properties.

Any property added to an object in Tiled will be translated and stored in the SKTiledObject.properties dictionary.

let layerDepth = groundLayer.getValue(forProperty: "depth")
groundLayer.setValue(12.5, forProperty: "depth")

To query tiles of a given type:

let waterTiles = groundLayer.getTiles(ofType: "water")
let allWaterTiles = tilemap.getTiles(ofType: "water")

For specific property/value types:

let groundWalkable = groundLayer.getTilesWithProperty("walkable", true)
let allWalkable = tilemap.getTilesWithProperty("walkable", true")

Acknowledgments

Comments
  • Cannot intercept callbacks during loading map..

    Cannot intercept callbacks during loading map..

    How can I intercept the end of the map loading without completions or delegate if my code follow your home instructions? How can I use callbacks?

    // Load TileMap
    guard let tilemap = SKTilemap.load(fromFile: currentTMXfilename) else {
                fatalError("Failed to load tilemap.")
    }
    
    

    after this line if I try to get a SKLayer, is always nil (I suppose because the map don't finish to load all components..) .. Thank you in advance.

    enhancement 
    opened by aornano 10
  • Loading new tilemap memory leak

    Loading new tilemap memory leak

    Whenever I try to leave my class that inherits SKTiledScene using view.presentScene() and then display the tile map again, memory isn't released when it should be. A simple example is using your demo iOS project: switching between the various tilemaps increases the memory even when I go back to the first one, which will eventually result in a crash. I'm suspecting that there's a strong reference cycle in SKTiledScene that's stopping the tilemap from being deallocated, but I can't find it myself. Any help would be greatly appreciated!

    Screen Shot 2020-12-09 at 10 39 55 AM

    opened by andrewpeng02 8
  • Reading tile set properties configured with the Object Types Editor

    Reading tile set properties configured with the Object Types Editor

    First of all, great work on this project! I think generally it's easy to use. I forked a branch for tvOS and perhaps I will in the future submit a patch, if I can adapt the Demo project properly for tvOS.

    Now for my question ...

    In my current level setup I have to following:

    • I have created a tile map that makes use of a tile set.
    • The tile set contains some objects with sprites.
    • I have created Object Types using the Object Types Editor. One of these Object Types is a "Creature". As a property for "Creature" I have added "breed".
    • Within the tile set I assigned the type "Creature" to the tiles. I've set the "breed" property to "player" for 1 tile and "imp" to another tile.

    Now it is difficult for me to read this property directly using the SKTiled framework. It seems I have to resort to a bit of "hackery" to read the value for "breed". Currently I do this as follows:

            if let tile = object.value(forKeyPath: "tile") as? SKTile {
                if let breed =  tile.tileData.stringForKey("breed") {
                    print("breed: \(breed)")
                }
            }
    

    The "hackery" in this situation is the fact that I use value(ForKeyPath:) to access to tile property, in order for me read the value for the breed property.

    I don't know if it's a good idea to make the tile property publicly accessible, but I would like to have some cleaner way to access these kind of properties.

    Perhaps I am doing something wrong or perhaps this is an area where the framework could improve.

    enhancement 
    opened by wolf81 7
  • NSArray was mutated while being enumerated

    NSArray was mutated while being enumerated

    Hello Michael, seems that sometimes the actual framework (v.1.07) crash with the message on subject. The crash is stopped to appDelegate so there isn't a specific line of code, but during my analisys to the debug error output, I've discovered the array layers is involved when the tileLayers are in paused mode. So I've change this code:

    SKTiledMap.swift (original)

    /// Pauses the node, and colors all of its children darker.
        override open var isPaused: Bool {
            didSet {
                guard oldValue != isPaused else { return }
                let newColor: SKColor = isPaused ? SKColor(white: 0, alpha: 0.25) : SKColor.clear
                let newColorBlendFactor: CGFloat = isPaused ? 0.2 : 0.0
                
                speed = isPaused ? 0 : 1.0
                color = newColor
                
                layers.forEach { layer in
                    layer.color = newColor
                    layer.colorBlendFactor = newColorBlendFactor
                    layer.isPaused = isPaused
                    //layer.speed = speed
                }
            }
        }
    

    with this code:

     /// pauses the node, and colors all of its children darker.
        override open var isPaused: Bool {
            didSet {
                guard oldValue != isPaused else { return }
                let newColor: SKColor = isPaused ? SKColor(white: 0, alpha: 0.25) : SKColor.clear
                let newColorBlendFactor: CGFloat = isPaused ? 0.2 : 0.0
                
                speed = isPaused ? 0 : 1.0
                color = newColor
                let tempLayers:Set<TiledLayerObject> = layers
                tempLayers.forEach { layer in
                    layer.color = newColor
                    layer.colorBlendFactor = newColorBlendFactor
                    layer.isPaused = isPaused
                    //layer.speed = speed
                }
                layers = tempLayers
            }
        }
    

    where I've found a workaround ,I've created a temporary array to avoid enumeration to the original..

    I've found also this file:

    SKTileLayer.swift

    override open var isPaused: Bool {
            didSet {
                tiles.forEach { tile in
                    tile?.color = self.color
                    tile?.colorBlendFactor = self.colorBlendFactor
                }
            }
        }
    

    where I've maded:

    override open var isPaused: Bool {
            didSet {
                let tempTiles:TilesArray = tiles
                tempTiles.forEach { tile in
                    tile?.color = self.color
                    tile?.colorBlendFactor = self.colorBlendFactor
                }
                tiles = tempTiles
            }
        }
    
    bug 
    opened by aornano 6
  • M1 Mac Xcode12

    M1 Mac Xcode12

    On Xcode 12 - M1Mac i have trouble to set this Framework up as described. with Carthage I get this error:

    Building universal frameworks with common architectures is not possible. The device and simulator slices for "SKTiled" both build for: arm64 Rebuild with --use-xcframeworks to create an xcframework bundle instead.

    cocoapods doesn't work either.

    on Xcode 13 beta5 I tried to add the Framework directly via "File->Add Package" and pasted the GitHub link - still no luck, it was unable to resolve dependencies

    im new to Xcode/iOS please update install instructions for this framework

    question 
    opened by msobo 4
  • Wrong ID number for tilesets based on tilesets image

    Wrong ID number for tilesets based on tilesets image

    I've a map maked with "Tiled Map Editor" version 1.4.2 and all is perfect using this editor. When I try to load all map and assets inside my game, strange things happened during the loading of tiles taken by tilesets based on tilesets image (multiple tiles in one big image). It seems the ID taken is the previous in the tile sequence, so instead of showing TILE ID 4, SKTiled show ID 3.

    I was searching for the exact responsible method and I've found it:

    public func getLocalID(forGlobalID gid: Int) -> Int {
            // firstGID is greater than 0 only when added to a tilemap
            let id = (firstGID > 0) ? (gid - firstGID) : gid
            // if the id is less than zero, return the gid
            return (id < 0) ? gid : id
        }
    

    if I change this line the tilesets based on tilesets showed correctly all tiles, but the rest of the map is total black let id = (firstGID > 0) ? (gid - firstGID) + 1 : gid

    Any idea about it? Could I distinguish tilesets based on tilesets from traditional tilesets to apply a condition and solve it?

    Thank you in advance for all your support.

    bug 
    opened by aornano 4
  • Can I get that the user clicked on a certain location on the map?

    Can I get that the user clicked on a certain location on the map?

    After the map is loaded, some elements on the map need to perform interaction after the user clicks, such as jumps, bubbles, etc.

    Is this feature currently supported?

    opened by yuhanle 3
  • Large tile maps not rendering correctly

    Large tile maps not rendering correctly

    I'm testing out this library as a possible means to load in default maps and manage maps for a biz sim game. The MacOS demo application seemed to work OK with the sample tilemaps.

    I tried loading in my own tilemap (50x50 at 64px), sometimes it loads fine, but others it only loads to y31 graphically. I can still see the mouse over triggers change for the lower part of the image, even though I can't see it. When i click "show grid", this then changes so only x18 and beyond are shown, but all of y is shown.

    Seems pretty weird to me. It's an intermittent issue, so it seems. (I'm sorry.) Here are the attached tilemap and pallet file.

    tileset.zip (I had to upload them as a zip because of github restrictions.)

    I don't want to spend time intergrating this tilemap solution into my current setup if there are problems with maps of that size.

    I'm running version 1.21. Running on MBP 13" 2017 on MacOS 10.13.6

    bug 
    opened by Relequestual 3
  • cocoapods installation error

    cocoapods installation error

    Hey,

    When i try to install 1.12 version i get this error :

    [!] Unable to satisfy the following requirements:
    
    - `SKTiled (~> 1.12)` required by `Podfile`
    
    None of your spec sources contain a spec satisfying the dependency: `SKTiled (~> 1.12)`.
    
    You have either:
     * out-of-date source repos which you can update with `pod repo update` or with `pod install --repo-update`.
     * mistyped the name or version.
     * not added the source repo that hosts the Podspec to your Podfile.
    
    Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.
    

    I searched at cocoapods.org and the version number was 1.07 screen shot 2017-07-21 at 2 44 37 pm

    When i change my podfile to SKTiled (~> 1.07) it works.

    opened by retrokid 3
  • addTileAt not replacing tile properly

    addTileAt not replacing tile properly

    Hi, first of all thank you for the amazing framework! It's really hard to find stuff on tile maps in swift, so this framework really helps.

    I'm trying to use layer.addTileAt to change a tile at a coordinate, but I'm running into an issue. Calling that function removes the tile, but it doesn't replace the tile with a new one. For example, downloading your repo and adding this line of code on line 450 of SKTiled/Demo/SKTiledDemoScene.swift after updatePropertiesInfo():

    let newTile = (tilemap.getLayers(named: "Ground")[0] as? SKTileLayer)?.addTileAt(coord: coord, gid: 41)

    Should change the tile to a new tile with gid 41 (I think this corresponds to a wall tile?) but it only removes and doesn't replace the tile. I tested this on the isometric (second) map. It seems to return the proper wall tile but it isn't visible, but I couldn't figure out how to fix this issue.

    Any help would be greatly appreciated!

    bug 
    opened by andrewpeng02 2
  • Building in iOS 11

    Building in iOS 11

    To get this to build in iOS 11, I had to remove the zlib module included in the repository and add OTHER_LDFLAGS = "-lz"; to the project.

    opened by technicallyerik 2
  • [Solved] Some nodes disappear with the framework

    [Solved] Some nodes disappear with the framework

    When I started with your framework I noticed that everything worked fine except that some of my nodes disappeared only when SKTiled was imported for the first time.

    After hours of investigation, I noticed that you added a convenience init to SKColor and since I was using the classical range of alpha value, your init was overriding the UIColor one and making my colored sprites with an alpha value near 0.

    opened by Vinwcent 0
  • Memory issues when presenting new SKTiledScene, small on iOS, larger on macOS

    Memory issues when presenting new SKTiledScene, small on iOS, larger on macOS

    When presenting a new scene it appears not all memory is freed.

    The Demo project shows this, when repeatedly pressing "next" cycling through the maps, memory usage goes up, and never down. On the iOS Simulator I see ± 1MB increased memory used each time, on macOS I see ±5MB of increased memory use each time. The memory graph never goes down.

    When trying my own app, with a single TMX file (eg. the famous level1.tmx file from this example) I get 100 MB (!) of increased memory use on macOS and 2 MB on iOS Simulator every time a new SKTiledScene is presented with that map.

    When trying with an empty TMX map of size 10x10 tiles with no content, I get 120 MB of increased memory use on macOS and 0.2 MB on iOS Simulator every time a new SKTiledScene is presented.

    It appears to me that on macOS the problem is huge, on iOS it is doable

    The SKTiledScene.deinit gets called each time so the scene is cleaned up correctly (I think?)

    When debugging with Xcodes memory graph it shows no problems or leaks. However, if I don't load a map with SKTiledScene.setup(....) the issue does not occur.

    When I override deinit in all classes and print a debug text, I can see that only SKTilemapParser gets deinited immediately after loading the map. All other classes are never deinited.

    opened by ghost 0
  • Feature request: get tile coord from SKTile object

    Feature request: get tile coord from SKTile object

    While it is easy to get the tiles using tileAt(coord: tileCoord) from the SKTilemap or SKTileLayer, there is no reverse method that gives me the coords for any given SKTile.

    I would like to be able to get the coords from the SKTile itself.

    (I could calculate them myself my using something like tilemap.coordinateForPoint(tile.position) but that seems complicated and may not be accurate depending on the parent node of the tile.)

    thanks

    opened by ghost 0
  • Questions: player, enemies; collision detection?

    Questions: player, enemies; collision detection?

    Thanks for maintaining this awesome project!

    As a new game dev, I'm looking for some information:

    • player / enemies: do I add them as children on the SKScene, on the world node, on the tilemap, or on a layer? • collision detection: as collision objects are not supported in SKTiled, should I add SpriteKit collision masks to all tiles and didBegin(_ contact:), or for example check for the presence of tiles near the player position?

    Thanks!

    opened by ghost 0
  • SKTileMapNode vs SKTiled performance question

    SKTileMapNode vs SKTiled performance question

    Hi there!

    First of thanks for this amazing project, it's very useful and nicely built. Having the ability to import tmx files straight into SpriteKit is incredibly valuable :)

    I have some question though. I am working on a new project, and setting up the toolset. One of the main challenges I see is that I want to be able to render quite large maps (eg 300300tiles) without loading screens etc. The tiles are 3232, but that is not really important now. I preferably design the maps in Tiled, though that is not a must.

    Now I tried two API's to draw large tile maps having 90K tiles. I tried SKTiled, and I really liked the easiness of putting a tmx map in there and it works OOTB. But I found that the performance is not optimal, which I sort of expected with SpriteKit having to take care of 90K nodes, even though not all are rendered ofc. Especially tile cracking is an issue, which I couldn't resolve with the proposed actions here. Enabling shouldEnableEffects also didn't really help, as the map is larger than the max framebuffer texture size is exceeded in my case, making parts of the map being cropped out.

    I gave SKTileMapNode a shot as well. This has an obvious downside, being that built-in Xcode map editor is quite a mess. But drawing the map does result in only 1 node being drawn, instead of 90K. Moreover, the tile cracking isn't an issue as well.

    So I conclude out of this that the usability of SKTiled greatly exceeds that of the SKTileMapNode and related API's and map building capabilities. But, the performance optimizations of SKTileMapNode are probably not to be matched. Hence, I wonder if it might be possible to use tmx files, post process them in some way, and as a result have a SKTileMapNode being produced, either fully in code or as .sks file. Possible it probably is, whether its worth the effort that yet remains to be uncovered. But before I loose myself in this problem, what are your thoughts on this, and did you ever consider the same for example?

    Sorry to create an issue for this, I couldn't find another way to reach out to you.

    Cheers,

    Sander

    opened by sanderfrenken 8
  • Scaling of Objects

    Scaling of Objects

    I heavily rely on the scaling objects in ObjectsLayer inside Tiled. now all object-scaling seems to be ignored by SKTilemap .. that's really unfortunate - all my map layout is broken that way is there a fix / workaround for that?

    opened by msobo 2
Owner
Michael Fessenden
software developer | visual effects
Michael Fessenden
iOS Swift Game - Push SpriteKit to the limit

iOS Swift Project - Legend Wings - EverWing's Mini Clone EverWing is a popular action game. Survive as much you can, earn gold, and upgrade/purchase n

Wong Guan 512 Dec 20, 2022
This project is a 2D game for iOS users built with Swift and SpriteKit.

PANDA CLICKER Description Panda Clicker is a 2D game and the aim is to touch the Panda image on the center of the screen. In each touch of the panda i

iremkaraoglu 6 Dec 21, 2022
ShooterGame - An iOS App that is a shooter game. Made with SpriteKit and Swift

Shooter Game This project was created based on the challenge of Day 66 of the 10

António Pedro da Silva Rocha 0 Feb 1, 2022
A universal iOS Game using Swift and iOS SpriteKit

a universal iOS Game using Swift 4 and iOS SpriteKit.

KooFrank 455 Oct 22, 2022
Mergel - a match-and-merge game written in Swift, using SpriteKit

Mergel is a match-and-merge game written in Swift, using SpriteKit. It was created for the purpose of having some fun with SpriteKit and learning the Swift language.

Josh McKee 9 Nov 6, 2022
🕹 iOS game - classic Tic Tac Toe with AI and state machines [Swift + SpriteKit + GameplayKit].

?? iOS game - classic Tic Tac Toe with AI and state machines [Swift + SpriteKit + GameplayKit].

Astemir Eleev 60 Dec 14, 2022
Glide is a SpriteKit and GameplayKit based engine for building 2d games easily

Glide is a SpriteKit and GameplayKit based engine for building 2d games easily, with a focus on side scrollers. Glide is developed with Swift and works on iOS, macOS and tvOS.

null 433 Jan 6, 2023
The iOS version of 2048, made using SpriteKit

2048 This is a derivative and the iOS version of the game 2048. In the very unlikely case that you don't know what it is, you can check it out here. M

Danqing Liu 1.1k Dec 31, 2022
A Component Piece (a game) for a larger app (KoyaQuest) using SpriteKit

NyonindoChallenge This is a game that is intended for inclusion in a larger app (called KoyaQuest). I have created a separate version because of probl

null 0 Oct 25, 2021
SpriteKit 2D Breakout Game on rotating 3D SceneKit cube almost no code

2D Breakout game playable as texture on a rotating cube An Xcode12 project for iOS that implements a simple 2D SpriteKit "Break Out" style game. The S

Erik M. Buck 0 Nov 6, 2021
A snake engine written in SpriteKit for all Apple devices.

A snake engine written in SpriteKit for all Apple devices. ⭐ Features Fully tested engine functionality. Framework based, super easy to integrate in d

Chris Jimenez 59 Dec 13, 2022
An iOS app build with SpriteKit

Gravity Zen This is an iOS app build with SpriteKit. It shows a gravitationals f

Dominik Hauser 11 Apr 22, 2022
Hitting only the bad PinGUYS! Simple SpriteKit game

Whack-a-Penguin Hitting only the bad PinGUYS! Simple SpriteKit game. You have to

Pavel Surový 1 Feb 7, 2022
AngryBirdClone - Usage SpriteKit for create a AngryBird Game Clone

#AngryBird Clone SpriteKit The SpriteKit framework makes it easy to create high-

Hamit SEYREK 3 Feb 9, 2022
ShogibanKit is a framework (not yet) for implementing complex Japanese Chess (Shogii) in Swift. No UI, nor AI.

ShogibanKit Framework Shogi, or Japanese Chess, is based on very complex rules, and it is hard to implement all basic rules. This ShogibanKit aims to

Kaz Yoshikawa 62 Jul 16, 2022
Swift framework for loading various 3d models in SceneKit

AssetImportKit AssetImportKit is a cross platform library (macOS, iOS) that coverts the files supported by Assimp to SceneKit scenes. Features AssetIm

eugene 74 Nov 30, 2022
Declarative data validation framework, written in Swift

Peppermint Introduction Requirements Installation Swift Package Manager Usage Examples Predicates Constraints Predicate Constraint Compound Constraint

iOS NSAgora 43 Nov 22, 2022
Swift-WordleSolver - Solve and analyze Wordle games. Command-line tool written in Swift

Swift-WordleSolver - Solve and analyze Wordle games. Command-line tool written in Swift

Tobi Schweiger 0 Jan 26, 2022
Imagine Engine - a fast, high performance Swift 2D game engine for Apple's platforms

Welcome to Imagine Engine, an ongoing project that aims to create a fast, high performance Swift 2D game engine for Apple's platforms that is also a j

John Sundell 1.8k Jan 3, 2023