For this project I worked with a team of five other developers to create a sprite editor app. [Sprites](https://en.wikipedia.org/wiki/Sprite_(computer_graphics)) are two-dimensional, low-resolution bitmaps that used as visuals in video games. Oftentimes a sprite consists of multiples frames to create an animation. ![[Sprite.gif]] We followed a waterfall development model for this process by organizing our work into distinct, iterative phases. We started out by surveying existing solutions such as [Piskel](https://www.piskelapp.com/) and [Aseprite](https://www.aseprite.org/) to create a list of features we want to include in our editor. Additionally, we explored the many tools offered by the QT framework (we found their [scribble](https://doc.qt.io/qt-6/qtwidgets-widgets-scribble-example.html) and [image composition](https://doc.qt.io/qt-6/qtwidgets-painting-imagecomposition-example.html) samples very useful). We compiled our findings into a requirements document, and then moved on to designing the app and divvying out roles and responsibilities. My primary responsibility was to design the canvas that would display the sprite and enable editing. ## Overall Structure The simplest part of this project was the sprite class, which inherited all of its functionality from the built-in [QImage class](https://doc.qt.io/qt-6/qimage.html). A sprite object simply stores color values for a matrix of pixels, so a built-in image class does everything we need. Things get a bit more complicated when designing the canvas, however. Because I was working on a team for this project, it was crucial that I faithfully adhere to the interface designs we agreed upon during the planning phase. Any complicated canvas-specific logic should be abstracted away through simple methods and clear documentation so that none of the other developers ran into unexpected behavior.