From a07bdb6b9914a5fc1a1df9665f77b70706aef3bc Mon Sep 17 00:00:00 2001 From: andreas Date: Sat, 19 Jun 2021 18:12:24 +0200 Subject: [PATCH] various changes --- hGameTest/src/engine/HProfiler.hx | 41 +++++ hGameTest/src/game/Game.hx | 12 +- hGameTest/src/game/ui/UIElement.hx | 28 +++- hGameTest/src/game/ui/UIPane.hx | 162 ++++++++++++------- hGameTest/src/game/ui/console/Console.hx | 59 ++++--- hGameTest/src/game/ui/console/ConsolePane.hx | 53 ++++++ 6 files changed, 263 insertions(+), 92 deletions(-) create mode 100644 hGameTest/src/engine/HProfiler.hx create mode 100644 hGameTest/src/game/ui/console/ConsolePane.hx diff --git a/hGameTest/src/engine/HProfiler.hx b/hGameTest/src/engine/HProfiler.hx new file mode 100644 index 00000000..0e98876c --- /dev/null +++ b/hGameTest/src/engine/HProfiler.hx @@ -0,0 +1,41 @@ +package engine; + +import game.ui.console.Console; +import Sys; + +class HProfiler{ + public static var profilerList:Array = []; + public static var profilerMap:Map = []; + private var tStart:Float; + private var tEnd:Float; + public var tDelta:Float; + private var name:String; + private function new(_name:String){ + name = _name; + profilerMap[_name] = this; + } + public function start(){ + tStart = Sys.time() * 1000.0; + } + public function stop(){ + tEnd = Sys.time() * 1000.0; + tDelta = (tEnd-tStart); + } + //public static var + public static function startProfiling(name:String):Void + { + if(profilerMap[name] == null) + profilerList.push(new HProfiler(name)); + profilerMap[name].start(); + } + public static function stopProfiling(name:String):Void + { + profilerMap[name].stop(); + } + + public static var ccmd_debug_tracetimes = ConVar.registerCCmd("debug_tracetimes", (args:Array) -> { + for(profiler in profilerList){ + Console.devMsg(profiler.name + ": " + profiler.tDelta + "ms"); + } + }); +} \ No newline at end of file diff --git a/hGameTest/src/game/Game.hx b/hGameTest/src/game/Game.hx index be4cc7cc..918c98c9 100644 --- a/hGameTest/src/game/Game.hx +++ b/hGameTest/src/game/Game.hx @@ -1,5 +1,8 @@ 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; @@ -32,21 +35,22 @@ class Game public function loadData():Void { new game.ui.text.TextFormats(); - } public function onInit():Void { - gameLayer = new Sprite(); uiLayer = new Sprite(); stage.addChild(gameLayer); stage.addChild(uiLayer); + var console2:ConsolePane = new ConsolePane(); + uiLayer.addChild(console2); uiLayer.addChild(console); - //var cvar_cl_kankerlow:CVar = ConVar.registerCVar("cl_kankerlow", CInt, 10, FCVAR_ARCHIVE, "is de speler een kankerlow?",null,false,false,0,0,false); - + HProfiler.startProfiling("frametime"); } public function onEnterFrame(e:Event):Void { + HProfiler.stopProfiling("frametime"); + HProfiler.startProfiling("frametime"); Input.onEnterFrame(); } } \ No newline at end of file diff --git a/hGameTest/src/game/ui/UIElement.hx b/hGameTest/src/game/ui/UIElement.hx index 5b1ff09b..e9a1ce68 100644 --- a/hGameTest/src/game/ui/UIElement.hx +++ b/hGameTest/src/game/ui/UIElement.hx @@ -1,12 +1,30 @@ package game.ui; -import openfl.geom.Point; -import openfl.display.Sprite; +import game.ui.UIPane.P2d; +import openfl.display.DisplayObject; +import game.ui.UIPane.PaneDimensions; -class UIElement extends Sprite +class UIElement extends UIPane { - public function new(){ - super(); + public var dispObj:DisplayObject; + public var padding:P2d; + public function new(_name:String, _dimensions:PaneDimensions, _displayObject:DisplayObject) + { + super(_name, _dimensions); + dispObj = _displayObject; + sprite.addChild(dispObj); + } + override public function onResize(){ + super.onResize(); + resizeDisplayObject(); + } + public function resizeDisplayObject(){ + if(padding == null) + padding = {x:0,y:0}; + dispObj.width = this.dimensions.width - padding.x; + dispObj.height = this.dimensions.height - padding.y; + dispObj.x = padding.x / 2; + dispObj.y = padding.y / 2; } } \ No newline at end of file diff --git a/hGameTest/src/game/ui/UIPane.hx b/hGameTest/src/game/ui/UIPane.hx index 77f9b731..0287b598 100644 --- a/hGameTest/src/game/ui/UIPane.hx +++ b/hGameTest/src/game/ui/UIPane.hx @@ -1,17 +1,28 @@ 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 PaneLayout{ - HORIZONTAL; - VERTICAL; +@:enum abstract PaneLayout(Int){ + var HORIZONTAL = 0; + var VERTICAL = 1; } enum PaneAnchor{ LEFT; @@ -24,8 +35,9 @@ enum PaneAnchor{ BOTTOMRIGHT; } enum ExpandBehavior{ - FACTOR; ABSOLUTE; + FACTOR(f:Float); + CONTENT; STRETCH; FILL; FIT; @@ -87,6 +99,8 @@ class UIPane{ 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 @@ -109,8 +123,18 @@ class UIPane{ // Initialize Sprite initSprite(); // Draw debug pane for visualizing - //drawDebugPane(); - } + 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){ @@ -139,10 +163,10 @@ class UIPane{ sprite = new Sprite(); // Draw mask - //maskSprite = new Sprite(); - //drawMask(); - //sprite.addChild(maskSprite); - //sprite.mask = maskSprite; + maskSprite = new Sprite(); + drawMask(); + sprite.addChild(maskSprite); + sprite.mask = maskSprite; } public function drawMask():Void @@ -169,24 +193,25 @@ class UIPane{ sprite.graphics.drawRect(0,0,dimensions.width,dimensions.height); sprite.graphics.beginBitmapFill(bmp,null); sprite.graphics.drawRect(0,0,dimensions.width,dimensions.height); - - if(true){ + //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); - } - + 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; @@ -197,8 +222,8 @@ class UIPane{ } public function redraw():Void { - //drawDebugPane(); - //drawMask(); + drawDebugPane(); + drawMask(); } public function onResize(){ redraw(); @@ -207,49 +232,70 @@ class UIPane{ } } private function arrangeChild(child:UIPane){ - if(child.autoArrange){ + // We do not arrange the + if(!child.autoArrange){ + return; + } + if(endOffset == 0){ switch(layout){ case HORIZONTAL: - if(endOffset == 0) endOffset = width; - switch(child.dimensions.expandBehavior){ - case STRETCH: - child.width = endOffset-startOffset; - child.height = height; - default: - child.height = height; - // - } - switch(child.align){ - case START: - child.x = startOffset; - startOffset += child.width; - case END: - child.x = endOffset-= child.width; - } + endOffset = width; case VERTICAL: - if(endOffset == 0) endOffset = height; - switch(child.dimensions.expandBehavior){ - case STRETCH: - child.height = endOffset-startOffset; - child.width = width; - default: - child.width = width; - // - } - switch(child.align){ - case START: - child.y = startOffset; - startOffset += child.height; - case END: - child.y = endOffset-=child.height; - } + 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 55dd6714..d211ec43 100644 --- a/hGameTest/src/game/ui/console/Console.hx +++ b/hGameTest/src/game/ui/console/Console.hx @@ -34,9 +34,14 @@ class Console extends Sprite{ consoleInstance = this; - - graphics.beginFill(0x555555); - graphics.drawRect(0,0,800,600); + + var consolePane:UIPane = new UIPane("yeeto",{width:800, height:600}); + + this.addChild(consolePane.sprite); + consolePane.layout = VERTICAL; + + //graphics.beginFill(0x555555); + //graphics.drawRect(0,0,800,600); cInput = new ConsoleInput(); cIn = cInput.tf; @@ -51,6 +56,21 @@ class Console extends Sprite{ },false,false,0,0,false); cOut = new TextField(); + cAutoComp = new TextField(); + + drawFields(cOut, cAutoComp); + + + cOut.addEventListener(Event.CHANGE, onOutputTextChange); + cIn.addEventListener(Event.CHANGE, onInputTextChange); + this.addChild(cOut); + this.addChild(cInput); + this.addChild(cAutoComp); + ConVar.registerCCmd("echo", (args:Array) -> { Console.devMsg(args.join(" ").split('"').join(""));}); + ConVar.registerCCmd("quit", (args:Array) -> { Lib.application.window.close();}); + } + public function drawFields(cOut:TextField, cAutoComp:TextField){ + cOut.text = "hConsole Initialized\n"; cOut.defaultTextFormat = TextFormats.getFormats().cOutputFmt; cOut.wordWrap = true; @@ -63,7 +83,6 @@ class Console extends Sprite{ cOut.y = 12; cOut.x = 12; - cAutoComp = new TextField(); cAutoComp.text = ""; cAutoComp.defaultTextFormat = TextFormats.getFormats().cInputFmt; cAutoComp.wordWrap = false; @@ -78,19 +97,9 @@ class Console extends Sprite{ cAutoComp.visible = false; cAutoComp.x = 0; cAutoComp.y = 600; - - - - cOut.addEventListener(Event.CHANGE, onOutputTextChange); - cIn.addEventListener(Event.CHANGE, onInputTextChange); - //cOut.addEventListener() - this.addChild(cOut); - this.addChild(cInput); - this.addChild(cAutoComp); - //ConVar.registerCVar("echo", CVarType.CCmd, null, devMsg()) - ConVar.registerCCmd("echo", (args:Array) -> { Console.devMsg(args.join(" ").split('"').join(""));}); - ConVar.registerCCmd("quit", (args:Array) -> { Lib.application.window.close();}); } + + public function parseCmd(cmd:String, bNoHist:Bool = false){ if(!bNoHist) history.push(cmd); @@ -196,9 +205,9 @@ class Console extends Sprite{ } } public function submitInput(){ - cOut.appendText(">"+cIn.text+"\n"); - parseCmd(cIn.text); - cIn.text = ""; + cOut.appendText(">"+cInput.getText()+"\n"); + parseCmd(cInput.getText()); + cInput.setText(""); cAutoComp.visible = false; cOut.scrollV = cOut.maxScrollV; histSelect = -1; @@ -207,7 +216,7 @@ class Console extends Sprite{ cOut.scrollV = cOut.maxScrollV; } public function onInputTextChange(e:Event){ - if(cIn.text != ""){ + if(cInput.getText() != ""){ cAutoComp.text = ""; for(string in (autocompleteList = getCompList())){ cAutoComp.text += string+"\n"; @@ -245,7 +254,7 @@ class Console extends Sprite{ public static function getCompList():Array { // Split words - var inp:Array = consoleInstance.cIn.text.split(" "); + var inp:Array = consoleInstance.cInput.getText().split(" "); var inpStripped:Array = [ for(word in inp){ if(word != "" && word != " "){ @@ -292,9 +301,9 @@ class Console extends Sprite{ public static function histPrev():Void { // Only complete if input field is empty or scrolling through hist - if(consoleInstance.cIn.text == "" || histSelect != -1){ + if(consoleInstance.cInput.getText() == "" || histSelect != -1){ // Store current input in tmpInput - if(histSelect == -1) tmpInput = consoleInstance.cIn.text; + if(histSelect == -1) tmpInput = consoleInstance.cInput.getText(); // Only go through history if history is not empty if(history.length != 0){ // Check if currently selecting a history entry @@ -308,11 +317,11 @@ class Console extends Sprite{ } if(histSelect != -1){ // Put correct history entry in the input field - consoleInstance.cIn.text = history[histSelect]; + consoleInstance.cInput.setText(history[histSelect]); } else{ // Restore tmp input - consoleInstance.cIn.text = tmpInput; + consoleInstance.cInput.setText(tmpInput); } } // History is empty diff --git a/hGameTest/src/game/ui/console/ConsolePane.hx b/hGameTest/src/game/ui/console/ConsolePane.hx new file mode 100644 index 00000000..2605a5c7 --- /dev/null +++ b/hGameTest/src/game/ui/console/ConsolePane.hx @@ -0,0 +1,53 @@ +package game.ui.console; + +import engine.HProfiler; +import openfl.text.TextField; +import openfl.display3D.textures.Texture; +import openfl.display.Sprite; + +class ConsolePane extends Sprite{ + public function new(){ + super(); + var testPane:UIPane = new UIPane("test",{height:800,width:600}); + testPane.layout = VERTICAL; + + var titlebarPane:UIPane = new UIPane("titlebar", {height:32, width: 600}); + titlebarPane.align = START; + titlebarPane.layout = HORIZONTAL; + + var inputPane:UIPane = new UIPane("inputbar", {height:32, width: 600}); + inputPane.align = END; + inputPane.layout = HORIZONTAL; + + var outputPane:UIPane = new UIPane("output pane", {height: 32, width: 600}); + outputPane.align = START; + outputPane.dimensions.expandBehavior = STRETCH; + HProfiler.startProfiling("ui_resize"); + testPane.width = 1000; + HProfiler.stopProfiling("ui_resize"); + + testPane.addChild(titlebarPane); + testPane.addChild(inputPane); + testPane.addChild(outputPane); + + + + var textField:TextField = new TextField(); + textField.background = true; + textField.backgroundColor = 0x00ff00; + + 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); + + + + addChild(testPane.sprite); + } +} + +