diff --git a/hGameTest/src/Main.hx b/hGameTest/src/Main.hx index 2713883b..20befa04 100644 --- a/hGameTest/src/Main.hx +++ b/hGameTest/src/Main.hx @@ -27,7 +27,6 @@ class Main extends Sprite { stage.addEventListener(KeyboardEvent.KEY_UP,Input.onKeyIsUp); stage.addEventListener(Event.RESIZE,onResize); game.onInit(); - //Mode.setVideoMode(1280, 960); } private function onResize (event:Event):Void { diff --git a/hGameTest/src/engine/ConVar.hx b/hGameTest/src/engine/ConVar.hx index 3f0c6b11..5ff916f5 100644 --- a/hGameTest/src/engine/ConVar.hx +++ b/hGameTest/src/engine/ConVar.hx @@ -1,10 +1,10 @@ package engine; import haxe.Constraints.Function; -import engine.typedefs.CVar; -import engine.typedefs.CCmd; -import engine.enums.CVarType; -import engine.enums.CVarFlag; +import engine.typedefs.console.CVar; +import engine.typedefs.console.CCmd; +import engine.enums.console.CVarType; +import engine.enums.console.CVarFlag; import game.ui.console.Console; diff --git a/hGameTest/src/engine/HProfiler.hx b/hGameTest/src/engine/HProfiler.hx index 0e98876c..21fe2fa2 100644 --- a/hGameTest/src/engine/HProfiler.hx +++ b/hGameTest/src/engine/HProfiler.hx @@ -3,6 +3,7 @@ package engine; import game.ui.console.Console; import Sys; +#if sys class HProfiler{ public static var profilerList:Array = []; public static var profilerMap:Map = []; @@ -38,4 +39,10 @@ class HProfiler{ Console.devMsg(profiler.name + ": " + profiler.tDelta + "ms"); } }); -} \ No newline at end of file +} +#else +class HProfiler{ + public static function startProfiling(name:String):Void{} + public static function stopProfiling(name:String):Void{} +} +#end diff --git a/hGameTest/src/engine/enums/CVarType.hx b/hGameTest/src/engine/enums/CVarType.hx deleted file mode 100644 index a4c22040..00000000 --- a/hGameTest/src/engine/enums/CVarType.hx +++ /dev/null @@ -1,8 +0,0 @@ -package engine.enums; - -enum CVarType { - CInt; - CFloat; - CString; - CBool; -} \ No newline at end of file diff --git a/hGameTest/src/engine/enums/CVarFlag.hx b/hGameTest/src/engine/enums/console/CVarFlag.hx similarity index 75% rename from hGameTest/src/engine/enums/CVarFlag.hx rename to hGameTest/src/engine/enums/console/CVarFlag.hx index cf74e1fd..56ee8e16 100644 --- a/hGameTest/src/engine/enums/CVarFlag.hx +++ b/hGameTest/src/engine/enums/console/CVarFlag.hx @@ -1,4 +1,4 @@ -package engine.enums; +package engine.enums.console; enum CVarFlag{ FCVAR_ARCHIVE; diff --git a/hGameTest/src/engine/CVarType.hx b/hGameTest/src/engine/enums/console/CVarType.hx similarity index 60% rename from hGameTest/src/engine/CVarType.hx rename to hGameTest/src/engine/enums/console/CVarType.hx index 8c4ad77c..82f21455 100644 --- a/hGameTest/src/engine/CVarType.hx +++ b/hGameTest/src/engine/enums/console/CVarType.hx @@ -1,9 +1,9 @@ -package engine; +package engine.enums.console; enum CVarType { CInt; CFloat; CString; CBool; - CCmd; + //CCmd; } \ No newline at end of file diff --git a/hGameTest/src/engine/geom/Geom.hx b/hGameTest/src/engine/geom/Geom.hx new file mode 100644 index 00000000..22cd7308 --- /dev/null +++ b/hGameTest/src/engine/geom/Geom.hx @@ -0,0 +1,7 @@ +package engine.geom; + + +typedef P2d = { + x:Float, + y:Float +} \ No newline at end of file diff --git a/hGameTest/src/engine/tools/ToolWindow.hx b/hGameTest/src/engine/tools/ToolWindow.hx new file mode 100644 index 00000000..32a98e81 --- /dev/null +++ b/hGameTest/src/engine/tools/ToolWindow.hx @@ -0,0 +1,19 @@ +package engine.tools; + +import openfl.display.Sprite; +import openfl.display.Window; + +class ToolWindow extends Sprite{ + public var window:Window; + public function new(){ + super(); + + } + //public function open() + + + + + + +} \ No newline at end of file diff --git a/hGameTest/src/engine/tools/ui/UITool.hx b/hGameTest/src/engine/tools/ui/UITool.hx new file mode 100644 index 00000000..17977d22 --- /dev/null +++ b/hGameTest/src/engine/tools/ui/UITool.hx @@ -0,0 +1,48 @@ +package engine.tools.ui; + +import openfl.text.TextField; +import engine.ui.UIPane; +import lime.app.Event; +import openfl.display.Sprite; +import openfl.Lib; +import lime.ui.Window; +import engine.ConVar; +import game.ui.console.Console; +//import Lib.application. + +class UITool{ + public static var ccmd_dev_uitool = ConVar.registerCCmd("dev_uitool", (args:Array) -> { open();}); + public static var uiEditorWindow:openfl.display.Window; + public static var uiEditorSprite:Sprite; + public static function spawnUIEditorWindow(){ + var secondWindow = Lib.application.createWindow({title: "UI Outliner"}); + if(uiEditorSprite == null){ + uiEditorSprite = new Sprite(); + uiEditorSprite.graphics.beginFill(0x00ff00); + uiEditorSprite.graphics.drawRect(0,0,1280,960); + } + secondWindow.stage.addChild(uiEditorSprite); + uiEditorWindow = secondWindow; + secondWindow.onClose.add(()->{ + uiEditorWindow = null; + }); + var tf:TextField = new TextField(); + for(pane in UIPane.panelist){ + //check if pane is toplevel + Console.devMsg("Pane: "+ pane.name); + if(pane.parent == null){ + tf.appendText(pane.name+" \n "); + } + } + uiEditorSprite.addChild(tf); + } + public static function open(){ + if(uiEditorWindow == null){ + spawnUIEditorWindow(); + } + + } + public static function close(){ + + } +} \ No newline at end of file diff --git a/hGameTest/src/engine/typedefs/CCmd.hx b/hGameTest/src/engine/typedefs/console/CCmd.hx similarity index 57% rename from hGameTest/src/engine/typedefs/CCmd.hx rename to hGameTest/src/engine/typedefs/console/CCmd.hx index 4c50418e..34a599c8 100644 --- a/hGameTest/src/engine/typedefs/CCmd.hx +++ b/hGameTest/src/engine/typedefs/console/CCmd.hx @@ -1,6 +1,6 @@ -package engine.typedefs; +package engine.typedefs.console; -import engine.typedefs.CVar; +import engine.typedefs.console.CVar; typedef CCmd = { diff --git a/hGameTest/src/engine/typedefs/CVar.hx b/hGameTest/src/engine/typedefs/console/CVar.hx similarity index 70% rename from hGameTest/src/engine/typedefs/CVar.hx rename to hGameTest/src/engine/typedefs/console/CVar.hx index a7826e27..269b524e 100644 --- a/hGameTest/src/engine/typedefs/CVar.hx +++ b/hGameTest/src/engine/typedefs/console/CVar.hx @@ -1,7 +1,7 @@ -package engine.typedefs; +package engine.typedefs.console; -import engine.enums.CVarType; -import engine.enums.CVarFlag; +import engine.enums.console.CVarType; +import engine.enums.console.CVarFlag; typedef CVar = { var name:String; diff --git a/hGameTest/src/game/ui/UIElement.hx b/hGameTest/src/engine/ui/UIElement.hx similarity index 89% rename from hGameTest/src/game/ui/UIElement.hx rename to hGameTest/src/engine/ui/UIElement.hx index e9a1ce68..a95f9a4f 100644 --- a/hGameTest/src/game/ui/UIElement.hx +++ b/hGameTest/src/engine/ui/UIElement.hx @@ -1,8 +1,8 @@ -package game.ui; +package engine.ui; -import game.ui.UIPane.P2d; +import engine.geom.Geom.P2d; +import engine.ui.UIPane.PaneDimensions; import openfl.display.DisplayObject; -import game.ui.UIPane.PaneDimensions; class UIElement extends UIPane { diff --git a/hGameTest/src/engine/ui/UIPane.hx b/hGameTest/src/engine/ui/UIPane.hx new file mode 100644 index 00000000..c03336dc --- /dev/null +++ b/hGameTest/src/engine/ui/UIPane.hx @@ -0,0 +1,331 @@ +package engine.ui; + +// __ __ _____ ______ +// | | | | / ___ \ | ____| +// | |____| | | / _\_| | |____ +// | ____ | | | |_ \ | ____| +// | | | | | \__/ | | |____ +// |__| |__| \______/ |______| +// file: UIPane.hx +// author: and.schaafsma@gmail.com +// purpose: Class for resizable and scalable UI Panels +// My hope is that this code is so awful I'm never allowed to write UI code again. +import game.ui.console.Console; +import openfl.display.Sprite; +import openfl.display.BitmapData; +import openfl.display.DisplayObject; +import openfl.text.TextField; +import engine.ConVar; +import engine.geom.Geom.P2d; + +@:enum abstract PaneLayout(Int) { + var HORIZONTAL = 0; + var VERTICAL = 1; +} + +enum PaneAnchor { + LEFT; + TOPLEFT; + TOP; + TOPRIGHT; + RIGHT; + BOTTOMLEFT; + BOTTOM; + BOTTOMRIGHT; +} + +enum ExpandBehavior { + // ABSOLUTE; + FACTOR(f:Float); + // CONTENT; + STRETCH; + // FILL; + // FIT; + NONE; +} + +enum PaneAlign { + START; + END; +} + +typedef PaneDimensions = { + var width:Float; + var height:Float; + @:optional var expandBehavior:ExpandBehavior; + @:optional var minWidth:Float; + @:optional var minHeight:Float; + @:optional var maxWidth:Float; + @:optional var maxHeight:Float; +} + +typedef PaneProps = { + dimensions:PaneDimensions, + layout:PaneLayout +} + +class UIPane { + public var name:String; + public var sprite:Sprite; + public var x(get, set):Float; + public var y(get, set):Float; + + function get_x() { + return sprite.x; + } + + function set_x(x) { + return sprite.x = x; + } + + function get_y() { + return sprite.y; + } + + function set_y(y) { + return sprite.y = y; + } + + public var dimensions:PaneDimensions; + public var width(get, set):Float; + + function get_width() { + return dimensions.width; + } + + function set_width(width) { + dimensions.width = width; + onResize(); + return width; + } + + public var height(get, set):Float; + + function get_height() { + return dimensions.height; + } + + function set_height(height) { + dimensions.height = height; + onResize(); + return height; + } + + public var layout:PaneLayout; + public var autoArrange:Bool = true; + public var autoArrangeChildren = true; + public var expand:Bool; + public var children:Array = []; + public var parent:UIPane = null; + public var align:PaneAlign = START; + public var maskSprite:Sprite; + + public static var panelist:Array = []; + + public function new(_name:String, _dimensions:PaneDimensions) { + // Set name + name = _name; + // Set dimensions + if (_dimensions != null) { + dimensions = _dimensions; + } else { + dimensions = { + width: 0, + height: 0, + minWidth: 0, + minHeight: 0, + maxWidth: 0, + maxHeight: 0 + }; + } + if (name == null || name == "") { + Console.devMsg("UI Pane name init error"); + } + // Initialize Sprite + initSprite(); + // Draw debug pane for visualizing + drawDebugPane(); + panelist.push(this); + } + + public static var ccmd_ui_redraw = ConVar.registerCCmd("ui_redraw", (args:Array) -> { + redrawUIPanes(); + }); + + public static function redrawUIPanes() { + for (pane in panelist) { + pane.redraw(); + } + } + + public function getAnchorOffset(anchor:PaneAnchor):P2d { + switch (anchor) { + case LEFT: + return {x: 0, y: (height / 2)}; + case TOPLEFT: + return {x: 0, y: 0}; + case TOP: + return {x: width / 2, y: 0}; + case TOPRIGHT: + return {x: width, y: 0}; + case RIGHT: + return {x: width, y: height / 2} + case BOTTOMRIGHT: + return {x: width, y: height}; + case BOTTOM: + return {x: width / 2, y: height}; + case BOTTOMLEFT: + return {x: 0, y: height}; + } + } + + public function initSprite():Void { + // Construct Sprite object + sprite = new Sprite(); + + // Draw mask + maskSprite = new Sprite(); + drawMask(); + sprite.addChild(maskSprite); + sprite.mask = maskSprite; + } + + public function drawMask():Void { + maskSprite.graphics.clear(); + maskSprite.graphics.beginFill(0xffffff); + maskSprite.graphics.drawRect(0, 0, width, height); + } + + public function drawDebugPane() { + // Clear graphics + sprite.graphics.clear(); + // Create objects we need to draw. + var label:TextField = new TextField(); + var bmp = new BitmapData(Std.int(width), Std.int(height), true, 0x00000000); + // Set textfield text to the panel name + label.text = name; + // Draw textfield to bitmap + bmp.draw(label); + // Draw graphics + sprite.graphics.beginFill(Std.int(Math.random() * 0xffffff), 0.5); + sprite.graphics.drawRect(0, 0, dimensions.width, dimensions.height); + sprite.graphics.beginBitmapFill(bmp, null); + sprite.graphics.drawRect(0, 0, dimensions.width, dimensions.height); + // Visualize Anchor Points + if (false) { + sprite.graphics.beginFill(Std.int(Math.random() * 0xffffff), 0.5); + sprite.graphics.drawCircle(getAnchorOffset(TOPLEFT).x, getAnchorOffset(TOPLEFT).y, 5); + sprite.graphics.drawCircle(getAnchorOffset(TOP).x, getAnchorOffset(TOP).y, 5); + sprite.graphics.drawCircle(getAnchorOffset(TOPRIGHT).x, getAnchorOffset(TOPRIGHT).y, 5); + sprite.graphics.drawCircle(getAnchorOffset(RIGHT).x, getAnchorOffset(RIGHT).y, 5); + sprite.graphics.drawCircle(getAnchorOffset(BOTTOMRIGHT).x, getAnchorOffset(BOTTOMRIGHT).y, 5); + sprite.graphics.drawCircle(getAnchorOffset(BOTTOM).x, getAnchorOffset(BOTTOM).y, 5); + sprite.graphics.drawCircle(getAnchorOffset(BOTTOMLEFT).x, getAnchorOffset(BOTTOMLEFT).y, 5); + sprite.graphics.drawCircle(getAnchorOffset(LEFT).x, getAnchorOffset(LEFT).y, 5); + } + } + + public var endOffset:Float = 0; + public var startOffset:Float = 0; + + public function addChild(child:UIPane) { + if (child.parent != null) + throw "Attempting to attach child UIPane that already has a parent"; + children.push(child); + sprite.addChild(child.sprite); + child.parent = this; + if (child.autoArrange && autoArrangeChildren) { + arrangeChild(child); + } + return child; + } + + public function redraw():Void { + drawDebugPane(); + drawMask(); + } + + public function onResize() { + redraw(); + if (autoArrangeChildren) { + arrangeChildren(); + } + } + + private function arrangeChild(child:UIPane) { + // We do not arrange the + if (!child.autoArrange) { + return; + } + if (endOffset == 0) { + switch (layout) { + case HORIZONTAL: + endOffset = width; + case VERTICAL: + endOffset = height; + } + } + var offsetDiff:Float = endOffset - startOffset; + // Set child dimensions + switch (child.dimensions.expandBehavior) { + case STRETCH: + switch (layout) { + case HORIZONTAL: + child.width = offsetDiff; + child.height = height; + case VERTICAL: + child.width = width; + child.height = offsetDiff; + } + case FACTOR(f): + switch (layout) { + case HORIZONTAL: + child.width = width * f; + child.height = height; + case VERTICAL: + child.width = width; + child.height = height * f; + } + default: + switch (layout) { + case HORIZONTAL: + // do some shit + child.height = height; + case VERTICAL: + // do some other shit + child.width = width; + default: + child.height = child.height; + } + } + // Set child position + switch (child.align) { + case START: + switch (layout) { + case HORIZONTAL: + child.x = startOffset; + startOffset += child.width; + case VERTICAL: + child.y = startOffset; + startOffset += child.height; + } + case END: + switch (layout) { + case HORIZONTAL: + child.x = endOffset -= child.width; + case VERTICAL: + child.y = endOffset -= child.height; + } + } + } + + public function arrangeChildren() { + // reset offsets + startOffset = 0; + endOffset = 0; + // arrance each child + for (child in children) { + arrangeChild(child); + } + } +} diff --git a/hGameTest/src/game/Game.hx b/hGameTest/src/game/Game.hx index 918c98c9..a6814009 100644 --- a/hGameTest/src/game/Game.hx +++ b/hGameTest/src/game/Game.hx @@ -1,18 +1,23 @@ package game; -import engine.HProfiler; -import game.ui.console.ConsolePane; -import game.ui.UIPane; -import engine.typedefs.CVar; -import game.entities.Player; import openfl.display.Stage; import openfl.display.Sprite; import openfl.events.Event; -import assets.Scanner; -import assets.HTex; + +import engine.HProfiler; import engine.ConVar; +import engine.ui.UIPane; +import engine.typedefs.console.CVar; +import engine.tools.ui.UITool; + +import game.ui.console.ConsolePane; +import game.entities.Player; import game.ui.console.Console; + +import assets.HTex; +import assets.Scanner; + class Game { public var stage:Stage; @@ -20,12 +25,12 @@ class Game public var uiLayer:Sprite; public function new(_stage:Stage){ stage = _stage; - /* +#if PRECACHE_ASSETS & sys Scanner.scanTextureDir(); for(tex in Scanner.textures){ HTex.createTextureObjectFromJSON(tex); } - */ +#end gameLayer = new Sprite(); uiLayer = new Sprite(); trace("wattafak"); @@ -46,6 +51,7 @@ class Game uiLayer.addChild(console2); uiLayer.addChild(console); HProfiler.startProfiling("frametime"); + //UITool.spawnUIEditorWindow(); } public function onEnterFrame(e:Event):Void { diff --git a/hGameTest/src/game/Input.hx b/hGameTest/src/game/Input.hx index 58447631..1e1cdf6c 100644 --- a/hGameTest/src/game/Input.hx +++ b/hGameTest/src/game/Input.hx @@ -1,17 +1,19 @@ package game; import openfl.text.TextField; -import engine.enums.CVarFlag; -import engine.typedefs.CCmd; -import game.ui.console.Console; -import game.video.Mode; import openfl.events.KeyboardEvent; import openfl.ui.Keyboard in Kb; import openfl.Lib; -import engine.enums.CVarType; -import engine.typedefs.CVar; + +import engine.enums.console.CVarFlag; +import engine.enums.console.CVarType; +import engine.typedefs.console.CCmd; +import engine.typedefs.console.CVar; import engine.ConVar; +import game.ui.console.Console; +import game.video.Mode; + class Input{ public static var keys:Map = []; public static var keysLast:Map = []; @@ -44,7 +46,9 @@ class Input{ }); public static function onKeyIsDown(e:KeyboardEvent){ if(!Std.isOfType(Lib.current.stage.focus,TextField)){ - Console.consoleInstance.parseCmd(bindMap[keyNameMap[e.keyCode]]); + // Check if not null so we don't end up cooming all over unallocated memory; + if(bindMap[keyNameMap[e.keyCode]] != null) + Console.consoleInstance.parseCmd(bindMap[keyNameMap[e.keyCode]]); } if(!keys[e.keyCode]){ if(cv_debugKeys.value == 1) @@ -59,8 +63,11 @@ class Input{ } public static function onKeyIsUp(e:KeyboardEvent){ if(!Std.isOfType(Lib.current.stage.focus,TextField)){ - if(bindMap[keyNameMap[e.keyCode]].indexOf("+") == 0){ - Console.consoleInstance.parseCmd(StringTools.replace(bindMap[keyNameMap[e.keyCode]],"+","-")); + // Make sure we're not checking a null value (this can cause a crash) + if(bindMap[keyNameMap[e.keyCode]] != null){ + if(bindMap[keyNameMap[e.keyCode]].indexOf("+") == 0){ + Console.consoleInstance.parseCmd(StringTools.replace(bindMap[keyNameMap[e.keyCode]],"+","-")); + } } } keys[e.keyCode] = false; diff --git a/hGameTest/src/game/ui/UIPane.hx b/hGameTest/src/game/ui/UIPane.hx deleted file mode 100644 index 0287b598..00000000 --- a/hGameTest/src/game/ui/UIPane.hx +++ /dev/null @@ -1,304 +0,0 @@ -package game.ui; - -// __ __ _____ ______ -// | | | | / ___ \ | ____| -// | |____| | | / _\_| | |____ -// | ____ | | | |_ \ | ____| -// | | | | | \__/ | | |____ -// |__| |__| \______/ |______| -// file: UIPane.hx -// author: and.schaafsma@gmail.com -// purpose: Class for resizable and scalable UI Panels - -import openfl.display.Sprite; -import openfl.display.BitmapData; -import openfl.display.DisplayObject; -import openfl.text.TextField; -import engine.ConVar; - -typedef P2d = { - x:Float, - y:Float -} -@:enum abstract PaneLayout(Int){ - var HORIZONTAL = 0; - var VERTICAL = 1; -} -enum PaneAnchor{ - LEFT; - TOPLEFT; - TOP; - TOPRIGHT; - RIGHT; - BOTTOMLEFT; - BOTTOM; - BOTTOMRIGHT; -} -enum ExpandBehavior{ - ABSOLUTE; - FACTOR(f:Float); - CONTENT; - STRETCH; - FILL; - FIT; - NONE; -} -enum PaneAlign{ - START; - END; -} - -typedef PaneDimensions = { - var width:Float; - var height:Float; - @:optional var expandBehavior:ExpandBehavior; - @:optional var minWidth:Float; - @:optional var minHeight:Float; - @:optional var maxWidth:Float; - @:optional var maxHeight:Float; -} - -typedef PaneProps = { - dimensions:PaneDimensions, - layout:PaneLayout -} - -class UIPane{ - public var name:String; - public var sprite:Sprite; - public var x(get, set):Float; - public var y(get, set):Float; - function get_x(){ return sprite.x; } - function set_x(x){ return sprite.x = x; } - function get_y(){ return sprite.y; } - function set_y(y){ return sprite.y = y; } - public var dimensions:PaneDimensions; - public var width(get,set):Float; - function get_width(){ - return dimensions.width; - } - function set_width(width){ - dimensions.width = width; - onResize(); - return width; - } - public var height(get,set):Float; - function get_height(){ - return dimensions.height; - } - function set_height(height){ - dimensions.height = height; - onResize(); - return height; - } - public var layout:PaneLayout; - public var autoArrange:Bool = true; - public var autoArrangeChildren = true; - public var expand:Bool; - public var children:Array = []; - public var parent:UIPane = null; - public var align:PaneAlign = START; - public var maskSprite:Sprite; - - public static var panelist:Array = []; - public function new(_name:String, _dimensions:PaneDimensions) - { - // Set name - name = _name; - // Set dimensions - if(_dimensions != null){ - dimensions = _dimensions; - } - else{ - dimensions = { - width: 0, - height: 0, - minWidth: 0, - minHeight: 0, - maxWidth: 0, - maxHeight: 0 - }; - } - - // Initialize Sprite - initSprite(); - // Draw debug pane for visualizing - drawDebugPane(); - panelist.push(this); - } - - public static var ccmd_ui_redraw = ConVar.registerCCmd("ui_redraw", (args:Array) -> { redrawUIPanes();}); - public static function redrawUIPanes(){ - for (pane in panelist){ - pane.redraw(); - } - } - - - public function getAnchorOffset(anchor:PaneAnchor):P2d - { - switch(anchor){ - case LEFT: - return {x:0,y:(height/2)}; - case TOPLEFT: - return {x:0, y:0}; - case TOP: - return {x:width/2,y:0}; - case TOPRIGHT: - return {x:width, y:0}; - case RIGHT: - return {x:width, y:height/2} - case BOTTOMRIGHT: - return {x:width, y:height}; - case BOTTOM: - return {x:width/2, y:height}; - case BOTTOMLEFT: - return {x:0, y:height}; - } - } - public function initSprite():Void - { - - // Construct Sprite object - sprite = new Sprite(); - - // Draw mask - maskSprite = new Sprite(); - drawMask(); - sprite.addChild(maskSprite); - sprite.mask = maskSprite; - } - - public function drawMask():Void - { - maskSprite.graphics.clear(); - maskSprite.graphics.beginFill(0xffffff); - maskSprite.graphics.drawRect(0,0,width,height); - } - - - public function drawDebugPane() - { - // Clear graphics - sprite.graphics.clear(); - // Create objects we need to draw. - var label:TextField = new TextField(); - var bmp = new BitmapData(Std.int(width),Std.int(height),true,0x00000000); - // Set textfield text to the panel name - label.text = name; - // Draw textfield to bitmap - bmp.draw(label); - // Draw graphics - sprite.graphics.beginFill(Std.int(Math.random()*0xffffff),0.5); - sprite.graphics.drawRect(0,0,dimensions.width,dimensions.height); - sprite.graphics.beginBitmapFill(bmp,null); - sprite.graphics.drawRect(0,0,dimensions.width,dimensions.height); - //Visualize Anchor Points - if(false){ - sprite.graphics.beginFill(Std.int(Math.random()*0xffffff),0.5); - sprite.graphics.drawCircle(getAnchorOffset(TOPLEFT).x, getAnchorOffset(TOPLEFT).y, 5); - sprite.graphics.drawCircle(getAnchorOffset(TOP).x, getAnchorOffset(TOP).y, 5); - sprite.graphics.drawCircle(getAnchorOffset(TOPRIGHT).x, getAnchorOffset(TOPRIGHT).y, 5); - sprite.graphics.drawCircle(getAnchorOffset(RIGHT).x, getAnchorOffset(RIGHT).y, 5); - sprite.graphics.drawCircle(getAnchorOffset(BOTTOMRIGHT).x, getAnchorOffset(BOTTOMRIGHT).y, 5); - sprite.graphics.drawCircle(getAnchorOffset(BOTTOM).x, getAnchorOffset(BOTTOM).y, 5); - sprite.graphics.drawCircle(getAnchorOffset(BOTTOMLEFT).x, getAnchorOffset(BOTTOMLEFT).y, 5); - sprite.graphics.drawCircle(getAnchorOffset(LEFT).x, getAnchorOffset(LEFT).y, 5); - } - } - public var endOffset:Float = 0; - public var startOffset:Float = 0; - public function addChild(child:UIPane) - { - if(child.parent != null) - throw "Attempting to attach child UIPane that already has a parent"; - children.push(child); - sprite.addChild(child.sprite); - child.parent = this; - if(child.autoArrange && autoArrangeChildren){ - arrangeChild(child); - } - return child; - } - public function redraw():Void - { - drawDebugPane(); - drawMask(); - } - public function onResize(){ - redraw(); - if(autoArrangeChildren){ - arrangeChildren(); - } - } - private function arrangeChild(child:UIPane){ - // We do not arrange the - if(!child.autoArrange){ - return; - } - if(endOffset == 0){ - switch(layout){ - case HORIZONTAL: - endOffset = width; - case VERTICAL: - endOffset = height; - } - } - var offsetDiff:Float = endOffset - startOffset; - // Set child dimensions - switch(child.dimensions.expandBehavior){ - case STRETCH: - switch(layout){ - case HORIZONTAL: - child.width = offsetDiff; - child.height = height; - case VERTICAL: - child.width = width; - child.height = offsetDiff; - } - case FACTOR(f): - switch(layout){ - case HORIZONTAL: - child.width = width*f; - child.height = height; - case VERTICAL: - child.width = width; - child.height = height*f; - } - default: - switch(layout){ - default: - child.height = child.height; - } - } - // Set child position - switch(child.align){ - case START: - switch (layout){ - case HORIZONTAL: - child.x = startOffset; - startOffset += child.width; - case VERTICAL: - child.y = startOffset; - startOffset += child.height; - } - case END: - switch(layout){ - case HORIZONTAL: - child.x = endOffset -= child.width; - case VERTICAL: - child.y = endOffset -= child.height; - } - } - } - public function arrangeChildren(){ - // reset offsets - startOffset = 0; - endOffset = 0; - // arrance each child - for(child in children){ - arrangeChild(child); - } - } - -} diff --git a/hGameTest/src/game/ui/console/Console.hx b/hGameTest/src/game/ui/console/Console.hx index d211ec43..082ad0ec 100644 --- a/hGameTest/src/game/ui/console/Console.hx +++ b/hGameTest/src/game/ui/console/Console.hx @@ -1,6 +1,5 @@ package game.ui.console; -import engine.enums.CVarFlag; import game.ui.text.TextFormats; import assets.Fonts; import openfl.Lib; @@ -11,11 +10,12 @@ import openfl.display.Sprite; import openfl.Assets; import openfl.text.TextFormat; import openfl.text.TextFieldType; -import engine.typedefs.CVar; import engine.ConVar; -import engine.typedefs.CCmd; +import engine.enums.console.CVarFlag; +import engine.typedefs.console.CVar; +import engine.typedefs.console.CCmd; import game.ui.console.elements.ConsoleInput; - +import engine.ui.UIPane; class Console extends Sprite{ @@ -161,16 +161,22 @@ class Console extends Sprite{ } public function execCommands(commands:Array>){ for(command in commands){ + // Store command name, value and args var cName:String = command[0]; var cValue:String = command[1]; var cArgs:Array = command.slice(1); + //Check if convar with that name actually exists if(ConVar.isCVar(cName)){ + //Get reference to convar object var cv:CVar = ConVar.getCVar(command[0]); + //Check number of params if(command.length == 1){ + //No params after the cmd, print help string devMsg(cv.name+" - "+cv.helpString); devMsg(cv.name+" = "+cv.value); } else{ + //Check for convar type and set value accordingly switch(cv.type){ case CInt: ConVar.setCVar(cName,Std.parseInt(cValue)); @@ -196,9 +202,11 @@ class Console extends Sprite{ } } + //convar is actually a command, run it. else if(ConVar.isCmd(cName)){ ConVar.runCmd(cName,cArgs); } + //convar doesn't exist else{ devMsg("unkown command: "+command[0]); } diff --git a/hGameTest/src/game/ui/console/ConsolePane.hx b/hGameTest/src/game/ui/console/ConsolePane.hx index 2605a5c7..99fe5910 100644 --- a/hGameTest/src/game/ui/console/ConsolePane.hx +++ b/hGameTest/src/game/ui/console/ConsolePane.hx @@ -1,6 +1,8 @@ package game.ui.console; import engine.HProfiler; +import engine.ui.UIPane; +import engine.ui.UIElement; import openfl.text.TextField; import openfl.display3D.textures.Texture; import openfl.display.Sprite; @@ -29,7 +31,7 @@ class ConsolePane extends Sprite{ testPane.addChild(titlebarPane); testPane.addChild(inputPane); testPane.addChild(outputPane); - + var textField:TextField = new TextField(); @@ -39,10 +41,20 @@ class ConsolePane extends Sprite{ var testInputElement:UIElement = new UIElement("inputelem", {height: 32, width: 300},textField); testInputElement.dimensions.expandBehavior = STRETCH; testInputElement.padding = {x: 8, y: 8}; - var inputFieldPane:UIPane = new UIPane("input field", {height: 32, width: 3}); - var inputButtonPane:UIPane = new UIPane("submit button", {height: 32, width: 32}); - inputPane.addChild(testInputElement); + var inputButtonPane:UIPane = new UIPane("submit button", {height: 32, width: 32}); + inputButtonPane.align = END; + + var inputFieldPane:UIPane = new UIPane("input field", {height: 32, width: 3}); + inputFieldPane.align = START; + inputFieldPane.dimensions.expandBehavior = STRETCH; + + inputPane.addChild(inputButtonPane); + inputPane.addChild(inputFieldPane); + //inputFieldPane.addChild(testInputElement); + + + diff --git a/hGameTest/src/game/video/Mode.hx b/hGameTest/src/game/video/Mode.hx index eacb9c22..5b1d2bf5 100644 --- a/hGameTest/src/game/video/Mode.hx +++ b/hGameTest/src/game/video/Mode.hx @@ -1,6 +1,7 @@ package game.video; import engine.ConVar; +import engine.typedefs.console.CCmd; import openfl.Lib; import openfl.display.StageDisplayState; @@ -14,6 +15,9 @@ class Mode public static function setVideoMode(width:Int, height:Int, fs:Int = null){ getWindow().resize(width,height); } + public static var cvMatSetVideoMode:CCmd = ConVar.registerCCmd("mat_setvideomode",(args:Array)->{ + setVideoMode(Std.parseInt(args[0]), Std.parseInt(args[1]), Std.parseInt(args[2])); + }); public static function switchFsMode(toState:Int = 0){ if(toState == 0){ if(Lib.current.stage.displayState != StageDisplayState.FULL_SCREEN_INTERACTIVE){