source: trunk/orbital/player.h @ 1354

Last change on this file since 1354 was 1354, checked in by sam, 9 years ago

orbital: add second player, option drone meshes, and animate the drones.

  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1//
2// Orbital
3//
4// Copyright: (c) 2012 Various People
5//
6
7/* FIXME: this file is pure crap; it's only a test. */
8
9#if !defined __PLAYER_H__
10#define __PLAYER_H__
11
12class Player : public WorldEntity
13{
14public:
15    Player(int type)
16      : m_stick(0),
17        m_ready(false)
18    {
19        vec4 color[2] = { vec4(0.8f,0.2f,0.1f,1.0f),
20                          vec4(0.1f,0.1f,0.6f,1.0f) };
21
22        if (type == 0)
23        {
24            m_ship_mesh.SetCurColor(color[type]);
25            m_ship_mesh.SendCommand("afcb3,6,7,.4,t0,0,7,sc1,1,1,1,afcb3,4,4,.4,t4,0,-4,mx,fl");
26            m_ship_mesh.SetCurColor(color[type]);
27            m_ship_mesh.SendCommand("afcb3,6,5,.4,sc1,1,1,1,afcb2,3,9,.4,fl");
28            m_ship_mesh.SendCommand("scb1,1,1,1,ac4,15,.2,.6,1,1,tz-2,ac4,15,.2,.6,1,1,rx90,t0,-2,-7,fl");
29
30            m_exhaust_mesh.SendCommand("sc0,1,1,1,scb0,0,0,1,ac5,15,0,1.5,0,1,ac7,35,1.1,4,0,1,rx90,t-3,0,27,mx,fl");
31        }
32        else
33        {
34            m_ship_mesh.SendCommand("sc1,1,1,1,scb1,1,1,1,ac4,15,.2,.6,1,1,t0,0,-4,ac4,1.5,.2,.6,1,1,rx90,t1.3,-2,-6,afcb3,6,5,.4,t0,0,-7");
35            m_ship_mesh.SetCurColor(color[type]);
36            m_ship_mesh.SendCommand("afcb3,4,7,.4,t4,0,0,mx,fl,afcb3,6,5,.4,sc1,1,1,1,afcb2,3,9,.4");
37
38            m_exhaust_mesh.SendCommand("sc0,1,1,1,scb0,0,0,1,ac5,10,0,1.5,0,1,ac7,25,1.1,4,0,1,rx90,t0,0,25");
39        }
40
41        m_option_mesh.SetCurColor(color[type]);
42        m_option_mesh.SendCommand("afcb5,1,3,0.6,fl,sc1,1,1,1,afcb1,5,3,0.6,tz-1,fl");
43
44        m_position = vec3(0.f + type * 80.f, 3.5f + 50.f, 0.f);
45
46        m_options.Push(vec3(0.f), vec3(20.f, 0.f, 0.f));
47        m_options.Push(vec3(0.f), vec3(-20.f, 0.f, 0.f));
48        m_options.Push(vec3(0.f), vec3(20.f, 0.f, 0.f));
49        m_options.Push(vec3(0.f), vec3(-20.f, 0.f, 0.f));
50    }
51
52    ~Player()
53    {
54        if (m_stick)
55            Ticker::Unref(m_stick);
56    }
57
58    char const *GetName() { return "<ship>"; }
59
60protected:
61    virtual void TickGame(float seconds)
62    {
63        WorldEntity::TickGame(seconds);
64
65        float updown = Input::GetButtonState(273 /*SDLK_UP*/)
66                     - Input::GetButtonState(274 /*SDLK_DOWN*/);
67        float rightleft = Input::GetButtonState(275 /*SDLK_RIGHT*/)
68                        - Input::GetButtonState(276 /*SDLK_LEFT*/);
69
70        if (!m_stick)
71            m_stick = Input::TrackStick();
72        if (m_stick && m_stick->GetAxisCount() >= 4)
73        {
74            rightleft += 1.f * m_stick->GetAxis(2);
75            updown += -1.f * m_stick->GetAxis(3);
76        }
77
78        for (int i = 0; i < m_options.Count(); i++)
79        {
80            vec3 pos[4] = { vec3(11.f, 0.f, 0.f),
81                            vec3(-11.f, 0.f, 0.f),
82                            vec3(21.f, 0.f, 0.f),
83                            vec3(-21.f, 0.f, 0.f) };
84            /* FIXME: this is not delta-timed */
85            m_options[i].m1 = 0.1f * (m_position + pos[i])
86                            + 0.9f * m_options[i].m1;
87            m_options[i].m2[2] += seconds * (i & 1 ? 600.f : -600.f);
88        }
89
90        m_position += vec3(rightleft, 0.f, -updown) * 200.f * seconds;
91    }
92
93    virtual void TickDraw(float seconds)
94    {
95        WorldEntity::TickDraw(seconds);
96
97        if (!m_ready)
98        {
99            m_ship_mesh.SendCommand("irb");
100            m_exhaust_mesh.SendCommand("irb");
101            m_option_mesh.SendCommand("irb");
102            m_ready = true;
103        }
104
105        mat4 model = mat4::translate(m_position) * mat4(m_rotation);
106        m_ship_mesh.Render(model);
107        m_exhaust_mesh.Render(model);
108
109        for (int i = 0; i < m_options.Count(); i++)
110        {
111            mat4 t = mat4::translate(m_options[i].m1)
112                   * mat4::fromeuler_yxz(m_options[i].m2);
113
114            m_option_mesh.Render(t);
115        }
116    }
117
118private:
119    Mesh m_ship_mesh, m_option_mesh, m_exhaust_mesh;
120    Stick *m_stick;
121
122    Array<vec3, vec3> m_options;
123
124    bool m_ready;
125};
126
127#endif /* __PLAYER_H__ */
128
Note: See TracBrowser for help on using the repository browser.