diff --git a/source/funkin/editors/character/CharacterEditor.hx b/source/funkin/editors/character/CharacterEditor.hx index 79d54eff..87705290 100644 --- a/source/funkin/editors/character/CharacterEditor.hx +++ b/source/funkin/editors/character/CharacterEditor.hx @@ -170,13 +170,14 @@ class CharacterEditor extends UIState { null, { label: "Character Hitbox?", + onSelect: _view_character_show_hitbox, + icon: Options.characterHitbox ? 1 : 0 }, { label: "Character Camera?", - }, - { - label: "Visible BG Grid?", - }, + onSelect: _view_character_show_camera, + icon: Options.characterCamera ? 1 : 0 + } ] }, { @@ -215,6 +216,9 @@ class CharacterEditor extends UIState { character.debugMode = true; character.cameras = [charCamera]; + character.debugHitbox = Options.characterHitbox; + character.debugCamera = Options.characterCamera; + add(character); uiGroup.cameras = [uiCamera]; @@ -402,12 +406,22 @@ class CharacterEditor extends UIState { __camZoom = Math.pow(2, zoom); } + function _view_character_show_hitbox(t) { + t.icon = (Options.characterHitbox = !Options.characterHitbox) ? 1 : 0; + character.debugHitbox = Options.characterHitbox; + } + + function _view_character_show_camera(t) { + t.icon = (Options.characterCamera = !Options.characterCamera) ? 1 : 0; + character.debugCamera = Options.characterCamera; + } + function _view_focus_character(_) { if (character == null) return; var characterMidpoint:FlxPoint = character.getMidpoint(); characterMidpoint.x -= (FlxG.width/2)-character.globalOffset.x; - characterMidpoint.y -= (FlxG.height/2)-character.globalOffset.y+(23/4); + characterMidpoint.y -= (FlxG.height/2)-character.globalOffset.y; _nextScroll.set(characterMidpoint.x, characterMidpoint.y); characterMidpoint.put(); } diff --git a/source/funkin/game/Character.hx b/source/funkin/game/Character.hx index 3dc833d0..8b6857ab 100644 --- a/source/funkin/game/Character.hx +++ b/source/funkin/game/Character.hx @@ -1,5 +1,7 @@ package funkin.game; +import flixel.util.FlxSpriteUtil; +import openfl.display.Graphics; import flixel.util.typeLimit.OneOfTwo; import flixel.graphics.frames.FlxFrame; import flixel.math.FlxPoint; @@ -201,6 +203,57 @@ class Character extends FunkinSprite implements IBeatReceiver implements IOffset scale.x *= -1; __reverseDrawProcedure = false; } else super.draw(); + + if (debugHitbox) drawHitbox(); + if (debugCamera) drawCamera(); + } + + public var debugHitbox:Bool = false; + public var debugCamera:Bool = false; + + public function drawHitbox() { + if (_matrix == null || frame == null) return; + + for (camera in cameras) { + var gfx:Graphics = FlxG.renderBlit ? { + FlxSpriteUtil.flashGfx.clear(); + FlxSpriteUtil.flashGfx; + } : camera.debugLayer.graphics; + + _rect.set(_matrix.tx, _matrix.ty, frame.frame.width * _matrix.a, frame.frame.height * _matrix.d); + @:privateAccess _rect = camera.transformRect(_rect); + + gfx.lineStyle(2, 0xFF00FF00, 0.75); + gfx.drawRect(_rect.x, _rect.y, _rect.width, _rect.height); + + if (FlxG.renderBlit) + camera.buffer.draw(FlxSpriteUtil.flashGfxSprite); + } + } + + public function drawCamera() { + for (camera in cameras) { + var gfx:Graphics = FlxG.renderBlit ? { + FlxSpriteUtil.flashGfx.clear(); + FlxSpriteUtil.flashGfx; + } : camera.debugLayer.graphics; + + var camPos:FlxPoint = getCameraPosition(); + camPos -= camera.scroll; + + gfx.lineStyle(2, 0xFF00FF00, 0.75); + + gfx.moveTo(camPos.x - 8, camPos.y); + gfx.lineTo(camPos.x + 8, camPos.y); + + gfx.moveTo(camPos.x, camPos.y - 8); + gfx.lineTo(camPos.x, camPos.y + 8); + + camPos.put(); + + if (FlxG.renderBlit) + camera.buffer.draw(FlxSpriteUtil.flashGfxSprite); + } } public var singAnims = ["singLEFT", "singDOWN", "singUP", "singRIGHT"]; diff --git a/source/funkin/options/Options.hx b/source/funkin/options/Options.hx index 972ff69c..bdf767f7 100644 --- a/source/funkin/options/Options.hx +++ b/source/funkin/options/Options.hx @@ -68,6 +68,13 @@ class Options public static var charterAutoSaveWarningTime:Float = 5; public static var charterAutoSavesSeperateFolder:Bool = false; + /** + * CHARACTER EDITOR + */ + public static var stageSelected:String = null; + public static var characterHitbox:Bool = true; + public static var characterCamera:Bool = true; + /** * PLAYER 1 CONTROLS */