source: 2014/30/MiskaK/The Reclaim/The Reclaim/The Reclaim/The Reclaim/ActionMenu.cs @ 5652

Revision 5652, 3.6 KB checked in by mikrkana, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Jypeli.Widgets;
7
8public class ActionMenu : Widget
9{
10    List<PushButton> actionButtons = new List<PushButton>();
11    List<Behaviour> actions = new List<Behaviour>();
12
13    public delegate void ActionMenuHandler(Behaviour action);
14
15    public event ActionMenuHandler Clicked;
16
17    public ActionMenu(double width, double height, params Behaviour[] buttons)
18        :base(width, height)
19    {
20        if (buttons.Length == 0)
21            throw new ArgumentException("There must be at least one button.");
22
23        foreach (Behaviour buttonType in buttons)
24        {
25            CreateButton(buttonType);
26        }
27
28        const double BUTTON_SPACING = 20.0;
29
30        double buttonWidth = (width - (actionButtons.Count - 1) * BUTTON_SPACING) / actionButtons.Count;
31        Angle startingAngle = Angle.FromDegrees(90);
32        double ETAISYYS_HIIRESTA = width / 5;
33
34        for (int i = 0; i < actionButtons.Count; i++)
35        {
36            PushButton b = actionButtons[i];
37            b.TextScale = new Vector(0.65, 0.65);
38            //b.Position = new Vector(this.Position.X - this.Width / 2 + i * buttonWidth + i * BUTTON_SPACING + buttonWidth / 2, this.Position.Y);
39            b.Position = Vector.FromLengthAndAngle(ETAISYYS_HIIRESTA, startingAngle + Angle.FromDegrees(i * (360 / actionButtons.Count)));
40            b.Width = buttonWidth;
41            b.Height = height;
42            b.Clicked += delegate { ButtonClicked((int)b.Tag); };
43            b.Tag = i;
44            this.Add(b);
45        }
46        this.Color = Color.Transparent;
47        this.IsUpdated = true;
48    }
49
50    void CreateButton(Behaviour type)
51    {
52        PushButton button;
53
54        switch (type)
55        {
56            case Behaviour.Idle:
57                button = new PushButton(Images.IdleButton); // tässä voi laittaa napeille kuvan
58                button.ImageHover = Images.IdleButtonHover;
59                button.ImageReleased = Images.IdleButton;
60                break;
61            case Behaviour.Move:
62                button = new PushButton(Images.MoveButton);
63                button.ImageHover = Images.MoveButtonHover;
64                button.ImageReleased = Images.MoveButton;
65                break;
66            case Behaviour.Shoot:
67                button = new PushButton(Images.ShootButton);
68                button.ImageHover = Images.ShootButtonHover;
69                button.ImageReleased = Images.ShootButton;
70                break;
71            default:
72                button = new PushButton("Unknown action"); // ei pitäisi tulla
73                break;
74        }
75        actionButtons.Add(button);
76        actions.Add(type);
77    }
78
79    public void ButtonClicked(int button)
80    {
81        if (Clicked != null)
82            Clicked(actions[button]);
83    }
84
85    public override void Update(Time time)
86    {
87        base.Update(time);
88    }
89
90    public int GetButtonClosestToMouse()
91    {
92        Vector hiirenPaikka = The_Reclaim.Peli.Mouse.PositionOnScreen;
93        double lyhinEtaisyys = Vector.Distance(hiirenPaikka, actionButtons[0].AbsolutePosition);
94        int lahinIndeksi = 0;
95
96        for (int i = 1; i < actionButtons.Count; i++)
97        {
98            double etaisyys = Vector.Distance(hiirenPaikka, actionButtons[i].AbsolutePosition);
99
100            if (etaisyys < lyhinEtaisyys)
101            {
102                lyhinEtaisyys = etaisyys;
103                lahinIndeksi = i;
104            }
105        }
106        return lahinIndeksi;
107    }
108}
Note: See TracBrowser for help on using the repository browser.