Mercurial > MadButterfly
annotate examples/tank/tank_main.c @ 1042:18256f404193 refine_backend_if
nodejs binding passes compiling
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 23 Nov 2010 11:44:27 +0800 |
parents | c693cd8c6e23 |
children | e415c55b4a0d |
rev | line source |
---|---|
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
1 #include <math.h> |
120 | 2 #include <sys/time.h> |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
3 #include <string.h> |
186
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
160
diff
changeset
|
4 #include <mb.h> |
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
160
diff
changeset
|
5 #include <mb_tools.h> |
115 | 6 #include "svgs.h" |
7 | |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
8 /*! \defgroup tank Example Tank |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
9 * @{ |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
10 */ |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
11 /*! \brief Tile types in a map. */ |
115 | 12 enum { MUD, ROC, BRI, BSH }; |
13 | |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
14 /*! \brief Map of the game. */ |
115 | 15 static char map[12][16] = { |
16 { MUD, MUD, MUD, MUD, MUD, MUD, MUD, MUD, | |
17 MUD, MUD, MUD, MUD, MUD, MUD, MUD, MUD}, | |
18 { MUD, ROC, ROC, ROC, MUD, BSH, BSH, ROC, | |
19 BSH, ROC, MUD, BSH, BSH, ROC, ROC, MUD}, | |
20 { MUD, MUD, BRI, MUD, MUD, MUD, MUD, MUD, | |
21 MUD, MUD, MUD, BRI, MUD, MUD, BSH, MUD}, | |
22 { BRI, MUD, MUD, MUD, MUD, MUD, BRI, MUD, | |
23 BRI, MUD, MUD, MUD, MUD, MUD, MUD, MUD}, | |
24 { MUD, MUD, BRI, MUD, BRI, BSH, BRI, BRI, | |
25 BRI, BRI, BSH, ROC, ROC, MUD, BRI, MUD}, | |
26 { MUD, BRI, BRI, MUD, BRI, MUD, BRI, MUD, | |
27 ROC, MUD, MUD, MUD, MUD, MUD, MUD, MUD}, | |
28 { MUD, MUD, MUD, MUD, MUD, MUD, MUD, MUD, | |
29 MUD, MUD, MUD, BRI, BRI, BRI, BRI, MUD}, | |
30 { MUD, BRI, MUD, BRI, BRI, MUD, BRI, BRI, | |
31 BSH, BRI, MUD, MUD, MUD, MUD, MUD, MUD}, | |
32 { MUD, BRI, MUD, MUD, MUD, MUD, MUD, MUD, | |
33 MUD, MUD, MUD, BRI, BRI, MUD, BRI, BRI}, | |
34 { MUD, BRI, MUD, BRI, BRI, MUD, BRI, BRI, | |
35 BRI, BRI, MUD, BRI, MUD, MUD, MUD, MUD}, | |
36 { MUD, BSH, MUD, BRI, MUD, MUD, BRI, MUD, | |
37 MUD, BRI, MUD, MUD, MUD, BRI, BRI, MUD}, | |
38 { MUD, MUD, MUD, MUD, MUD, MUD, BRI, MUD, | |
39 MUD, BRI, MUD, BRI, MUD, MUD, MUD, MUD} | |
40 }; | |
41 | |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
42 #define MAP_W 16 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
43 #define MAP_H 12 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
44 /* @} */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
45 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
46 /*! \defgroup bullet_elf Bullet Elf |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
47 * \ingroup tank |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
48 * @{ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
49 */ |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
50 /*! \brief Information about bullet elf |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
51 */ |
154 | 52 struct _tank_bullet { |
53 redraw_man_t *rdman; | |
54 coord_t *coord_pos; | |
55 coord_t *coord_rot; | |
56 bullet_t *bullet_obj; | |
57 int start_map_x, start_map_y; | |
58 int direction; | |
59 mb_progm_t *progm; | |
60 mb_timeval_t start_time; | |
61 observer_t *ob_redraw; | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
62 int hit_tmr; |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
63 mb_timer_man_t *timer_man; |
154 | 64 }; |
65 typedef struct _tank_bullet tank_bullet_t; | |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
66 /*! \brief The direction a bullet is going. |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
67 */ |
154 | 68 enum { BU_UP = 0, BU_RIGHT, BU_DOWN, BU_LEFT }; |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
69 /* @} */ |
154 | 70 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
71 /*! \defgroup tank_elf Tank Elf |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
72 * \brief Tank elf module provides control functions of tanks in game. |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
73 * \ingroup tank |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
74 * @{ |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
75 */ |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
76 /*! \brief Information about a tank elf. */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
77 struct _tank { |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
78 coord_t *coord_pos; /*!< \brief coordinate for position */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
79 coord_t *coord_rot; /*!< \brief coordinate for rotation */ |
154 | 80 coord_t *coord_center; |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
81 int map_x, map_y; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
82 int direction; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
83 mb_progm_t *progm; |
154 | 84 tank_bullet_t *bullet; |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
85 struct _tank_rt *tank_rt; /*!< \brief for bullet to check |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
86 * hitting on tanks. |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
87 */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
88 }; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
89 typedef struct _tank tank_t; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
90 enum { TD_UP = 0, TD_RIGHT, TD_DOWN, TD_LEFT }; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
91 |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
92 /* @} */ |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
93 |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
94 typedef struct _tank_rt tank_rt_t; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
95 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
96 /*! \brief Runtime information for tank, this game/example. |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
97 */ |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
98 struct _tank_rt { |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
99 tank_t *tank1; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
100 tank1_t *tank1_o; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
101 tank_t *tank2; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
102 tank2_t *tank2_o; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
103 int n_enemy; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
104 tank_t *tank_enemies[10]; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
105 tank_en_t *tank_enemies_o[10]; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
106 tank_t *tanks[12]; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
107 int n_tanks; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
108 void *map[12][16]; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
109 mb_rt_t *mb_rt; |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
110 observer_t *kb_observer; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
111 }; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
112 |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
113 /*! \ingroup tank_elf |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
114 * @{ |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
115 */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
116 static tank_t *tank_new(coord_t *coord_pos, |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
117 coord_t *coord_rot, |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
118 int map_x, int map_y, |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
119 tank_rt_t *tank_rt) { |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
120 tank_t *tank; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
121 redraw_man_t *rdman; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
122 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
123 tank = O_ALLOC(tank_t); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
124 if(tank == NULL) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
125 return NULL; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
126 |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
127 rdman = mb_runtime_rdman(tank_rt->mb_rt); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
128 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
129 tank->coord_pos = coord_pos; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
130 tank->coord_rot = coord_rot; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
131 tank->map_x = map_x; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
132 tank->map_y = map_y; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
133 tank->direction = TD_UP; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
134 tank->progm = NULL; |
154 | 135 tank->bullet = NULL; |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
136 tank->tank_rt = tank_rt; |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
137 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
138 memset(coord_pos->matrix, 0, sizeof(co_aix[6])); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
139 coord_pos->matrix[0] = 1; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
140 coord_pos->matrix[2] = map_x * 50; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
141 coord_pos->matrix[4] = 1; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
142 coord_pos->matrix[5] = map_y * 50; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
143 rdman_coord_changed(rdman, coord_pos); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
144 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
145 return tank; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
146 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
147 |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
148 static void tank_free(tank_t *tank, mb_rt_t *mb_rt) { |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
149 if(tank->progm) { |
153
9870b049b7f6
Make mb_progm_abort() work.
Thinker K.F. Li <thinker@branda.to>
parents:
132
diff
changeset
|
150 mb_progm_abort(tank->progm); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
151 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
152 free(tank); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
153 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
154 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
155 /*! \brief Clean program for a tank. |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
156 * |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
157 * It is called when the program is completed. |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
158 */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
159 static void clean_tank_progm_handler(event_t *event, void *arg) { |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
160 tank_t *tank = (tank_t *)arg; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
161 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
162 mb_progm_free(tank->progm); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
163 tank->progm = NULL; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
164 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
165 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
166 #define PI 3.1415926 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
167 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
168 static void tank_move(tank_t *tank, int direction, |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
169 tank_rt_t *tank_rt) { |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
170 mb_rt_t *mb_rt = tank_rt->mb_rt; |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
171 redraw_man_t *rdman; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
172 mb_timer_man_t *timer_man; |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
173 ob_factory_t *factory; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
174 /* for the program */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
175 mb_progm_t *progm; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
176 subject_t *comp_sub; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
177 mb_word_t *word; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
178 mb_timeval_t start, playing; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
179 mb_timeval_t now; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
180 /* for position */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
181 co_aix sh_x, sh_y; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
182 /* for direction */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
183 float ang1, ang2; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
184 float rot_diff; |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
185 int i; |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
186 static co_aix shift_xy[][2] = {{0, -50}, {50, 0}, {0, 50}, {-50, 0}}; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
187 static int map_shift[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
188 static float angles[4] = {0, PI / 2, PI , PI * 3 / 2}; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
189 static float rotations[7] = {PI / 2, PI , -PI / 2, |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
190 0, PI / 2, PI , -PI / 2}; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
191 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
192 if(tank->progm != NULL) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
193 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
194 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
195 /* |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
196 * Keep inside the map. |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
197 */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
198 if(direction == tank->direction) { |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
199 switch(direction) { |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
200 case TD_UP: |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
201 if(tank->map_y == 0) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
202 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
203 if(map[tank->map_y - 1][tank->map_x] != MUD) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
204 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
205 break; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
206 case TD_RIGHT: |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
207 if(tank->map_x >= (MAP_W - 1)) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
208 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
209 if(map[tank->map_y][tank->map_x + 1] != MUD) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
210 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
211 break; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
212 case TD_DOWN: |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
213 if(tank->map_y >= (MAP_H - 1)) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
214 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
215 if(map[tank->map_y + 1][tank->map_x] != MUD) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
216 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
217 break; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
218 case TD_LEFT: |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
219 if(tank->map_x == 0) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
220 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
221 if(map[tank->map_y][tank->map_x - 1] != MUD) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
222 return; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
223 break; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
224 } |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
225 |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
226 tank->map_x += map_shift[direction][0]; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
227 tank->map_y += map_shift[direction][1]; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
228 for(i = 0; i < tank_rt->n_tanks; i++) { |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
229 if(tank != tank_rt->tanks[i] && |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
230 tank->map_x == tank_rt->tanks[i]->map_x && |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
231 tank->map_y == tank_rt->tanks[i]->map_y) { |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
232 tank->map_x -= map_shift[direction][0]; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
233 tank->map_y -= map_shift[direction][1]; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
234 return; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
235 } |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
236 } |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
237 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
238 |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
239 rdman = mb_runtime_rdman(mb_rt); |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
240 timer_man = mb_runtime_timer_man(mb_rt); |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
241 factory = mb_runtime_ob_factory(mb_rt); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
242 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
243 progm = mb_progm_new(1, rdman); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
244 tank->progm = progm; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
245 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
246 MB_TIMEVAL_SET(&start, 0, 0); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
247 MB_TIMEVAL_SET(&playing, 0, 500000); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
248 word = mb_progm_next_word(progm, &start, &playing); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
249 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
250 if(direction == tank->direction) { |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
251 /* Shift/move */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
252 sh_x = shift_xy[direction][0]; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
253 sh_y = shift_xy[direction][1]; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
254 mb_shift_new(sh_x, sh_y, tank->coord_pos, word); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
255 } else { |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
256 /* Change direction */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
257 rot_diff = rotations[3 - tank->direction + direction]; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
258 ang1 = angles[tank->direction]; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
259 ang2 = ang1 + rot_diff; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
260 mb_rotate_new(ang1, ang2, tank->coord_rot, word); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
261 tank->direction = direction; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
262 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
263 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
264 /* Clean program when it is completed. */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
265 comp_sub = mb_progm_get_complete(progm); |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
190
diff
changeset
|
266 subject_add_observer(comp_sub, clean_tank_progm_handler, tank); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
267 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
268 get_now(&now); |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
269 mb_progm_start(progm, timer_man, &now); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
270 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
271 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
272 /* @} */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
273 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
274 /*! \ingroup bullet_elf |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
275 * @{ |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
276 */ |
154 | 277 /*! \brief Make coord objects for bullet elfs. */ |
278 static void make_bullet_elf_coords(redraw_man_t *rdman, coord_t **coord_pos, | |
279 coord_t **coord_rot, | |
280 coord_t **coord_center) { | |
281 coord_t *coord_back; | |
282 | |
283 *coord_pos = rdman_coord_new(rdman, rdman->root_coord); | |
284 | |
285 coord_back = rdman_coord_new(rdman, *coord_pos); | |
286 coord_back->matrix[2] = 25; | |
287 coord_back->matrix[5] = 25; | |
288 rdman_coord_changed(rdman, coord_back); | |
289 | |
290 *coord_rot = rdman_coord_new(rdman, coord_back); | |
291 | |
292 *coord_center = rdman_coord_new(rdman, *coord_rot); | |
293 (*coord_center)->matrix[2] = -5; | |
294 (*coord_center)->matrix[5] = +15; | |
295 rdman_coord_changed(rdman, *coord_center); | |
296 } | |
297 | |
298 static tank_bullet_t *tank_bullet_new(redraw_man_t *rdman, | |
299 int map_x, int map_y, | |
300 int direction) { | |
301 tank_bullet_t *bullet; | |
302 coord_t *coord_center; | |
303 co_aix *matrix; | |
304 static float _sins[] = { 0, 1, 0, -1}; | |
305 static float _coss[] = { 1, 0, -1, 0}; | |
306 float _sin, _cos; | |
307 | |
308 bullet = O_ALLOC(tank_bullet_t); | |
309 bullet->rdman = rdman; | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
310 bullet->hit_tmr = -1; |
154 | 311 |
312 make_bullet_elf_coords(rdman, &bullet->coord_pos, | |
313 &bullet->coord_rot, | |
314 &coord_center); | |
315 bullet->bullet_obj = bullet_new(rdman, coord_center); | |
316 | |
317 bullet->start_map_x = map_x; | |
318 bullet->start_map_y = map_y; | |
319 bullet->direction = direction; | |
320 bullet->progm = NULL; | |
321 | |
322 matrix = bullet->coord_pos->matrix; | |
323 matrix[2] = map_x * 50; | |
324 matrix[5] = map_y * 50; | |
325 rdman_coord_changed(rdman, bullet->coord_pos); | |
326 | |
327 _sin = _sins[direction]; | |
328 _cos = _coss[direction]; | |
329 matrix = bullet->coord_rot->matrix; | |
330 matrix[0] = _cos; | |
331 matrix[1] = -_sin; | |
332 matrix[3] = _sin; | |
333 matrix[4] = _cos; | |
334 | |
335 return bullet; | |
336 } | |
337 | |
338 static void tank_bullet_free(tank_bullet_t *bullet) { | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
339 if(bullet->hit_tmr != -1) |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
340 mb_timer_man_remove(bullet->timer_man, bullet->hit_tmr); |
154 | 341 bullet_free(bullet->bullet_obj); |
342 rdman_coord_subtree_free(bullet->rdman, bullet->coord_pos); | |
343 } | |
344 | |
345 static void bullet_go_out_map(event_t *event, void *arg) { | |
346 tank_t *tank = (tank_t *)arg; | |
347 tank_bullet_t *bullet; | |
348 redraw_man_t *rdman; | |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
349 |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
350 bullet = tank->bullet; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
351 rdman = bullet->rdman; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
352 |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
353 if(bullet->hit_tmr != -1) { |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
354 mb_timer_man_remove(bullet->timer_man, bullet->hit_tmr); |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
355 bullet->hit_tmr = -1; |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
356 } |
156
2aad042b30a4
Bullet would be detected to hit a wall (not mud).
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
357 |
2aad042b30a4
Bullet would be detected to hit a wall (not mud).
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
358 coord_hide(bullet->coord_pos); |
2aad042b30a4
Bullet would be detected to hit a wall (not mud).
Thinker K.F. Li <thinker@branda.to>
parents:
155
diff
changeset
|
359 rdman_coord_changed(rdman, bullet->coord_pos); |
154 | 360 |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
361 bullet = tank->bullet; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
362 mb_progm_free(bullet->progm); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
363 tank_bullet_free(tank->bullet); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
364 tank->bullet = NULL; |
154 | 365 } |
366 | |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
367 static void bullet_bang(tank_bullet_t *bullet, int map_x, int map_y) { |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
368 redraw_man_t *rdman; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
369 mb_timer_man_t *timer_man; |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
370 mb_progm_t *progm; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
371 mb_word_t *word; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
372 mb_timeval_t start, playing; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
373 mb_timeval_t now; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
374 bang_t *bang; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
375 co_aix *matrix; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
376 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
377 rdman = bullet->rdman; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
378 timer_man = bullet->timer_man; |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
379 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
380 bang = bang_new(rdman, rdman->root_coord); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
381 matrix = bang->root_coord->matrix; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
382 matrix[2] = map_x * 50; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
383 matrix[5] = map_y * 50; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
384 rdman_coord_changed(rdman, bang->root_coord); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
385 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
386 progm = mb_progm_new(3, rdman); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
387 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
388 MB_TIMEVAL_SET(&start, 1, 0); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
389 MB_TIMEVAL_SET(&playing, 0, 0); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
390 word = mb_progm_next_word(progm, &start, &playing); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
391 mb_visibility_new(VIS_HIDDEN, bang->root_coord, word); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
392 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
393 MB_TIMEVAL_SET(&start, 1, 500000); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
394 word = mb_progm_next_word(progm, &start, &playing); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
395 mb_visibility_new(VIS_VISIBLE, bang->root_coord, word); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
396 |
193
923d91dfb6af
Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
397 MB_TIMEVAL_SET(&start, 2, 500000); |
923d91dfb6af
Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
398 word = mb_progm_next_word(progm, &start, &playing); |
923d91dfb6af
Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
399 mb_visibility_new(VIS_HIDDEN, bang->root_coord, word); |
923d91dfb6af
Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
400 |
194
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
193
diff
changeset
|
401 mb_subtree_free_new(bang->root_coord, word); |
45d9a1e2764d
Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents:
193
diff
changeset
|
402 |
193
923d91dfb6af
Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
403 mb_progm_free_completed(progm); |
923d91dfb6af
Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents:
192
diff
changeset
|
404 |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
405 get_now(&now); |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
406 mb_progm_start(progm, timer_man, &now); |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
407 } |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
408 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
409 /*! \brief To check if a bullet hits walls or tanks. */ |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
410 static void bullet_hit_chk(int hdl, |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
411 const mb_timeval_t *tmo, |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
412 const mb_timeval_t *now, |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
413 void *arg) { |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
414 tank_t *tank = (tank_t *)arg; |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
415 tank_rt_t *tank_rt = tank->tank_rt; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
416 tank_t *tank_hitted; |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
417 tank_bullet_t *bullet; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
418 mb_timeval_t diff, next; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
419 mb_timeval_t unit_tm; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
420 float move_units_f; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
421 int move_units; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
422 int x, y; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
423 int dir; |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
424 int i; |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
425 static int move_adj[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
426 |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
427 bullet = tank->bullet; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
428 bullet->hit_tmr = -1; /* clear hit timer that bullet_go_out_map() |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
429 * can not remove it & currupt memory. |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
430 */ |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
431 |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
432 MB_TIMEVAL_CP(&diff, now); |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
433 MB_TIMEVAL_DIFF(&diff, &bullet->start_time); |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
434 MB_TIMEVAL_SET(&unit_tm, 0, 250000); |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
435 move_units_f = MB_TIMEVAL_DIV(&diff, &unit_tm); |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
436 move_units = floorl(move_units_f); |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
437 dir = bullet->direction; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
438 x = bullet->start_map_x + move_adj[dir][0] * move_units; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
439 y = bullet->start_map_y + move_adj[dir][1] * move_units; |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
440 |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
441 if(map[y][x] != MUD) { |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
442 mb_progm_abort(bullet->progm); |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
443 bullet_go_out_map(NULL, tank); |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
444 bullet_bang(bullet, x, y); |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
445 return; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
446 } |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
447 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
448 /*! \todo Move tanks into a list. */ |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
449 for(i = 0; i < tank_rt->n_enemy; i++) { |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
450 tank_hitted = tank_rt->tank_enemies[i]; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
451 if(tank_hitted == tank) |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
452 continue; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
453 if(tank_hitted->map_x == x && |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
454 tank_hitted->map_y == y) { |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
455 mb_progm_abort(bullet->progm); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
456 bullet_go_out_map(NULL, tank); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
457 bullet_bang(bullet, x, y); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
458 return; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
459 } |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
460 } |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
461 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
462 if(tank_rt->tank1 != tank) { |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
463 tank_hitted = tank_rt->tank1; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
464 if(tank_hitted->map_x == x && |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
465 tank_hitted->map_y == y) { |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
466 mb_progm_abort(bullet->progm); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
467 bullet_go_out_map(NULL, tank); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
468 bullet_bang(bullet, x, y); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
469 return; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
470 } |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
471 } |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
472 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
473 if(tank_rt->tank2 != tank) { |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
474 tank_hitted = tank_rt->tank2; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
475 if(tank_hitted->map_x == x && |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
476 tank_hitted->map_y == y) { |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
477 mb_progm_abort(bullet->progm); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
478 bullet_go_out_map(NULL, tank); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
479 bullet_bang(bullet, x, y); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
480 return; |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
481 } |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
482 } |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
483 |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
484 MB_TIMEVAL_SET(&next, 0, 100000); |
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
485 MB_TIMEVAL_ADD(&next, now); |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
486 bullet->hit_tmr = mb_timer_man_timeout(bullet->timer_man, &next, |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
487 bullet_hit_chk, arg); |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
488 } |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
489 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
490 /*! \brief To fire a bullet for a tank. */ |
154 | 491 static void tank_fire_bullet(tank_rt_t *tank_rt, tank_t *tank) { |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
492 mb_rt_t *mb_rt; |
154 | 493 redraw_man_t *rdman; |
494 int map_x, map_y; | |
495 int shift_x, shift_y; | |
496 int shift_len; | |
497 int dir; | |
498 tank_bullet_t *bullet; | |
499 mb_progm_t *progm; | |
500 mb_word_t *word; | |
501 mb_action_t *act; | |
502 mb_timeval_t start, playing; | |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
503 mb_timeval_t now, next; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
504 mb_timer_man_t *timer_man; |
154 | 505 subject_t *subject; |
506 static int map_xy_adj[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; | |
507 | |
508 if(tank->bullet != NULL) | |
509 return; | |
510 | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
511 mb_rt = tank_rt->mb_rt; |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
512 rdman = mb_runtime_rdman(mb_rt); |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
513 timer_man = mb_runtime_timer_man(mb_rt); |
154 | 514 |
515 dir = tank->direction; | |
516 map_x = tank->map_x + map_xy_adj[dir][0]; | |
517 map_y = tank->map_y + map_xy_adj[dir][1]; | |
518 switch(dir) { | |
519 case TD_UP: | |
520 shift_len = map_y + 1; | |
521 shift_x = 0; | |
522 shift_y = -shift_len * 50; | |
523 break; | |
524 case TD_RIGHT: | |
525 shift_len = 16 - map_x; | |
526 shift_x = shift_len * 50; | |
527 shift_y = 0; | |
528 break; | |
529 case TD_DOWN: | |
530 shift_len = 12 - map_y; | |
531 shift_x = 0; | |
532 shift_y = shift_len * 50; | |
533 break; | |
534 case TD_LEFT: | |
535 shift_len = map_x + 1; | |
536 shift_x = -shift_len * 50; | |
537 shift_y = 0; | |
538 break; | |
539 } | |
540 | |
157
5cd12609a5c7
Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents:
156
diff
changeset
|
541 if(shift_len <= 0) |
5cd12609a5c7
Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents:
156
diff
changeset
|
542 return; |
5cd12609a5c7
Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents:
156
diff
changeset
|
543 |
5cd12609a5c7
Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents:
156
diff
changeset
|
544 tank->bullet = tank_bullet_new(rdman, map_x, map_y, dir); |
5cd12609a5c7
Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents:
156
diff
changeset
|
545 bullet = tank->bullet; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
546 bullet->timer_man = timer_man; |
157
5cd12609a5c7
Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents:
156
diff
changeset
|
547 |
154 | 548 progm = mb_progm_new(2, rdman); |
549 MB_TIMEVAL_SET(&start, 0, 0); | |
550 MB_TIMEVAL_SET(&playing, shift_len / 4, (shift_len % 4) * 250000); | |
551 word = mb_progm_next_word(progm, &start, &playing); | |
552 act = mb_shift_new(shift_x, shift_y, bullet->coord_pos, word); | |
553 bullet->progm = progm; | |
554 | |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
555 /*! \todo Simplify the procdure of using observer pattern. */ |
154 | 556 subject = mb_progm_get_complete(progm); |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
190
diff
changeset
|
557 subject_add_observer(subject, bullet_go_out_map, tank); |
154 | 558 |
559 get_now(&now); | |
560 MB_TIMEVAL_CP(&bullet->start_time, &now); | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
561 mb_progm_start(progm, timer_man, &now); |
155
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
562 |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
563 MB_TIMEVAL_SET(&next, 0, 100000); |
6749f6639924
Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents:
154
diff
changeset
|
564 MB_TIMEVAL_ADD(&next, &now); |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
565 bullet->hit_tmr = mb_timer_man_timeout(timer_man, &next, |
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
566 bullet_hit_chk, tank); |
154 | 567 } |
568 | |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
569 /* @} */ |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
570 |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
571 /*! \ingroup tank |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
572 * @{ |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
573 */ |
115 | 574 #define CHANGE_POS(g, x, y) do { \ |
575 (g)->root_coord->matrix[0] = 1.0; \ | |
576 (g)->root_coord->matrix[2] = x; \ | |
577 (g)->root_coord->matrix[4] = 1.0; \ | |
578 (g)->root_coord->matrix[5] = y; \ | |
579 rdman_coord_changed(rdman, (g)->root_coord); \ | |
580 } while(0) | |
581 | |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
582 static void keyboard_handler(event_t *event, void *arg) { |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
583 X_kb_event_t *xkey = (X_kb_event_t *)event; |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
584 tank_rt_t *tank_rt = (tank_rt_t *)arg; |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
585 int direction; |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
586 |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
587 if(xkey->event.type != EVT_KB_PRESS) |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
588 return; |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
589 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
590 switch(xkey->sym) { |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
591 case 0xff51: /* left */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
592 direction = TD_LEFT; |
153
9870b049b7f6
Make mb_progm_abort() work.
Thinker K.F. Li <thinker@branda.to>
parents:
132
diff
changeset
|
593 tank_move(tank_rt->tank1, direction, tank_rt); |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
594 break; |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
595 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
596 case 0xff52: /* up */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
597 direction = TD_UP; |
153
9870b049b7f6
Make mb_progm_abort() work.
Thinker K.F. Li <thinker@branda.to>
parents:
132
diff
changeset
|
598 tank_move(tank_rt->tank1, direction, tank_rt); |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
599 break; |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
600 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
601 case 0xff53: /* right */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
602 direction = TD_RIGHT; |
153
9870b049b7f6
Make mb_progm_abort() work.
Thinker K.F. Li <thinker@branda.to>
parents:
132
diff
changeset
|
603 tank_move(tank_rt->tank1, direction, tank_rt); |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
604 break; |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
605 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
606 case 0xff54: /* down */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
607 direction = TD_DOWN; |
153
9870b049b7f6
Make mb_progm_abort() work.
Thinker K.F. Li <thinker@branda.to>
parents:
132
diff
changeset
|
608 tank_move(tank_rt->tank1, direction, tank_rt); |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
609 break; |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
610 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
611 case 0x20: /* space */ |
154 | 612 tank_fire_bullet(tank_rt, tank_rt->tank1); |
153
9870b049b7f6
Make mb_progm_abort() work.
Thinker K.F. Li <thinker@branda.to>
parents:
132
diff
changeset
|
613 break; |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
614 case 0xff0d: /* enter */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
615 default: |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
616 return; |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
617 } |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
618 |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
619 } |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
620 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
621 static void init_keyboard(tank_rt_t *tank_rt) { |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
622 mb_rt_t *mb_rt; |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
623 subject_t *kbevents; |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
624 redraw_man_t *rdman; |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
625 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
626 mb_rt = tank_rt->mb_rt; |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
627 kbevents = mb_runtime_kbevents(mb_rt); |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
628 |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
629 rdman = mb_runtime_rdman(mb_rt); |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
630 |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
631 tank_rt->kb_observer = |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
190
diff
changeset
|
632 subject_add_observer(kbevents, keyboard_handler, tank_rt); |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
633 } |
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
634 |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
635 /*! \brief Make coord objects to decorate elfs (tanks). |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
636 * |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
637 * These coords are used to shift (move) and rotate decorated graphic. |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
638 * The coords can easy work of programmer to manipulate geometry of |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
639 * decorated graphic. |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
640 */ |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
641 static void make_elf_coords(redraw_man_t *rdman, coord_t **coord_pos, |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
642 coord_t **coord_rot, coord_t **coord_center) { |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
643 coord_t *coord_back; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
644 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
645 *coord_pos = rdman_coord_new(rdman, rdman->root_coord); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
646 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
647 coord_back = rdman_coord_new(rdman, *coord_pos); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
648 coord_back->matrix[2] = 25; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
649 coord_back->matrix[5] = 25; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
650 rdman_coord_changed(rdman, coord_back); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
651 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
652 *coord_rot = rdman_coord_new(rdman, coord_back); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
653 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
654 *coord_center = rdman_coord_new(rdman, *coord_rot); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
655 (*coord_center)->matrix[2] = -25; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
656 (*coord_center)->matrix[5] = -25; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
657 rdman_coord_changed(rdman, *coord_center); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
658 } |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
659 |
115 | 660 void |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
661 initial_tank(tank_rt_t *tank_rt, mb_rt_t *mb_rt) { |
115 | 662 redraw_man_t *rdman; |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
663 /* for map areas */ |
115 | 664 mud_t *mud; |
665 brick_t *brick; | |
666 rock_t *rock; | |
667 bush_t *bush; | |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
668 /* for tanks */ |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
669 coord_t *coord_center, *coord_pos, *coord_rot; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
670 tank1_t *tank1_o; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
671 tank2_t *tank2_o; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
672 tank_en_t *tank_en_o; |
115 | 673 int i, j; |
674 | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
675 rdman = mb_runtime_rdman(mb_rt); |
115 | 676 |
677 tank_rt->mb_rt = mb_rt; | |
678 for(i = 0; i < 12; i++) { | |
679 for(j = 0; j < 16; j++) { | |
680 switch(map[i][j]) { | |
681 case MUD: | |
130
3a4d6179e6a9
change mb_c_source.m4 and mb_c_header.m4 to specify parent for SVG object
Thinker K.F. Li <thinker@branda.to>
parents:
129
diff
changeset
|
682 mud = mud_new(rdman, rdman->root_coord); |
115 | 683 CHANGE_POS(mud, j * 50, i * 50); |
684 tank_rt->map[i][j] = (void *)mud; | |
685 break; | |
686 case BRI: | |
130
3a4d6179e6a9
change mb_c_source.m4 and mb_c_header.m4 to specify parent for SVG object
Thinker K.F. Li <thinker@branda.to>
parents:
129
diff
changeset
|
687 brick = brick_new(rdman, rdman->root_coord); |
115 | 688 CHANGE_POS(brick, j * 50, i * 50); |
689 tank_rt->map[i][j] = (void *)brick; | |
690 break; | |
691 case ROC: | |
130
3a4d6179e6a9
change mb_c_source.m4 and mb_c_header.m4 to specify parent for SVG object
Thinker K.F. Li <thinker@branda.to>
parents:
129
diff
changeset
|
692 rock = rock_new(rdman, rdman->root_coord); |
115 | 693 CHANGE_POS(rock, j * 50, i * 50); |
694 tank_rt->map[i][j] = (void *)rock; | |
695 break; | |
696 case BSH: | |
130
3a4d6179e6a9
change mb_c_source.m4 and mb_c_header.m4 to specify parent for SVG object
Thinker K.F. Li <thinker@branda.to>
parents:
129
diff
changeset
|
697 bush = bush_new(rdman, rdman->root_coord); |
115 | 698 CHANGE_POS(bush, j * 50, i * 50); |
699 tank_rt->map[i][j] = (void *)bush; | |
700 break; | |
701 } | |
702 } | |
703 } | |
704 | |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
705 make_elf_coords(rdman, &coord_pos, &coord_rot, &coord_center); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
706 tank1_o = tank1_new(rdman, coord_center); |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
707 tank_rt->tank1 = tank_new(coord_pos, coord_rot, 5, 11, tank_rt); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
708 tank_rt->tank1_o = tank1_o; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
709 |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
710 make_elf_coords(rdman, &coord_pos, &coord_rot, &coord_center); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
711 tank2_o = tank2_new(rdman, coord_center); |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
712 tank_rt->tank2 = tank_new(coord_pos, coord_rot, 10, 11, tank_rt); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
713 tank_rt->tank2_o = tank2_o; |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
714 |
117 | 715 for(i = 0; i < 3; i++) { |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
716 make_elf_coords(rdman, &coord_pos, &coord_rot, &coord_center); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
717 tank_en_o = tank_en_new(rdman, coord_center); |
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
718 tank_rt->tank_enemies[i] = tank_new(coord_pos, coord_rot, |
189
257af0ed5852
When a bullet hits a tank or wall, it shows a bang animation.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
719 i * 3 + 3, 0, tank_rt); |
131
6a8588df68af
Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents:
130
diff
changeset
|
720 tank_rt->tank_enemies_o[i] = tank_en_o; |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
721 tank_rt->tanks[i] = tank_rt->tank_enemies[i]; |
117 | 722 } |
723 tank_rt->n_enemy = i; | |
120 | 724 |
132
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
725 tank_rt->tanks[i++] =tank_rt->tank1; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
726 tank_rt->tanks[i++] =tank_rt->tank2; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
727 tank_rt->n_tanks = i; |
c65b30e2eda9
detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents:
131
diff
changeset
|
728 |
129
ba581d8a4b9b
Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents:
122
diff
changeset
|
729 init_keyboard(tank_rt); |
115 | 730 } |
731 | |
732 int | |
733 main(int argc, char *const argv[]) { | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
734 mb_rt_t *rt; |
115 | 735 tank_rt_t tank_rt; |
736 | |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
737 rt = mb_runtime_new(":0.0", 800, 600); |
115 | 738 |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
120
diff
changeset
|
739 initial_tank(&tank_rt, rt); |
115 | 740 |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
741 mb_runtime_event_loop(rt); |
115 | 742 |
1027
c693cd8c6e23
Migrate examples/tank to new definition of backend
Thinker K.F. Li <thinker@codemud.net>
parents:
195
diff
changeset
|
743 mb_runtime_free(rt); |
115 | 744 } |
190
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
745 |
0a924eb9ccab
Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents:
189
diff
changeset
|
746 /* @} */ |