{"id":27146175,"url":"https://github.com/pforhan/callsprite","last_synced_at":"2025-04-08T10:09:14.673Z","repository":{"id":137956427,"uuid":"271925939","full_name":"pforhan/callsprite","owner":"pforhan","description":"Sprite loader and animator","archived":false,"fork":false,"pushed_at":"2025-02-20T01:02:23.000Z","size":245,"stargazers_count":0,"open_issues_count":12,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-20T02:22:09.224Z","etag":null,"topics":["kotlin","sprite","swing"],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pforhan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-13T02:24:14.000Z","updated_at":"2025-02-20T01:02:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"826f5a8e-f995-49d5-8ea9-73828576875f","html_url":"https://github.com/pforhan/callsprite","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pforhan%2Fcallsprite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pforhan%2Fcallsprite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pforhan%2Fcallsprite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pforhan%2Fcallsprite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pforhan","download_url":"https://codeload.github.com/pforhan/callsprite/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247819947,"owners_count":21001394,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kotlin","sprite","swing"],"created_at":"2025-04-08T10:09:14.070Z","updated_at":"2025-04-08T10:09:14.662Z","avatar_url":"https://github.com/pforhan.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# callsprite\nSprite loader, animator, editor in kotlin\n\nNot the first, not the best, just a thing.\n\n# General goals\nPrimarily intended for frame-based pixel sprites (aka Pixel Art), such as these, courtesy \n[sanctumpixel](https://sanctumpixel.itch.io/fire-column-pixel-art-effect).\n\n![frame4](https://github.com/pforhan/callsprite/raw/main/editor/src/main/resources/fire_column_medium_4.png)\n![frame5](https://github.com/pforhan/callsprite/raw/main/editor/src/main/resources/fire_column_medium_5.png)\n![frame6](https://github.com/pforhan/callsprite/raw/main/editor/src/main/resources/fire_column_medium_6.png)\n![frame7](https://github.com/pforhan/callsprite/raw/main/editor/src/main/resources/fire_column_medium_7.png)\n![frame8](https://github.com/pforhan/callsprite/raw/main/editor/src/main/resources/fire_column_medium_8.png)\n![frame9](https://github.com/pforhan/callsprite/raw/main/editor/src/main/resources/fire_column_medium_9.png)\n\n...which the tool can put together roughly like this:\n\n![anim](https://github.com/pforhan/callsprite/raw/main/site/100ms-anim.gif)\n\nor more complicated animations like these (click to watch on [youtube](https://www.youtube.com/watch?v=2O4BTYVthDU)):\n\n[![animation set](https://img.youtube.com/vi/2O4BTYVthDU/0.jpg)](https://www.youtube.com/watch?v=2O4BTYVthDU)\n\n# Overall Concepts \n\nFor this library we'll make a sprite a bit like the library's [namesake](#namesake), they'll track a\nlot of their own state, particularly around animations.  So we'll make Sprite the top-level object.\n\nA Sprite contains a number of animations. Animations contain a number of frames and a \nbehavior (repeat, stop, transition). Frames can have join points that allow multiple sprites to \nconnect to one another. \n\n## Guiding Principles\n\nTwo primary things we want to keep in mind:\n* Keep all runtime code as simple as possible.  Loaders and utilities will be more complex, but the \nresulting Animation will be simple.\n* This is a view layer that handles some logic but not much.  Animations, affine transforms, sure, \nbut concepts like jumping and gravity, no.  Such should be in a model layer.\n\nFor example, if we want to run an animation in reverse, there should be a utility method to do so, \nand it will produce a new animation object.  But the two animations will always proceed forward in \ntime in a nod to simplicity. \n\nLikewise, if we want one frame to last longer than another, just repeat the frame rather than deal\nwith differing frame lengths.\n\n## Namesake\n\nTI Extended Basic added support for Sprites -- bitmapped, semi-autonomous pixel graphics with \nposition, velocity, scaling, and collision detection.  A typical command could look like:\n\n```\nCALL SPRITE(#6, 108, 13, 80, 9, 90, 0)\n```\n\n(For the still-curious, that's sprite-number, character number, color, row, column, vertical \nvelocity, horizontal velocity)\n\n# Thoughts and questions:\npull in romainguy/kotlin-math if we need to do a lot of matrices\n\nShould we require frames in an Animation to be the same size?","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpforhan%2Fcallsprite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpforhan%2Fcallsprite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpforhan%2Fcallsprite/lists"}