1 module gui;
2 
3 import liberty.engine;
4 import controller;
5 
6 /**
7  * Example class for player.
8 **/
9 final class HUD : Surface {
10   mixin NodeConstructor;
11 
12   private {
13     Button[10][10] button;
14     Tuple!(Button, Event)[] leftClickEvents;
15     Tuple!(Button, Event)[] mouseOverEvents;
16     Material greyMaterial;
17     Material redMaterial;
18     CubeMap skybox;
19   }
20 
21   /**
22    * Optional.
23    * If declared, it is called after all objects instantiation.
24   **/
25   override void start() {
26     greyMaterial = new Material("res/textures/grey.bmp");
27     redMaterial = new Material("res/textures/red.bmp");
28 
29     foreach (i; 0..10)
30       foreach (j; 0..10) {
31         (button[i][j] = new Button("Button[" ~ i.to!string ~ "][" ~ j.to!string ~ "]", this))
32           .setIndex(i, j)
33           .getTransform()
34           .setLocation(100 + i * 50, 100 + j * 50)
35           .setScale(50, 50);
36         button[i][j].getModel().setMaterials([greyMaterial]);
37         leftClickEvents ~= tuple(button[i][j], Event.MouseLeftClick);
38         mouseOverEvents ~= tuple(button[i][j], Event.MouseOver);
39       }
40 
41     // Action for mouse over
42     addAction("ColorToRed", (sender, event) {
43       foreach (btn; button)
44         foreach (b; btn)
45           b.getModel().setMaterials([greyMaterial]);
46 
47       const x = sender.getIndex().x;
48       const y = sender.getIndex().y;
49 
50       if (x != 0 && y != 0)
51         button[x - 1][y - 1].getModel().setMaterials([redMaterial]);
52       
53       if (x != 0)
54         button[x - 1][y].getModel().setMaterials([redMaterial]);
55       
56       if (x != 0 && y != 9)
57         button[x - 1][y + 1].getModel().setMaterials([redMaterial]);
58 
59       if (x != 9 && y != 0)
60         button[x + 1][y - 1].getModel().setMaterials([redMaterial]);
61       
62       if (x != 9)
63         button[x + 1][y].getModel().setMaterials([redMaterial]);
64       
65       if (x != 9 && y != 9)
66         button[x + 1][y + 1].getModel().setMaterials([redMaterial]);
67 
68       if (y != 0)
69         button[x][y - 1].getModel().setMaterials([redMaterial]);
70       
71       if (y != 9)
72         button[x][y + 1].getModel().setMaterials([redMaterial]);
73       
74     }, mouseOverEvents);
75 
76     (skybox = spawn!CubeMap("Sky"))
77       .build(new Material([
78         "res/textures/skybox/right.bmp",
79         "res/textures/skybox/left.bmp",
80         "res/textures/skybox/bottom.bmp",
81         "res/textures/skybox/top.bmp",
82         "res/textures/skybox/back.bmp",
83         "res/textures/skybox/front.bmp"
84       ]));
85   }
86 
87   /**
88    * Optional.
89    * If declared, it is called every frame.
90   **/
91   override void update() {
92     super.update();
93 
94     updateMouseMode();
95 
96     if (Input.getJoystick().isButtonDown(JoystickButton.A))
97       simulateAction("ColorToRed", button[1][1], Event.Update);
98   }
99 }