comparison Renderer/Application/ieshoot.cc @ 507:735f76483bb2

Reorganization..
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 12 Oct 2009 09:39:35 +0900
parents
children
comparison
equal deleted inserted replaced
506:1d4a8a86f26b 507:735f76483bb2
1 #include "SceneGraphRoot.h"
2 #include "SGList.h"
3
4 static const float jiki_speed = 6.0f;
5 static const float jiki_radius = 32.0f;
6
7 static const float tama_speed = 10.0f;
8 static const float tama_radius = 16.0f;
9
10 static const float boss_radius_x = 64.0f;
11 static const float boss_radius_y = 128.0f;
12
13 static const float iebosstama_speed = 15.0f;
14
15 static void
16 ieboss_collision(SceneGraphPtr node, int screen_w, int screen_h,
17 SceneGraphPtr tree);
18 static void
19 ieboss_collision_invincibil(SceneGraphPtr node, int screen_w, int screen_h, SceneGraphPtr tree);
20 static void ieboss_move(SceneGraphPtr node, int screen_w, int screen_h);
21
22 static void iebosstama_move(SceneGraphPtr node, int screen_w, int screen_h);
23
24
25 static void
26 iejiki_collision(SceneGraphPtr node, int screen_w, int screen_h,
27 SceneGraphPtr tree)
28 {
29 }
30
31 static void
32 ietama_collision(SceneGraphPtr node, int screen_w, int screen_h,
33 SceneGraphPtr tree)
34 {
35 }
36
37 static void
38 ieboss_collision(SceneGraphPtr node, int screen_w, int screen_h,
39 SceneGraphPtr tree)
40 {
41 SceneGraphIteratorPtr it = sgroot->getIterator(tree);
42 static int damage = 0;
43
44 for (; it->hasNext(IETAMA);) {
45 it->next(IETAMA);
46 SceneGraphPtr tama = it->get();
47
48 if (node->xyz[0] - boss_radius_x < tama->xyz[0] + tama_radius
49 && node->xyz[0] + boss_radius_x > tama->xyz[0] - tama_radius
50 && node->xyz[1] + boss_radius_y > tama->xyz[1] - tama_radius) {
51 tama->remove();
52
53 node->set_move_collision(ieboss_move, ieboss_collision_invincibil);
54
55 SceneGraphPtr iebosstama = sgroot->createSceneGraph(Earth);
56 iebosstama->set_move_collision(iebosstama_move, ietama_collision);
57 iebosstama->xyz[0] = node->xyz[0];
58 iebosstama->xyz[1] = node->xyz[1] + boss_radius_y;
59 //iebosstama->xyz[2] = 50.0f;
60 node->addBrother(iebosstama);
61
62 damage++;
63 }
64 }
65
66 if (damage > 10) {
67 node->remove();
68 }
69 }
70
71 static void
72 ieboss_move(SceneGraphPtr node, int screen_w, int screen_h)
73 {
74 /**
75 * TODO
76 * Boss が複数居た場合、これじゃ駄目
77 */
78 static float x_speed = 5.0f;
79 static float z_speed = 5.0f;
80
81 node->xyz[0] += x_speed;
82
83 if (node->xyz[0] - boss_radius_x < 0) {
84 x_speed = -x_speed;
85 node->xyz[0] = boss_radius_x;
86 } else if (node->xyz[0] + boss_radius_x > screen_w) {
87 x_speed = -x_speed;
88 node->xyz[0] = screen_w - boss_radius_x;
89 }
90
91 //node->xyz[2] += z_speed;
92 if (node->xyz[2] >= 100.0f) {
93 node->xyz[2] = 99.99f;
94 z_speed = -z_speed;
95 } else if (node->xyz[2] <= -100.0f) {
96 node->xyz[2] = -99.99f;
97 z_speed = -z_speed;
98 }
99 }
100
101 static void
102 ieboss_collision_invincibil(SceneGraphPtr node, int screen_w, int screen_h,
103 SceneGraphPtr tree)
104 {
105 static int frame = 0;
106
107 frame++;
108
109 node->flag_drawable ^= 1;
110
111 if (frame > 60) {
112 frame = 0;
113 node->flag_drawable = 1;
114 node->set_move_collision(ieboss_move, ieboss_collision);
115 }
116 }
117
118 static void
119 iebosstama_move(SceneGraphPtr node, int screen_w, int screen_h)
120 {
121 node->xyz[1] += iebosstama_speed;
122
123 // 描画領域から抜けたら削除
124 if (node->xyz[1] > screen_h) {
125 node->remove();
126 }
127 }
128
129 static void
130 ietama_move(SceneGraphPtr node, int screen_w, int screen_h)
131 {
132 node->xyz[1] -= tama_speed;
133
134 // 描画領域から抜けたら削除
135 if (node->xyz[1] < 0) {
136 node->remove();
137 }
138 }
139
140 static void
141 iejiki_move(SceneGraphPtr node, int screen_w, int screen_h)
142 {
143 Pad *pad = sgroot->getController();
144
145 if (pad->left.isPush()
146 || pad->left.isHold()) {
147 node->xyz[0] -= jiki_speed;
148
149 if (node->xyz[0] - jiki_radius< 0) {
150 node->xyz[0] = jiki_radius;
151 }
152 }
153
154 if (pad->right.isPush()
155 || pad->right.isHold()) {
156 node->xyz[0] += jiki_speed;
157
158 if (node->xyz[0] + jiki_radius > screen_w) {
159 node->xyz[0] = screen_w - jiki_radius;
160 }
161 }
162
163 if (pad->up.isPush()
164 || pad->up.isHold()) {
165 node->xyz[1] -= jiki_speed;
166
167 if (node->xyz[1] - jiki_radius < 0) {
168 node->xyz[1] = jiki_radius;
169 }
170 }
171
172 if (pad->down.isPush()
173 || pad->down.isHold()) {
174 node->xyz[1] += jiki_speed;
175
176 if (node->xyz[1] + jiki_radius > screen_h) {
177 node->xyz[1] = screen_h - jiki_radius;
178 }
179 }
180
181 if (pad->circle.isPush()) {
182 SceneGraphPtr ietama = sgroot->createSceneGraph(IETAMA);
183 ietama->set_move_collision(ietama_move, ietama_collision);
184 ietama->xyz[0] = node->xyz[0];
185 ietama->xyz[1] = node->xyz[1];
186 node->addBrother(ietama);
187 }
188 }
189
190
191 void
192 ieshoot_init(TaskManager *manager)
193 {
194 SceneGraphPtr iejiki;
195 SceneGraphPtr enemy;
196 SceneGraphPtr back;
197
198 sgroot->createFromXMLfile(manager, "xml_file/ietama.xml");
199 sgroot->createFromXMLfile(manager, "xml_file/ieboss.xml");
200 sgroot->createFromXMLfile(manager, "xml_file/iejiki.xml");
201 sgroot->createFromXMLfile(manager, "xml_file/universe.xml");
202
203 back = sgroot->createSceneGraph();
204
205 iejiki = sgroot->createSceneGraph(IEJIKI);
206 iejiki->set_move_collision(iejiki_move, iejiki_collision);
207 iejiki->xyz[2] = 20;
208 back->addChild(iejiki);
209
210 enemy = sgroot->createSceneGraph(IEBOSS);
211 enemy->set_move_collision(ieboss_move, ieboss_collision);
212 enemy->xyz[1] = boss_radius_y;
213 back->addChild(enemy);
214
215 sgroot->setSceneData(back);
216 }