ui_unchecked #1
| @ -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 { | ||||
|  | ||||
| @ -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; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -3,6 +3,7 @@ package engine; | ||||
| import game.ui.console.Console; | ||||
| import Sys; | ||||
| 
 | ||||
| #if sys | ||||
| class HProfiler{ | ||||
|     public static var profilerList:Array<HProfiler> = []; | ||||
|     public static var profilerMap:Map<String, HProfiler> = []; | ||||
| @ -39,3 +40,9 @@ class HProfiler{ | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| #else | ||||
| class HProfiler{ | ||||
|     public static function startProfiling(name:String):Void{} | ||||
|     public static function stopProfiling(name:String):Void{} | ||||
| } | ||||
| #end | ||||
|  | ||||
| @ -1,8 +0,0 @@ | ||||
| package engine.enums; | ||||
| 
 | ||||
| enum CVarType { | ||||
|     CInt; | ||||
|     CFloat; | ||||
|     CString; | ||||
|     CBool; | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package engine.enums; | ||||
| package engine.enums.console; | ||||
| 
 | ||||
| enum CVarFlag{ | ||||
|     FCVAR_ARCHIVE; | ||||
| @ -1,9 +1,9 @@ | ||||
| package engine; | ||||
| package engine.enums.console; | ||||
| 
 | ||||
| enum CVarType { | ||||
|     CInt; | ||||
|     CFloat; | ||||
|     CString; | ||||
|     CBool; | ||||
|     CCmd; | ||||
|     //CCmd; | ||||
| } | ||||
							
								
								
									
										7
									
								
								hGameTest/src/engine/geom/Geom.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								hGameTest/src/engine/geom/Geom.hx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| package engine.geom; | ||||
| 
 | ||||
| 
 | ||||
| typedef P2d = { | ||||
|     x:Float, | ||||
|     y:Float | ||||
| } | ||||
							
								
								
									
										19
									
								
								hGameTest/src/engine/tools/ToolWindow.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								hGameTest/src/engine/tools/ToolWindow.hx
									
									
									
									
									
										Normal file
									
								
							| @ -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() | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										48
									
								
								hGameTest/src/engine/tools/ui/UITool.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								hGameTest/src/engine/tools/ui/UITool.hx
									
									
									
									
									
										Normal file
									
								
							| @ -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<String>) -> { 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(){ | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,6 @@ | ||||
| package engine.typedefs; | ||||
| package engine.typedefs.console; | ||||
| 
 | ||||
| import engine.typedefs.CVar; | ||||
| import engine.typedefs.console.CVar; | ||||
| 
 | ||||
| 
 | ||||
| typedef CCmd = { | ||||
| @ -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; | ||||
| @ -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 | ||||
| { | ||||
							
								
								
									
										331
									
								
								hGameTest/src/engine/ui/UIPane.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								hGameTest/src/engine/ui/UIPane.hx
									
									
									
									
									
										Normal file
									
								
							| @ -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<UIPane> = []; | ||||
| 	public var parent:UIPane = null; | ||||
| 	public var align:PaneAlign = START; | ||||
| 	public var maskSprite:Sprite; | ||||
| 
 | ||||
| 	public static var panelist:Array<UIPane> = []; | ||||
| 
 | ||||
| 	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<String>) -> { | ||||
| 		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); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -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 | ||||
| 	{ | ||||
|  | ||||
| @ -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<Int,Bool> = []; | ||||
|     public static var keysLast:Map<Int,Bool> = []; | ||||
| @ -44,6 +46,8 @@ class Input{ | ||||
|     }); | ||||
|     public static function onKeyIsDown(e:KeyboardEvent){ | ||||
|         if(!Std.isOfType(Lib.current.stage.focus,TextField)){ | ||||
|             // 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]){ | ||||
| @ -59,10 +63,13 @@ class Input{ | ||||
|     } | ||||
|     public static function onKeyIsUp(e:KeyboardEvent){ | ||||
|         if(!Std.isOfType(Lib.current.stage.focus,TextField)){ | ||||
|             // 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; | ||||
|     } | ||||
|     // public static function resolveKeyName(key:Int):String | ||||
|  | ||||
| @ -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<UIPane> = []; | ||||
|     public var parent:UIPane = null; | ||||
|     public var align:PaneAlign = START; | ||||
|     public var maskSprite:Sprite; | ||||
|      | ||||
|     public static var panelist:Array<UIPane> = []; | ||||
|     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<String>) -> { 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); | ||||
|         } | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -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<Array<String>>){ | ||||
|         for(command in commands){ | ||||
|             // Store command name, value and args | ||||
|             var cName:String = command[0]; | ||||
|             var cValue:String = command[1]; | ||||
|             var cArgs:Array<String> = 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]); | ||||
|             } | ||||
|  | ||||
| @ -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; | ||||
| @ -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); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|          | ||||
|          | ||||
|          | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| package game.video; | ||||
| 
 | ||||
| import engine.ConVar; | ||||
| import engine.typedefs.console.CCmd; | ||||
| import openfl.Lib; | ||||
| import openfl.display.StageDisplayState; | ||||
| 
 | ||||
| @ -16,7 +17,7 @@ class Mode | ||||
|             switchFsMode(fs); | ||||
|         } | ||||
|     } | ||||
|     public static var cvMatSetVideoMode:engine.typedefs.CCmd = ConVar.registerCCmd("mat_setvideomode",(args:Array<String>)->{ | ||||
|     public static var cvMatSetVideoMode:CCmd = ConVar.registerCCmd("mat_setvideomode",(args:Array<String>)->{ | ||||
|         setVideoMode(Std.parseInt(args[0]), Std.parseInt(args[1]), Std.parseInt(args[2])); | ||||
|     }); | ||||
|     public static function switchFsMode(toState:Int = 0){ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user