From 58b1211fadb8410af45ef547d34109e17539087e Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 7 Jun 2022 18:53:44 +0000 Subject: [PATCH] iso engine handle blades spritesheet properly --- .../source/IsometricMapState.kiss | 32 +++++-------------- .../source/data/blades/SpriteSheet.hx | 13 ++++++++ .../source/data/blades/SpriteSheet.kiss | 24 ++++++++++++++ 3 files changed, 45 insertions(+), 24 deletions(-) create mode 100644 projects/iso-rpg-engine/source/data/blades/SpriteSheet.hx create mode 100644 projects/iso-rpg-engine/source/data/blades/SpriteSheet.kiss diff --git a/projects/iso-rpg-engine/source/IsometricMapState.kiss b/projects/iso-rpg-engine/source/IsometricMapState.kiss index 75c45deb..37dc9ac7 100644 --- a/projects/iso-rpg-engine/source/IsometricMapState.kiss +++ b/projects/iso-rpg-engine/source/IsometricMapState.kiss @@ -2,48 +2,32 @@ (var FLOOR_WIDTH 46) (var FLOOR_HEIGHT 32) (var SPRITE_HEIGHT 55) -(var SPRITE_PADDING 1) - (prop :Array floorTiles []) (method &override :Void create [] (super.create) // TODO load from a more accessible path - (let [bitmapData (Bmp.loadBitmapData "Data/Terrain Graphics/G796.bmp") - spriteSheet (.loadGraphic (new FlxSprite) (FlxGraphic.fromBitmapData bitmapData))] - (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))))) + (let [spriteSheet (data.blades.SpriteSheet.fromSimpleBmp "Data/Terrain Graphics/G796.bmp" FLOOR_WIDTH SPRITE_HEIGHT)] + (addSpriteLayer (for row (range 5) (collect (range 5))) spriteSheet))) -(method :Void addSpriteLayer [:Array> tiles] +(method :Void addSpriteLayer [:Array> tiles :FlxSprite spriteSheet] (let [&mut rowStartX 0 &mut rowStartY 0] (doFor row tiles (let [&mut x rowStartX &mut y rowStartY] (doFor tile row - (let [tileSprite (.clone (nth floorTiles tile))] - (set tileSprite.x (- x tileSprite.clipRect.x)) - (set tileSprite.y (- y tileSprite.clipRect.y)) + (let [tileSprite (.clone spriteSheet)] + (set tileSprite.animation.frameIndex tile) + (set tileSprite.x x) + (set tileSprite.y y) (add tileSprite)) (+= x (/ FLOOR_WIDTH 2)) (+= y (/ FLOOR_HEIGHT 2)))) - (-= rowStartX (/ FLOOR_WIDTH 2)) (+= rowStartY (/ FLOOR_HEIGHT 2))))) -(var CAMERA_SPEED 100) +(var CAMERA_SPEED 500) (method &override :Void update [:Float elapsed] (super.update elapsed) diff --git a/projects/iso-rpg-engine/source/data/blades/SpriteSheet.hx b/projects/iso-rpg-engine/source/data/blades/SpriteSheet.hx new file mode 100644 index 00000000..f522500d --- /dev/null +++ b/projects/iso-rpg-engine/source/data/blades/SpriteSheet.hx @@ -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 {} diff --git a/projects/iso-rpg-engine/source/data/blades/SpriteSheet.kiss b/projects/iso-rpg-engine/source/data/blades/SpriteSheet.kiss new file mode 100644 index 00000000..b3405369 --- /dev/null +++ b/projects/iso-rpg-engine/source/data/blades/SpriteSheet.kiss @@ -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) \ No newline at end of file