TG Engine is a lightweight game engine built with StencilJS, designed for creating 2D sprite-based games and animations in the browser. It provides a set of web components that handle sprite rendering, animation, collision detection, camera control, and touch input.
npm install tg-engineDisplays a single sprite from a sprite sheet.
src: String - URL or base64 string of the sprite imagewidth: Number - Width of a single sprite frame in pixelsheight: Number - Height of a single sprite frame in pixelsscale: Number - Scale factor for the sprite (default: 1)frame: Number - Initial frame to display (default: 0)hFrames: Number - Number of horizontal frames in the sprite sheetvFrames: Number - Number of vertical frames in the sprite sheetvFlip: Boolean - Whether to flip the sprite vertically (default: false)hFlip: Boolean - Whether to flip the sprite horizontally (default: false)
<tg-spritesrc="path/to/sprite.png"
width={16}height={16}hFrames={2}vFrames={4}scale={5}frame={0}/>Animates a tg-sprite component using predefined animations.
animations: Object - Dictionary of animations{[animationName: string]: {frames: number[],duration: number}}
play: String - Name of the animation to playstate: 'running' | 'paused' - Controls animation playbackiterationCount: 'infinite' | number - Number of times to play the animation
<tg-sprite-animatoranimations={{
'walk': { frames: [0, 1, 2, 3], duration: 100 },
'idle': { frames: [4, 5], duration: 400 }
}}
play="walk"
state="running"
iterationCount="infinite"
><tg-spritesrc="path/to/sprite.png"
width={16}height={16}hFrames={2}vFrames={4}scale={5}/></tg-sprite-animator>Renders a tile-based map using a sprite sheet.
src: String - URL or base64 string of the tile sheetwidth: Number - Width of the map in tilesheight: Number - Height of the map in tilestileWidth: Number - Width of each tile in pixelstileHeight: Number - Height of each tile in pixelshFrames: Number - Number of horizontal frames in the tile sheetvFrames: Number - Number of vertical frames in the tile sheetscale: Number - Scale factor for the tiles (default: 1)tiles: Array - Array of tile objectsinterfaceITile{x: number;y: number;frames: number[];duration?: number;}
<tg-sprite-mapsrc="path/to/tiles.png"
width={8}height={8}tileWidth={16}tileHeight={16}hFrames={10}vFrames={10}scale={5}tiles={[{x:0,y:0,frames:[0]},{x:1,y:0,frames:[1]},{x:0,y:1,frames:[2]},{x:1,y:1,frames:[3]}]}/>Follows a target element with smooth interpolation.
width: Number - Width of the camera viewportheight: Number - Height of the camera viewporttarget: HTMLElement - Element to followsmooth: Number - Smoothing factor for camera movement (default: 0.1)
<tg-camerawidth={400}height={400}target={targetElement}smooth={0.1}><divclass="game-world"><!-- Your game content here --></div></tg-camera>Detects collisions between elements.
name: String - Unique identifier for the colliderwidth: Number - Width of the collision boxheight: Number - Height of the collision boxx: Number - X position offset (default: 0)y: Number - Y position offset (default: 0)
<divclass="player"><tg-collidername="player" width={32}height={32}/></div>Handles touch input with swipe detection.
onSwipeUp: Function - Called when swiping uponSwipeDown: Function - Called when swiping downonSwipeLeft: Function - Called when swiping leftonSwipeRight: Function - Called when swiping right
<tg-touch-controlleronSwipeUp={() => handleSwipe('up')}
onSwipeDown={() => handleSwipe('down')}
onSwipeLeft={() => handleSwipe('left')}
onSwipeRight={() => handleSwipe('right')}
><divclass="touch-area"><!-- Touch area content --></div></tg-touch-controller>- Install the package:
npm install tg-engine- Import the components in your project:
import{defineCustomElements}from'tg-engine/loader';defineCustomElements();- Use the components in your HTML/JSX:
<tg-sprite-mapsrc="path/to/tiles.png"
width={8}height={8}tileWidth={16}tileHeight={16}hFrames={10}vFrames={10}scale={5}tiles={tiles}/>Contributions are welcome! Please read our contributing guidelines to get started.
This project is licensed under the MIT License - see the LICENSE file for details.
- Adjust the example code blocks to match the actual properties and behavior of your components.
- Ensure that all examples are simple and clear to help users understand how to use each component effectively.
- If you have detailed documentation or a demo site, consider linking to these resources for more comprehensive guidance.