comparison examples/tank/tank_main.c @ 1027:c693cd8c6e23 refine_backend_if

Migrate examples/tank to new definition of backend
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 22 Nov 2010 17:02:49 +0800
parents 5235aded379c
children e415c55b4a0d
comparison
equal deleted inserted replaced
1026:407932b8a160 1027:c693cd8c6e23
57 int start_map_x, start_map_y; 57 int start_map_x, start_map_y;
58 int direction; 58 int direction;
59 mb_progm_t *progm; 59 mb_progm_t *progm;
60 mb_timeval_t start_time; 60 mb_timeval_t start_time;
61 observer_t *ob_redraw; 61 observer_t *ob_redraw;
62 mb_timer_t *hit_tmr; 62 int hit_tmr;
63 mb_tman_t *tman; 63 mb_timer_man_t *timer_man;
64 }; 64 };
65 typedef struct _tank_bullet tank_bullet_t; 65 typedef struct _tank_bullet tank_bullet_t;
66 /*! \brief The direction a bullet is going. 66 /*! \brief The direction a bullet is going.
67 */ 67 */
68 enum { BU_UP = 0, BU_RIGHT, BU_DOWN, BU_LEFT }; 68 enum { BU_UP = 0, BU_RIGHT, BU_DOWN, BU_LEFT };
104 tank_t *tank_enemies[10]; 104 tank_t *tank_enemies[10];
105 tank_en_t *tank_enemies_o[10]; 105 tank_en_t *tank_enemies_o[10];
106 tank_t *tanks[12]; 106 tank_t *tanks[12];
107 int n_tanks; 107 int n_tanks;
108 void *map[12][16]; 108 void *map[12][16];
109 X_MB_runtime_t *mb_rt; 109 mb_rt_t *mb_rt;
110 observer_t *kb_observer; 110 observer_t *kb_observer;
111 }; 111 };
112 112
113 /*! \ingroup tank_elf 113 /*! \ingroup tank_elf
114 * @{ 114 * @{
122 122
123 tank = O_ALLOC(tank_t); 123 tank = O_ALLOC(tank_t);
124 if(tank == NULL) 124 if(tank == NULL)
125 return NULL; 125 return NULL;
126 126
127 rdman = X_MB_rdman(tank_rt->mb_rt); 127 rdman = mb_runtime_rdman(tank_rt->mb_rt);
128 128
129 tank->coord_pos = coord_pos; 129 tank->coord_pos = coord_pos;
130 tank->coord_rot = coord_rot; 130 tank->coord_rot = coord_rot;
131 tank->map_x = map_x; 131 tank->map_x = map_x;
132 tank->map_y = map_y; 132 tank->map_y = map_y;
143 rdman_coord_changed(rdman, coord_pos); 143 rdman_coord_changed(rdman, coord_pos);
144 144
145 return tank; 145 return tank;
146 } 146 }
147 147
148 static void tank_free(tank_t *tank, X_MB_runtime_t *xmb_rt) { 148 static void tank_free(tank_t *tank, mb_rt_t *mb_rt) {
149 mb_tman_t *tman;
150
151 if(tank->progm) { 149 if(tank->progm) {
152 tman = X_MB_tman(xmb_rt);
153 mb_progm_abort(tank->progm); 150 mb_progm_abort(tank->progm);
154 } 151 }
155 free(tank); 152 free(tank);
156 } 153 }
157 154
168 165
169 #define PI 3.1415926 166 #define PI 3.1415926
170 167
171 static void tank_move(tank_t *tank, int direction, 168 static void tank_move(tank_t *tank, int direction,
172 tank_rt_t *tank_rt) { 169 tank_rt_t *tank_rt) {
173 X_MB_runtime_t *xmb_rt = tank_rt->mb_rt; 170 mb_rt_t *mb_rt = tank_rt->mb_rt;
174 redraw_man_t *rdman; 171 redraw_man_t *rdman;
175 mb_tman_t *tman; 172 mb_timer_man_t *timer_man;
176 ob_factory_t *factory; 173 ob_factory_t *factory;
177 /* for the program */ 174 /* for the program */
178 mb_progm_t *progm; 175 mb_progm_t *progm;
179 subject_t *comp_sub; 176 subject_t *comp_sub;
180 mb_word_t *word; 177 mb_word_t *word;
237 return; 234 return;
238 } 235 }
239 } 236 }
240 } 237 }
241 238
242 rdman = X_MB_rdman(xmb_rt); 239 rdman = mb_runtime_rdman(mb_rt);
243 tman = X_MB_tman(xmb_rt); 240 timer_man = mb_runtime_timer_man(mb_rt);
244 factory = X_MB_ob_factory(xmb_rt); 241 factory = mb_runtime_ob_factory(mb_rt);
245 242
246 progm = mb_progm_new(1, rdman); 243 progm = mb_progm_new(1, rdman);
247 tank->progm = progm; 244 tank->progm = progm;
248 245
249 MB_TIMEVAL_SET(&start, 0, 0); 246 MB_TIMEVAL_SET(&start, 0, 0);
267 /* Clean program when it is completed. */ 264 /* Clean program when it is completed. */
268 comp_sub = mb_progm_get_complete(progm); 265 comp_sub = mb_progm_get_complete(progm);
269 subject_add_observer(comp_sub, clean_tank_progm_handler, tank); 266 subject_add_observer(comp_sub, clean_tank_progm_handler, tank);
270 267
271 get_now(&now); 268 get_now(&now);
272 mb_progm_start(progm, tman, &now); 269 mb_progm_start(progm, timer_man, &now);
273 } 270 }
274 271
275 /* @} */ 272 /* @} */
276 273
277 /*! \ingroup bullet_elf 274 /*! \ingroup bullet_elf
308 static float _coss[] = { 1, 0, -1, 0}; 305 static float _coss[] = { 1, 0, -1, 0};
309 float _sin, _cos; 306 float _sin, _cos;
310 307
311 bullet = O_ALLOC(tank_bullet_t); 308 bullet = O_ALLOC(tank_bullet_t);
312 bullet->rdman = rdman; 309 bullet->rdman = rdman;
310 bullet->hit_tmr = -1;
313 311
314 make_bullet_elf_coords(rdman, &bullet->coord_pos, 312 make_bullet_elf_coords(rdman, &bullet->coord_pos,
315 &bullet->coord_rot, 313 &bullet->coord_rot,
316 &coord_center); 314 &coord_center);
317 bullet->bullet_obj = bullet_new(rdman, coord_center); 315 bullet->bullet_obj = bullet_new(rdman, coord_center);
336 334
337 return bullet; 335 return bullet;
338 } 336 }
339 337
340 static void tank_bullet_free(tank_bullet_t *bullet) { 338 static void tank_bullet_free(tank_bullet_t *bullet) {
339 if(bullet->hit_tmr != -1)
340 mb_timer_man_remove(bullet->timer_man, bullet->hit_tmr);
341 bullet_free(bullet->bullet_obj); 341 bullet_free(bullet->bullet_obj);
342 rdman_coord_subtree_free(bullet->rdman, bullet->coord_pos); 342 rdman_coord_subtree_free(bullet->rdman, bullet->coord_pos);
343 } 343 }
344 344
345 static void bullet_go_out_map(event_t *event, void *arg) { 345 static void bullet_go_out_map(event_t *event, void *arg) {
348 redraw_man_t *rdman; 348 redraw_man_t *rdman;
349 349
350 bullet = tank->bullet; 350 bullet = tank->bullet;
351 rdman = bullet->rdman; 351 rdman = bullet->rdman;
352 352
353 if(bullet->hit_tmr != NULL) 353 if(bullet->hit_tmr != -1) {
354 mb_tman_remove(bullet->tman, bullet->hit_tmr); 354 mb_timer_man_remove(bullet->timer_man, bullet->hit_tmr);
355 bullet->hit_tmr = -1;
356 }
355 357
356 coord_hide(bullet->coord_pos); 358 coord_hide(bullet->coord_pos);
357 rdman_coord_changed(rdman, bullet->coord_pos); 359 rdman_coord_changed(rdman, bullet->coord_pos);
358 360
359 bullet = tank->bullet; 361 bullet = tank->bullet;
362 tank->bullet = NULL; 364 tank->bullet = NULL;
363 } 365 }
364 366
365 static void bullet_bang(tank_bullet_t *bullet, int map_x, int map_y) { 367 static void bullet_bang(tank_bullet_t *bullet, int map_x, int map_y) {
366 redraw_man_t *rdman; 368 redraw_man_t *rdman;
367 mb_tman_t *tman; 369 mb_timer_man_t *timer_man;
368 mb_progm_t *progm; 370 mb_progm_t *progm;
369 mb_word_t *word; 371 mb_word_t *word;
370 mb_timeval_t start, playing; 372 mb_timeval_t start, playing;
371 mb_timeval_t now; 373 mb_timeval_t now;
372 bang_t *bang; 374 bang_t *bang;
373 co_aix *matrix; 375 co_aix *matrix;
374 376
375 rdman = bullet->rdman; 377 rdman = bullet->rdman;
376 tman = bullet->tman; 378 timer_man = bullet->timer_man;
377 379
378 bang = bang_new(rdman, rdman->root_coord); 380 bang = bang_new(rdman, rdman->root_coord);
379 matrix = bang->root_coord->matrix; 381 matrix = bang->root_coord->matrix;
380 matrix[2] = map_x * 50; 382 matrix[2] = map_x * 50;
381 matrix[5] = map_y * 50; 383 matrix[5] = map_y * 50;
399 mb_subtree_free_new(bang->root_coord, word); 401 mb_subtree_free_new(bang->root_coord, word);
400 402
401 mb_progm_free_completed(progm); 403 mb_progm_free_completed(progm);
402 404
403 get_now(&now); 405 get_now(&now);
404 mb_progm_start(progm, tman, &now); 406 mb_progm_start(progm, timer_man, &now);
405 } 407 }
406 408
407 /*! \brief To check if a bullet hits walls or tanks. */ 409 /*! \brief To check if a bullet hits walls or tanks. */
408 static void bullet_hit_chk(const mb_timeval_t *tmo, 410 static void bullet_hit_chk(int hdl,
411 const mb_timeval_t *tmo,
409 const mb_timeval_t *now, 412 const mb_timeval_t *now,
410 void *arg) { 413 void *arg) {
411 tank_t *tank = (tank_t *)arg; 414 tank_t *tank = (tank_t *)arg;
412 tank_rt_t *tank_rt = tank->tank_rt; 415 tank_rt_t *tank_rt = tank->tank_rt;
413 tank_t *tank_hitted; 416 tank_t *tank_hitted;
420 int dir; 423 int dir;
421 int i; 424 int i;
422 static int move_adj[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; 425 static int move_adj[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
423 426
424 bullet = tank->bullet; 427 bullet = tank->bullet;
425 bullet->hit_tmr = NULL; /* clear hit timer that bullet_go_out_map() 428 bullet->hit_tmr = -1; /* clear hit timer that bullet_go_out_map()
426 * can not remove it & currupt memory. 429 * can not remove it & currupt memory.
427 */ 430 */
428 431
429 MB_TIMEVAL_CP(&diff, now); 432 MB_TIMEVAL_CP(&diff, now);
430 MB_TIMEVAL_DIFF(&diff, &bullet->start_time); 433 MB_TIMEVAL_DIFF(&diff, &bullet->start_time);
431 MB_TIMEVAL_SET(&unit_tm, 0, 250000); 434 MB_TIMEVAL_SET(&unit_tm, 0, 250000);
432 move_units_f = MB_TIMEVAL_DIV(&diff, &unit_tm); 435 move_units_f = MB_TIMEVAL_DIV(&diff, &unit_tm);
478 } 481 }
479 } 482 }
480 483
481 MB_TIMEVAL_SET(&next, 0, 100000); 484 MB_TIMEVAL_SET(&next, 0, 100000);
482 MB_TIMEVAL_ADD(&next, now); 485 MB_TIMEVAL_ADD(&next, now);
483 bullet->hit_tmr = mb_tman_timeout(bullet->tman, &next, 486 bullet->hit_tmr = mb_timer_man_timeout(bullet->timer_man, &next,
484 bullet_hit_chk, arg); 487 bullet_hit_chk, arg);
485 } 488 }
486 489
487 /*! \brief To fire a bullet for a tank. */ 490 /*! \brief To fire a bullet for a tank. */
488 static void tank_fire_bullet(tank_rt_t *tank_rt, tank_t *tank) { 491 static void tank_fire_bullet(tank_rt_t *tank_rt, tank_t *tank) {
489 X_MB_runtime_t *xmb_rt; 492 mb_rt_t *mb_rt;
490 redraw_man_t *rdman; 493 redraw_man_t *rdman;
491 int map_x, map_y; 494 int map_x, map_y;
492 int shift_x, shift_y; 495 int shift_x, shift_y;
493 int shift_len; 496 int shift_len;
494 int dir; 497 int dir;
496 mb_progm_t *progm; 499 mb_progm_t *progm;
497 mb_word_t *word; 500 mb_word_t *word;
498 mb_action_t *act; 501 mb_action_t *act;
499 mb_timeval_t start, playing; 502 mb_timeval_t start, playing;
500 mb_timeval_t now, next; 503 mb_timeval_t now, next;
501 mb_tman_t *tman; 504 mb_timer_man_t *timer_man;
502 subject_t *subject; 505 subject_t *subject;
503 static int map_xy_adj[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; 506 static int map_xy_adj[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
504 507
505 if(tank->bullet != NULL) 508 if(tank->bullet != NULL)
506 return; 509 return;
507 510
508 xmb_rt = tank_rt->mb_rt; 511 mb_rt = tank_rt->mb_rt;
509 rdman = X_MB_rdman(xmb_rt); 512 rdman = mb_runtime_rdman(mb_rt);
510 tman = X_MB_tman(xmb_rt); 513 timer_man = mb_runtime_timer_man(mb_rt);
511 514
512 dir = tank->direction; 515 dir = tank->direction;
513 map_x = tank->map_x + map_xy_adj[dir][0]; 516 map_x = tank->map_x + map_xy_adj[dir][0];
514 map_y = tank->map_y + map_xy_adj[dir][1]; 517 map_y = tank->map_y + map_xy_adj[dir][1];
515 switch(dir) { 518 switch(dir) {
538 if(shift_len <= 0) 541 if(shift_len <= 0)
539 return; 542 return;
540 543
541 tank->bullet = tank_bullet_new(rdman, map_x, map_y, dir); 544 tank->bullet = tank_bullet_new(rdman, map_x, map_y, dir);
542 bullet = tank->bullet; 545 bullet = tank->bullet;
543 bullet->tman = tman; 546 bullet->timer_man = timer_man;
544 547
545 progm = mb_progm_new(2, rdman); 548 progm = mb_progm_new(2, rdman);
546 MB_TIMEVAL_SET(&start, 0, 0); 549 MB_TIMEVAL_SET(&start, 0, 0);
547 MB_TIMEVAL_SET(&playing, shift_len / 4, (shift_len % 4) * 250000); 550 MB_TIMEVAL_SET(&playing, shift_len / 4, (shift_len % 4) * 250000);
548 word = mb_progm_next_word(progm, &start, &playing); 551 word = mb_progm_next_word(progm, &start, &playing);
553 subject = mb_progm_get_complete(progm); 556 subject = mb_progm_get_complete(progm);
554 subject_add_observer(subject, bullet_go_out_map, tank); 557 subject_add_observer(subject, bullet_go_out_map, tank);
555 558
556 get_now(&now); 559 get_now(&now);
557 MB_TIMEVAL_CP(&bullet->start_time, &now); 560 MB_TIMEVAL_CP(&bullet->start_time, &now);
558 mb_progm_start(progm, tman, &now); 561 mb_progm_start(progm, timer_man, &now);
559 562
560 MB_TIMEVAL_SET(&next, 0, 100000); 563 MB_TIMEVAL_SET(&next, 0, 100000);
561 MB_TIMEVAL_ADD(&next, &now); 564 MB_TIMEVAL_ADD(&next, &now);
562 bullet->hit_tmr = mb_tman_timeout(tman, &next, bullet_hit_chk, tank); 565 bullet->hit_tmr = mb_timer_man_timeout(timer_man, &next,
566 bullet_hit_chk, tank);
563 } 567 }
564 568
565 /* @} */ 569 /* @} */
566 570
567 /*! \ingroup tank 571 /*! \ingroup tank
613 } 617 }
614 618
615 } 619 }
616 620
617 static void init_keyboard(tank_rt_t *tank_rt) { 621 static void init_keyboard(tank_rt_t *tank_rt) {
618 X_MB_runtime_t *mb_rt; 622 mb_rt_t *mb_rt;
619 subject_t *kbevents; 623 subject_t *kbevents;
620 redraw_man_t *rdman; 624 redraw_man_t *rdman;
621 625
622 mb_rt = tank_rt->mb_rt; 626 mb_rt = tank_rt->mb_rt;
623 kbevents = X_MB_kbevents(mb_rt); 627 kbevents = mb_runtime_kbevents(mb_rt);
624 628
625 rdman = X_MB_rdman(mb_rt); 629 rdman = mb_runtime_rdman(mb_rt);
626 630
627 tank_rt->kb_observer = 631 tank_rt->kb_observer =
628 subject_add_observer(kbevents, keyboard_handler, tank_rt); 632 subject_add_observer(kbevents, keyboard_handler, tank_rt);
629 } 633 }
630 634
652 (*coord_center)->matrix[5] = -25; 656 (*coord_center)->matrix[5] = -25;
653 rdman_coord_changed(rdman, *coord_center); 657 rdman_coord_changed(rdman, *coord_center);
654 } 658 }
655 659
656 void 660 void
657 initial_tank(tank_rt_t *tank_rt, X_MB_runtime_t *mb_rt) { 661 initial_tank(tank_rt_t *tank_rt, mb_rt_t *mb_rt) {
658 redraw_man_t *rdman; 662 redraw_man_t *rdman;
659 /* for map areas */ 663 /* for map areas */
660 mud_t *mud; 664 mud_t *mud;
661 brick_t *brick; 665 brick_t *brick;
662 rock_t *rock; 666 rock_t *rock;
666 tank1_t *tank1_o; 670 tank1_t *tank1_o;
667 tank2_t *tank2_o; 671 tank2_t *tank2_o;
668 tank_en_t *tank_en_o; 672 tank_en_t *tank_en_o;
669 int i, j; 673 int i, j;
670 674
671 rdman = X_MB_rdman(mb_rt); 675 rdman = mb_runtime_rdman(mb_rt);
672 676
673 tank_rt->mb_rt = mb_rt; 677 tank_rt->mb_rt = mb_rt;
674 for(i = 0; i < 12; i++) { 678 for(i = 0; i < 12; i++) {
675 for(j = 0; j < 16; j++) { 679 for(j = 0; j < 16; j++) {
676 switch(map[i][j]) { 680 switch(map[i][j]) {
725 init_keyboard(tank_rt); 729 init_keyboard(tank_rt);
726 } 730 }
727 731
728 int 732 int
729 main(int argc, char *const argv[]) { 733 main(int argc, char *const argv[]) {
730 X_MB_runtime_t *rt; 734 mb_rt_t *rt;
731 tank_rt_t tank_rt; 735 tank_rt_t tank_rt;
732 736
733 rt = X_MB_new(":0.0", 800, 600); 737 rt = mb_runtime_new(":0.0", 800, 600);
734 738
735 initial_tank(&tank_rt, rt); 739 initial_tank(&tank_rt, rt);
736 740
737 X_MB_handle_connection(rt); 741 mb_runtime_event_loop(rt);
738 742
739 X_MB_free(rt); 743 mb_runtime_free(rt);
740 } 744 }
741 745
742 /* @} */ 746 /* @} */