DEV Community

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

Posted on • Edited on

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. πŸ™

Top comments (2)

Collapse
 
eldadfux profile image
Eldad A. Fux

Nice!

Collapse
 
chuiizeet profile image
Jesus Guerra

Thanks a lot for your feedback πŸ˜„