annotate examples/tank/tank_main.c @ 194:45d9a1e2764d

Add mb_subtree_free animate action and fix bugs. - Free members of a coord in rdman_coord_subtree_free(). - Fix core dump issue of subject_notify() that can not free subjects well.
author Thinker K.F. Li <thinker@branda.to>
date Wed, 19 Nov 2008 20:53:40 +0800
parents 923d91dfb6af
children 5235aded379c
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
5df7403b6fbc Fix bug of get_now()
Thinker K.F. Li <thinker@branda.to>
parents: 117
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
6 #include "svgs.h"
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
12 enum { MUD, ROC, BRI, BSH };
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
15 static char map[12][16] = {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
16 { MUD, MUD, MUD, MUD, MUD, MUD, MUD, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
17 MUD, MUD, MUD, MUD, MUD, MUD, MUD, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
18 { MUD, ROC, ROC, ROC, MUD, BSH, BSH, ROC,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
19 BSH, ROC, MUD, BSH, BSH, ROC, ROC, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
20 { MUD, MUD, BRI, MUD, MUD, MUD, MUD, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
21 MUD, MUD, MUD, BRI, MUD, MUD, BSH, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
22 { BRI, MUD, MUD, MUD, MUD, MUD, BRI, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
23 BRI, MUD, MUD, MUD, MUD, MUD, MUD, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
24 { MUD, MUD, BRI, MUD, BRI, BSH, BRI, BRI,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
25 BRI, BRI, BSH, ROC, ROC, MUD, BRI, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
26 { MUD, BRI, BRI, MUD, BRI, MUD, BRI, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
27 ROC, MUD, MUD, MUD, MUD, MUD, MUD, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
28 { MUD, MUD, MUD, MUD, MUD, MUD, MUD, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
29 MUD, MUD, MUD, BRI, BRI, BRI, BRI, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
30 { MUD, BRI, MUD, BRI, BRI, MUD, BRI, BRI,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
31 BSH, BRI, MUD, MUD, MUD, MUD, MUD, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
32 { MUD, BRI, MUD, MUD, MUD, MUD, MUD, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
33 MUD, MUD, MUD, BRI, BRI, MUD, BRI, BRI},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
34 { MUD, BRI, MUD, BRI, BRI, MUD, BRI, BRI,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
35 BRI, BRI, MUD, BRI, MUD, MUD, MUD, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
36 { MUD, BSH, MUD, BRI, MUD, MUD, BRI, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
37 MUD, BRI, MUD, MUD, MUD, BRI, BRI, MUD},
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
38 { MUD, MUD, MUD, MUD, MUD, MUD, BRI, MUD,
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
39 MUD, BRI, MUD, BRI, MUD, MUD, MUD, MUD}
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
40 };
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
52 struct _tank_bullet {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
53 redraw_man_t *rdman;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
54 coord_t *coord_pos;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
55 coord_t *coord_rot;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
56 bullet_t *bullet_obj;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
57 int start_map_x, start_map_y;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
58 int direction;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
59 mb_progm_t *progm;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
60 mb_timeval_t start_time;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
61 observer_t *ob_redraw;
155
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
62 mb_timer_t *hit_tmr;
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
63 mb_tman_t *tman;
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
64 };
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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];
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
109 X_MB_runtime_t *mb_rt;
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
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
127 rdman = X_MB_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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
148 static void tank_free(tank_t *tank, X_MB_runtime_t *xmb_rt) {
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
149 mb_tman_t *tman;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
150
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
151 if(tank->progm) {
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
152 tman = X_MB_tman(xmb_rt);
153
9870b049b7f6 Make mb_progm_abort() work.
Thinker K.F. Li <thinker@branda.to>
parents: 132
diff changeset
153 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
154 }
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
155 free(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
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
158 /*! \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
159 *
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
160 * 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
161 */
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
162 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
163 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
164
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
165 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
166 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
167 }
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
168
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
169 #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
170
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
171 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
172 tank_rt_t *tank_rt) {
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
173 X_MB_runtime_t *xmb_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
174 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
175 mb_tman_t *tman;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
176 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
177 /* 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
178 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
179 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
180 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
181 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
182 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
183 /* for position */
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
184 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
185 /* for direction */
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
186 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
187 float rot_diff;
132
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
188 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
189 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
190 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
191 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
192 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
193 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
194
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
195 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
196 return;
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 /*
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
199 * 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
200 */
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
201 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
202 switch(direction) {
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
203 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
204 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
205 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
206 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
207 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
208 break;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
209 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
210 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
211 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
212 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
213 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
214 break;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
215 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
216 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
217 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
218 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
219 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
220 break;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
221 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
222 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
223 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
224 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
225 return;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
226 break;
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
227 }
132
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
228
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
229 tank->map_x += map_shift[direction][0];
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
230 tank->map_y += map_shift[direction][1];
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
231 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
232 if(tank != tank_rt->tanks[i] &&
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
233 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
234 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
235 tank->map_x -= map_shift[direction][0];
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
236 tank->map_y -= map_shift[direction][1];
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
237 return;
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
238 }
c65b30e2eda9 detect collison between tanks
Thinker K.F. Li <thinker@branda.to>
parents: 131
diff changeset
239 }
131
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
240 }
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
241
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
242 rdman = X_MB_rdman(xmb_rt);
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
243 tman = X_MB_tman(xmb_rt);
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
244 factory = X_MB_ob_factory(xmb_rt);
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 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
247 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
248
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
249 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
250 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
251 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
252
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
253 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
254 /* Shift/move */
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
255 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
256 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
257 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
258 } else {
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
259 /* Change direction */
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
260 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
261 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
262 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
263 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
264 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
265 }
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
266
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
267 /* 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
268 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
269 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
270
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
271 get_now(&now);
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
272 mb_progm_start(progm, tman, &now);
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
273 }
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
274
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
275 /* @} */
6a8588df68af Tank can change direction and navigate on the mud area
Thinker K.F. Li <thinker@branda.to>
parents: 130
diff changeset
276
190
0a924eb9ccab Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents: 189
diff changeset
277 /*! \ingroup bullet_elf
0a924eb9ccab Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents: 189
diff changeset
278 * @{
0a924eb9ccab Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents: 189
diff changeset
279 */
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
280 /*! \brief Make coord objects for bullet elfs. */
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
281 static void make_bullet_elf_coords(redraw_man_t *rdman, coord_t **coord_pos,
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
282 coord_t **coord_rot,
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
283 coord_t **coord_center) {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
284 coord_t *coord_back;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
285
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
286 *coord_pos = rdman_coord_new(rdman, rdman->root_coord);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
287
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
288 coord_back = rdman_coord_new(rdman, *coord_pos);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
289 coord_back->matrix[2] = 25;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
290 coord_back->matrix[5] = 25;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
291 rdman_coord_changed(rdman, coord_back);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
292
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
293 *coord_rot = rdman_coord_new(rdman, coord_back);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
294
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
295 *coord_center = rdman_coord_new(rdman, *coord_rot);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
296 (*coord_center)->matrix[2] = -5;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
297 (*coord_center)->matrix[5] = +15;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
298 rdman_coord_changed(rdman, *coord_center);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
299 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
300
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
301 static tank_bullet_t *tank_bullet_new(redraw_man_t *rdman,
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
302 int map_x, int map_y,
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
303 int direction) {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
304 tank_bullet_t *bullet;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
305 coord_t *coord_center;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
306 co_aix *matrix;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
307 static float _sins[] = { 0, 1, 0, -1};
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
308 static float _coss[] = { 1, 0, -1, 0};
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
309 float _sin, _cos;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
310
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
311 bullet = O_ALLOC(tank_bullet_t);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
312 bullet->rdman = rdman;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
313
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
314 make_bullet_elf_coords(rdman, &bullet->coord_pos,
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
315 &bullet->coord_rot,
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
316 &coord_center);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
317 bullet->bullet_obj = bullet_new(rdman, coord_center);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
318
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
319 bullet->start_map_x = map_x;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
320 bullet->start_map_y = map_y;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
321 bullet->direction = direction;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
322 bullet->progm = NULL;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
323
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
324 matrix = bullet->coord_pos->matrix;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
325 matrix[2] = map_x * 50;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
326 matrix[5] = map_y * 50;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
327 rdman_coord_changed(rdman, bullet->coord_pos);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
328
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
329 _sin = _sins[direction];
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
330 _cos = _coss[direction];
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
331 matrix = bullet->coord_rot->matrix;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
332 matrix[0] = _cos;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
333 matrix[1] = -_sin;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
334 matrix[3] = _sin;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
335 matrix[4] = _cos;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
336
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
337 return bullet;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
338 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
339
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
340 static void tank_bullet_free(tank_bullet_t *bullet) {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
341 bullet_free(bullet->bullet_obj);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
342 rdman_coord_subtree_free(bullet->rdman, bullet->coord_pos);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
343 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
344
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
345 static void bullet_go_out_map(event_t *event, void *arg) {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
346 tank_t *tank = (tank_t *)arg;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
347 tank_bullet_t *bullet;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
353 if(bullet->hit_tmr != NULL)
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
354 mb_tman_remove(bullet->tman, bullet->hit_tmr);
156
2aad042b30a4 Bullet would be detected to hit a wall (not mud).
Thinker K.F. Li <thinker@branda.to>
parents: 155
diff changeset
355
2aad042b30a4 Bullet would be detected to hit a wall (not mud).
Thinker K.F. Li <thinker@branda.to>
parents: 155
diff changeset
356 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
357 rdman_coord_changed(rdman, bullet->coord_pos);
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
358
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
359 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
360 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
361 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
362 tank->bullet = NULL;
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
363 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
364
155
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
365 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
366 redraw_man_t *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
367 mb_tman_t *tman;
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 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
369 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
370 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
371 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
372 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
373 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
374
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 rdman = bullet->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
376 tman = bullet->tman;
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
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
378 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
379 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
380 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
381 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
382 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
383
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 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
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 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
387 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
388 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
389 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
390
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_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
392 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
393 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
394
193
923d91dfb6af Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
395 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
396 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
397 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
398
194
45d9a1e2764d Add mb_subtree_free animate action and fix bugs.
Thinker K.F. Li <thinker@branda.to>
parents: 193
diff changeset
399 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
400
193
923d91dfb6af Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
401 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
402
923d91dfb6af Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
403 /*! \todo Remove bang when program is completed.
923d91dfb6af Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
404 * The graphics are not removed from rdman after progm is completed, now.
923d91dfb6af Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
405 * They should be freed to release resources.
923d91dfb6af Hide bang before completed and remove progm after completed.
Thinker K.F. Li <thinker@branda.to>
parents: 192
diff changeset
406 */
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
407 get_now(&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
408 mb_progm_start(progm, tman, &now);
155
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
409 }
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
410
190
0a924eb9ccab Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents: 189
diff changeset
411 /*! \brief To check if a bullet hits walls or tanks. */
155
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
412 static void bullet_hit_chk(const mb_timeval_t *tmo,
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
413 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
414 void *arg) {
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
415 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
416 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
417 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
418 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
419 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
420 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
421 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
422 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
423 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
424 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
425 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
426 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
427
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
428 bullet = tank->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
429 bullet->hit_tmr = NULL; /* clear hit timer that bullet_go_out_map()
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
430 * can not remove it & currupt memory.
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 */
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
432
155
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_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
434 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
435 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
436 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
437 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
438 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
439 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
440 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
441
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
442 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
443 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
444 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
445 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
446 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
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
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 /*! \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
450 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
451 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
452 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
453 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
454 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
455 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
456 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
457 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
458 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
459 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
460 }
155
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
461 }
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
462
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 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
464 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
465 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
466 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
467 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
468 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
469 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
470 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
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
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 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
475 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
476 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
477 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
478 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
479 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
480 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
481 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
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
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_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
486 MB_TIMEVAL_ADD(&next, 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
487 bullet->hit_tmr = mb_tman_timeout(bullet->tman, &next,
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
488 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
489 }
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
490
190
0a924eb9ccab Group and document code of example tank.
Thinker K.F. Li <thinker@branda.to>
parents: 189
diff changeset
491 /*! \brief To fire a bullet for a tank. */
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
492 static void tank_fire_bullet(tank_rt_t *tank_rt, tank_t *tank) {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
493 X_MB_runtime_t *xmb_rt;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
494 redraw_man_t *rdman;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
495 int map_x, map_y;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
496 int shift_x, shift_y;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
497 int shift_len;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
498 int dir;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
499 tank_bullet_t *bullet;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
500 mb_progm_t *progm;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
501 mb_word_t *word;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
502 mb_action_t *act;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
503 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
504 mb_timeval_t now, next;
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
505 mb_tman_t *tman;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
506 subject_t *subject;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
507 static int map_xy_adj[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
508
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
509 if(tank->bullet != NULL)
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
510 return;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
511
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
512 xmb_rt = tank_rt->mb_rt;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
513 rdman = X_MB_rdman(xmb_rt);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
514 tman = X_MB_tman(xmb_rt);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
515
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
516 dir = tank->direction;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
517 map_x = tank->map_x + map_xy_adj[dir][0];
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
518 map_y = tank->map_y + map_xy_adj[dir][1];
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
519 switch(dir) {
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
520 case TD_UP:
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
521 shift_len = map_y + 1;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
522 shift_x = 0;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
523 shift_y = -shift_len * 50;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
524 break;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
525 case TD_RIGHT:
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
526 shift_len = 16 - map_x;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
527 shift_x = shift_len * 50;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
528 shift_y = 0;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
529 break;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
530 case TD_DOWN:
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
531 shift_len = 12 - map_y;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
532 shift_x = 0;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
533 shift_y = shift_len * 50;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
534 break;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
535 case TD_LEFT:
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
536 shift_len = map_x + 1;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
537 shift_x = -shift_len * 50;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
538 shift_y = 0;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
539 break;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
540 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
541
157
5cd12609a5c7 Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents: 156
diff changeset
542 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
543 return;
5cd12609a5c7 Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents: 156
diff changeset
544
5cd12609a5c7 Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents: 156
diff changeset
545 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
546 bullet = tank->bullet;
5cd12609a5c7 Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents: 156
diff changeset
547 bullet->tman = tman;
5cd12609a5c7 Make sure bullet is fired with positive shift length.
Thinker K.F. Li <thinker@branda.to>
parents: 156
diff changeset
548
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
549 progm = mb_progm_new(2, rdman);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
550 MB_TIMEVAL_SET(&start, 0, 0);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
551 MB_TIMEVAL_SET(&playing, shift_len / 4, (shift_len % 4) * 250000);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
552 word = mb_progm_next_word(progm, &start, &playing);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
553 act = mb_shift_new(shift_x, shift_y, bullet->coord_pos, word);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
554 bullet->progm = progm;
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
555
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
556 /*! \todo Simplify the procdure of using observer pattern. */
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
557 subject = mb_progm_get_complete(progm);
192
54fdc2a65242 Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents: 190
diff changeset
558 subject_add_observer(subject, bullet_go_out_map, tank);
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
559
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
560 get_now(&now);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
561 MB_TIMEVAL_CP(&bullet->start_time, &now);
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
562 mb_progm_start(progm, tman, &now);
155
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
563
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_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
565 MB_TIMEVAL_ADD(&next, &now);
6749f6639924 Fix bug for STAILQ that fail to remove a node.
Thinker K.F. Li <thinker@branda.to>
parents: 154
diff changeset
566 bullet->hit_tmr = mb_tman_timeout(tman, &next, bullet_hit_chk, tank);
154
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
567 }
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
574 #define CHANGE_POS(g, x, y) do { \
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
575 (g)->root_coord->matrix[0] = 1.0; \
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
576 (g)->root_coord->matrix[2] = x; \
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
577 (g)->root_coord->matrix[4] = 1.0; \
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
578 (g)->root_coord->matrix[5] = y; \
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
579 rdman_coord_changed(rdman, (g)->root_coord); \
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
580 } while(0)
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
6ce68c1f7405 Tank can fire bullet.
Thinker K.F. Li <thinker@branda.to>
parents: 153
diff changeset
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) {
ba581d8a4b9b Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
622 X_MB_runtime_t *mb_rt;
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;
ba581d8a4b9b Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
627 kbevents = X_MB_kbevents(mb_rt);
ba581d8a4b9b Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
628
ba581d8a4b9b Now, tank1 can be controlled by user with keyboard
Thinker K.F. Li <thinker@branda.to>
parents: 122
diff changeset
629 rdman = X_MB_rdman(mb_rt);
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
660 void
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
661 initial_tank(tank_rt_t *tank_rt, X_MB_runtime_t *mb_rt) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
664 mud_t *mud;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
665 brick_t *brick;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
666 rock_t *rock;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
673 int i, j;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
674
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
675 rdman = X_MB_rdman(mb_rt);
115
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
676
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
677 tank_rt->mb_rt = mb_rt;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
678 for(i = 0; i < 12; i++) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
679 for(j = 0; j < 16; j++) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
680 switch(map[i][j]) {
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
683 CHANGE_POS(mud, j * 50, i * 50);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
684 tank_rt->map[i][j] = (void *)mud;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
685 break;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
688 CHANGE_POS(brick, j * 50, i * 50);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
689 tank_rt->map[i][j] = (void *)brick;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
690 break;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
693 CHANGE_POS(rock, j * 50, i * 50);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
694 tank_rt->map[i][j] = (void *)rock;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
695 break;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
698 CHANGE_POS(bush, j * 50, i * 50);
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
699 tank_rt->map[i][j] = (void *)bush;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
700 break;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
701 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
702 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
703 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
722 }
Thinker K.F. Li <thinker@branda.to>
parents: 115
diff changeset
723 tank_rt->n_enemy = i;
120
5df7403b6fbc Fix bug of get_now()
Thinker K.F. Li <thinker@branda.to>
parents: 117
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
730 }
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
731
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
732 int
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
733 main(int argc, char *const argv[]) {
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
734 X_MB_runtime_t *rt;
115
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
735 tank_rt_t tank_rt;
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
736
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
737 rt = X_MB_new(":0.0", 800, 600);
115
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
740
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
741 X_MB_handle_connection(rt);
115
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
742
122
17e97e92b76e Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents: 120
diff changeset
743 X_MB_free(rt);
115
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
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 /* @} */