DEV Community

Cover image for Place iOS - r/place canvas clone
Jesus Guerra
Jesus Guerra

Posted on β€’ Edited on

9 5

Place iOS - r/place canvas clone

Overview of My Submission

Place iOS is r/place canvas clone made with Appwrite and pure SwiftUI.
I decide create this project for Appwrite Hackathon to test me in SwiftUI and use majority appwrite Apis. πŸ˜ƒ
I'm a super fan of pixel art and this project fit perfect whit it. 🟩🟨πŸŸͺ

The rules are simple: You can place a pixel every 30 seconds and the canvas will be updated using realtime.

Manage accounts, database, storage, sessions, realtime, functions and more were super simple with appwrite. 😎

My approach for create the canvas in SwiftUI

class CanvasViewModel: ObservableObject {

    @Published var documents: [Doc] = [Doc]()

    // MARK: - Properties
    let canvasWidth: Int = 256
    let canvasHeight: Int = 256

    /// Pixel per pixels πŸ‘€
    /// if canvasPixelFactor is high every pixels looks better (no antialiasing) but the performance in older devices will be compromised... Int(UIScreen.main.scale) + (3-12) works good
    let canvasPixelFactor: Int = Int(UIScreen.main.scale) + 3

    /// Computed canvas size
    var canvasWidthComputed: CGFloat {
        return CGFloat(canvasWidth * canvasPixelFactor)
    }

    var canvasHeightComputed: CGFloat {
        return CGFloat(canvasWidth * canvasPixelFactor)
    }
    .
    .
    .
}
Enter fullscreen mode Exit fullscreen mode

Fetch pixels from storage and database, then create image

private func createImage(completionHandler: @escaping (UIImage?, String?) -> Void){

        guard !documents.isEmpty else { fatalError() }

        guard canvasWidth > 0 && canvasHeight > 0 else { fatalError() }


        DispatchQueue.global(qos: .utility).async {
            let width = self.canvasWidth * self.canvasPixelFactor
            let height = self.canvasHeight * self.canvasPixelFactor
            let rgbColorSpace =     CGColorSpaceCreateDeviceRGB()
            let bitmapInfo =        CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) // premultipliedLast or .none
            let bitsPerComponent =  8
            let bitsPerPixel =      32

            var pixels = [Pixel]()

            if self.pixelsArray.isEmpty {

                for _ in 0..<width {
                    for _ in 0..<height {
                        pixels.append(Pixel(r: 255, g: 255, b: 255, a: 255))
                    }
                }

                // Colorize
                for doc in self.documents {
                    let x = doc.x + 1
                    let y = doc.y + 1

                    let startXPx = x > 0 ? Int((x-1) * self.canvasPixelFactor) : 1
                    let endXPx = Int(x * self.canvasPixelFactor)

                    let startYPx = y > 0 ? Int((y-1) * self.canvasPixelFactor) : 1
                    let endYPx = Int(y * self.canvasPixelFactor)

                    for i in startXPx..<endXPx{
                        for j in startYPx..<endYPx{
                            let offset: Int = (Int(self.canvasWidthComputed) * j) + i
                            pixels[offset] = Pixel(hexString: doc.hex)
                        }
                    }
                }

                .
                .
                .
                .
    }
Enter fullscreen mode Exit fullscreen mode

Bot

Also taking advantage of appwrite SDK's, i made a Bot in python for create pixel art in the canvas.πŸ€–

The bot converts Sprites (or any image) in a valid image for draw in the canvas, the bot uses secret enviroment variable such we provided previously in colorPixel function, thus, will skip the delay. 😎

Bot demo

Dependencies

Appwrite Apple SDK: For manage, accounts, sessions, database, storage, functions, realtime... ⚑

Drops: For create notifications.
Popovers: For create pop menus.
SwiftyBeaver: For logging.

Submission Category:

Mobile Moguls

Link to Code

GitHub logo chuiizeet / place-ios

A r/place canvas clone made with Appwrite and SwiftUI for Appwrite Hackathon

Place iOS

Appwrite

Place iOS is r/place clone made with Appwrite and SwiftUI.
I decide create this project for Appwrite Hackathon to test me in SwiftUI and use majority appwrite Api'.

Additional Resources / Info

Onboarding

Func fact: In the last page, the third guy has an appwrite t-shirt.

Onboarding

Canvas View

For navigate in the canvas view you can zoom in, zoom out , drag and reset.

Func fact: The allowed colors is my favorite palette when i did pixel art: PICO-8 (only i was made a little change in white color to #FFFFFF)

Canvas

Authentication

Only members are allowed to place pixels.

Auth

Settings

For log out, change zoom factor and information.

Fun fact: Tha app support Dark Mode. πŸ˜πŸŒ™

Settings

Notifications

I use drops for put cool notifications. πŸ””

Notifications

Videos

  • App demostration

  • Bot demostration

Conclusion

This project was super fun to do.
Thanks for read and special thanks to Appwrite community for solves my questions ever. πŸ™

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (2)

Collapse
 
eldadfux profile image
Eldad A. Fux β€’

Nice!

Collapse
 
chuiizeet profile image
Jesus Guerra β€’

Thanks a lot for your feedback πŸ˜„

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free