diff --git a/EngineGL.Tests/Exec/GamrExecTest.cs b/EngineGL.Tests/Exec/GamrExecTest.cs index a30f89a..9f8b911 100644 --- a/EngineGL.Tests/Exec/GamrExecTest.cs +++ b/EngineGL.Tests/Exec/GamrExecTest.cs @@ -10,6 +10,8 @@ using EngineGL.Impl.DrawableComponents.Shape3D; using EngineGL.Impl.Objects; using EngineGL.Impl.Resource; +using EngineGL.Impl.UI; +using EngineGL.Structs.Drawing; using EngineGL.Structs.Math; using EngineGL.Tests.Exec.TestComponents; using EngineGL.Utils; @@ -174,6 +176,15 @@ private Scene GetInitScene() }); scene.AddObject(g8); + GameObject g9 = new GameObject(); + g9.SetBounds(new Vec3(5, 5, 0)) + .SetPosition(new Vec3(-3, -2, 0)); + g9.AddComponent(new Button() + { + Colour = Color4.Red + }); + scene.AddObject(g9); + IAudio audio = ResourceManager.LoadWave("Sounds/Mixdown2.wav"); audio.SetLoop(true); audio.Play(); diff --git a/EngineGL/Core/LifeCycle/IClickable.cs b/EngineGL/Core/LifeCycle/IClickable.cs new file mode 100644 index 0000000..9b0fa8e --- /dev/null +++ b/EngineGL/Core/LifeCycle/IClickable.cs @@ -0,0 +1,17 @@ +using System; +using EngineGL.Event.LifeCycle; +using EngineGL.Structs.Drawing; + +namespace EngineGL.Core.LifeCycle +{ + public interface IClickable + { + event EventHandler Click; + + /// + /// オブジェクトを描画するメソッド + /// + /// ゲームのフレーム更新間隔時間 + void OnClick(); + } +} \ No newline at end of file diff --git a/EngineGL/EngineGL.csproj b/EngineGL/EngineGL.csproj index 258f8ba..80ff0c1 100644 --- a/EngineGL/EngineGL.csproj +++ b/EngineGL/EngineGL.csproj @@ -96,6 +96,7 @@ + @@ -103,6 +104,7 @@ + diff --git a/EngineGL/Event/LifeCycle/ClickEventArgs.cs b/EngineGL/Event/LifeCycle/ClickEventArgs.cs new file mode 100644 index 0000000..95d56f0 --- /dev/null +++ b/EngineGL/Event/LifeCycle/ClickEventArgs.cs @@ -0,0 +1,17 @@ +using System; +using EngineGL.Core.LifeCycle; +using OpenTK.Graphics.OpenGL; +using OpenTK.Input; + +namespace EngineGL.Event.LifeCycle +{ + public class ClickEventArgs : EventArgs + { + public IClickable ClickTarget { get; } + + public ClickEventArgs(IClickable clickable) + { + ClickTarget = clickable; + } + } +} \ No newline at end of file diff --git a/EngineGL/Impl/UI/Button.cs b/EngineGL/Impl/UI/Button.cs index 6cbacc2..f0c9809 100644 --- a/EngineGL/Impl/UI/Button.cs +++ b/EngineGL/Impl/UI/Button.cs @@ -1,24 +1,44 @@ +using System; using System.Drawing; +using EngineGL.Core.LifeCycle; +using EngineGL.Event.LifeCycle; +using EngineGL.GraphicAdapter; +using EngineGL.GraphicAdapter.Interface; +using EngineGL.Impl.DrawableComponents; using EngineGL.Structs.Drawing; +using EngineGL.Structs.Math; namespace EngineGL.Impl.UI { - public class Button : Element + public class Button : DrawableComponent, IClickable { public string Text { get; set; } - public Colour4 BackColor { get; set; } public Font Font { get; set; } public int FontSize { get; set; } - public Colour4 FontColor { get; set; } + public Color FontColor { get; set; } public int Width { get; set; } public int Height { get; set; } + public event EventHandler Click; - public Button() + public Button() : base(GraphicAdapterFactory.OpenGL2.CreateQuads()) { } - public void Click() + public override void OnVertexWrite(double deltaTime, IVertexHandler vertexHandler) { + base.OnVertexWrite(deltaTime, vertexHandler); + vertexHandler.SetVertces3(new Vec3[] + { + new Vec3(-GameObject.Transform.Bounds.X / 2, -GameObject.Transform.Bounds.Y / 2), + new Vec3(GameObject.Transform.Bounds.X / 2, -GameObject.Transform.Bounds.Y / 2), + new Vec3(GameObject.Transform.Bounds.X / 2, GameObject.Transform.Bounds.Y / 2), + new Vec3(-GameObject.Transform.Bounds.X / 2, GameObject.Transform.Bounds.Y / 2), + }); + } + + public void OnClick() + { + Colour = Color.Blue; } } } \ No newline at end of file