iso engine handle blades spritesheet properly

This commit is contained in:
2022-06-07 18:53:44 +00:00
parent 40a99dd12b
commit 58b1211fad
3 changed files with 45 additions and 24 deletions

View File

@@ -2,48 +2,32 @@
(var FLOOR_WIDTH 46) (var FLOOR_WIDTH 46)
(var FLOOR_HEIGHT 32) (var FLOOR_HEIGHT 32)
(var SPRITE_HEIGHT 55) (var SPRITE_HEIGHT 55)
(var SPRITE_PADDING 1)
(prop :Array<FlxSprite> floorTiles []) (prop :Array<FlxSprite> floorTiles [])
(method &override :Void create [] (method &override :Void create []
(super.create) (super.create)
// TODO load from a more accessible path // TODO load from a more accessible path
(let [bitmapData (Bmp.loadBitmapData "Data/Terrain Graphics/G796.bmp") (let [spriteSheet (data.blades.SpriteSheet.fromSimpleBmp "Data/Terrain Graphics/G796.bmp" FLOOR_WIDTH SPRITE_HEIGHT)]
spriteSheet (.loadGraphic (new FlxSprite) (FlxGraphic.fromBitmapData bitmapData))] (addSpriteLayer (for row (range 5) (collect (range 5))) spriteSheet)))
(spriteSheet.replaceColor FlxColor.WHITE FlxColor.TRANSPARENT)
(let [sheetWidth (/ (- spriteSheet.frameWidth SPRITE_PADDING) (+ SPRITE_PADDING FLOOR_WIDTH))
sheetHeight (/ (- spriteSheet.frameHeight SPRITE_PADDING) (+ SPRITE_PADDING SPRITE_HEIGHT))]
(doFor row (range sheetHeight)
(doFor col (range sheetWidth)
(floorTiles.push (let [tile (spriteSheet.clone)]
(set tile.clipRect (new FlxRect
(+ SPRITE_PADDING (* col (+ SPRITE_PADDING FLOOR_WIDTH)))
(+ SPRITE_PADDING (* row (+ SPRITE_PADDING SPRITE_HEIGHT)))
FLOOR_WIDTH
SPRITE_HEIGHT))
tile))))))
(addSpriteLayer (for row (range 5) (collect (range 5)))))
(method :Void addSpriteLayer [:Array<Array<Int>> tiles] (method :Void addSpriteLayer [:Array<Array<Int>> tiles :FlxSprite spriteSheet]
(let [&mut rowStartX 0 (let [&mut rowStartX 0
&mut rowStartY 0] &mut rowStartY 0]
(doFor row tiles (doFor row tiles
(let [&mut x rowStartX (let [&mut x rowStartX
&mut y rowStartY] &mut y rowStartY]
(doFor tile row (doFor tile row
(let [tileSprite (.clone (nth floorTiles tile))] (let [tileSprite (.clone spriteSheet)]
(set tileSprite.x (- x tileSprite.clipRect.x)) (set tileSprite.animation.frameIndex tile)
(set tileSprite.y (- y tileSprite.clipRect.y)) (set tileSprite.x x)
(set tileSprite.y y)
(add tileSprite)) (add tileSprite))
(+= x (/ FLOOR_WIDTH 2)) (+= x (/ FLOOR_WIDTH 2))
(+= y (/ FLOOR_HEIGHT 2)))) (+= y (/ FLOOR_HEIGHT 2))))
(-= rowStartX (/ FLOOR_WIDTH 2)) (-= rowStartX (/ FLOOR_WIDTH 2))
(+= rowStartY (/ FLOOR_HEIGHT 2))))) (+= rowStartY (/ FLOOR_HEIGHT 2)))))
(var CAMERA_SPEED 100) (var CAMERA_SPEED 500)
(method &override :Void update [:Float elapsed] (method &override :Void update [:Float elapsed]
(super.update elapsed) (super.update elapsed)

View File

@@ -0,0 +1,13 @@
package data.blades;
import flixel.FlxSprite;
import kiss.Prelude;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;
import flixel.graphics.FlxGraphic;
import flixel.util.FlxColor;
@:build(kiss.Kiss.build())
class SpriteSheet {}

View File

@@ -0,0 +1,24 @@
// make a clean spritesheet the way Flixel wants it (no borders)
(function :FlxSprite fromSimpleBmp [file :Int frameWidth :Int frameHeight]
(let [oBmp (Bmp.loadBitmapData file)
oWidth oBmp.width
oHeight oBmp.height
columns (/ (- oWidth 1) (+ frameWidth 1))
rows (/ (- oHeight 1) (+ frameHeight 1))
width (* frameWidth columns)
height (* frameHeight rows)
bmp (new BitmapData (Std.int width) (Std.int height))
spriteSheet (new FlxSprite)]
(doFor row (range rows)
(doFor col (range columns)
(bmp.copyPixels oBmp (new Rectangle
(+ 1 (* col (+ 1 frameWidth)))
(+ 1 (* row (+ 1 frameHeight)))
frameWidth
frameHeight)
(new Point (* col frameWidth) (* row frameHeight)))))
(spriteSheet.loadGraphic (FlxGraphic.fromBitmapData bmp) true frameWidth frameHeight)
(spriteSheet.replaceColor FlxColor.WHITE FlxColor.TRANSPARENT)
spriteSheet))
// TODO some of the sprite sheets mix multiple frame sizes (i.e. character sheets)