tetris_view.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * File : tetris_view.c
  3. * This file is part of RTGUI in RT-Thread RTOS
  4. * COPYRIGHT (C) 2010, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2010-08-14 Yi.Qiu first version
  13. */
  14. #include <rtthread.h>
  15. #include <rtgui/rtgui.h>
  16. #include <rtgui/rtgui_system.h>
  17. #include <rtgui/widgets/view.h>
  18. #include <rtgui/dc.h>
  19. #include "tetris.h"
  20. static rt_err_t _rt_tetris_view_update(rt_tetris_view_t* thiz, rt_tetris_t* tetris);
  21. static rt_err_t _rt_tetris_view_update_next_brick(rt_tetris_view_t* thiz, rt_tetris_t* tetris);
  22. static rt_err_t _rt_tetris_view_update_level(rt_tetris_view_t* thiz, rt_tetris_t* tetris);
  23. static rt_err_t _rt_tetris_view_update_score_and_lines(rt_tetris_view_t* thiz, rt_tetris_t* tetris);
  24. rt_tetris_view_t* rt_tetris_view_create(void* private)
  25. {
  26. rt_tetris_view_t* thiz;
  27. RT_ASSERT(private != RT_NULL)
  28. thiz = (rt_tetris_view_t*)rt_malloc(sizeof(rt_tetris_view_t));
  29. thiz->width = 96;
  30. thiz->height = 96;
  31. thiz->update = _rt_tetris_view_update;
  32. thiz->update_next_brick = _rt_tetris_view_update_next_brick;
  33. thiz->update_level = _rt_tetris_view_update_level;
  34. thiz->update_score_and_lines = _rt_tetris_view_update_score_and_lines;
  35. thiz->private = private;
  36. return thiz;
  37. }
  38. rt_err_t rt_tetris_view_destroy(rt_tetris_view_t* thiz)
  39. {
  40. RT_ASSERT(thiz != RT_NULL);
  41. rt_free(thiz);
  42. return RT_EOK;
  43. }
  44. static rt_err_t _rt_tetris_view_update_next_brick(rt_tetris_view_t* thiz, rt_tetris_t* tetris)
  45. {
  46. struct rtgui_dc* dc;
  47. struct rtgui_rect rect;
  48. rt_uint32_t width;
  49. rt_uint32_t ppb, i;
  50. rtgui_widget_t* widget;
  51. rt_uint32_t* next_brick;
  52. RT_ASSERT(thiz != RT_NULL);
  53. RT_ASSERT(tetris != RT_NULL);
  54. next_brick = rt_tetris_next_brick(tetris);
  55. widget = (rtgui_widget_t*)thiz->private;
  56. width = rt_tetris_width(tetris);
  57. /* pixel per block */
  58. ppb = thiz->width / width;
  59. dc = rtgui_dc_begin_drawing(widget);
  60. if (dc == RT_NULL) return -RT_ERROR;
  61. rect.x1 = 100;
  62. rect.x2 = rect.x1 + 4 * ppb;
  63. rect.y1 = 16;
  64. rect.y2 = rect.y1 + 2 * ppb;
  65. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0xff, 0xff);
  66. rtgui_dc_fill_rect(dc, &rect);
  67. for(i=0; i<4; i++)
  68. {
  69. rt_uint32_t y = next_brick[i] / width;
  70. rt_uint32_t x = next_brick[i] % width;
  71. rect.x1 = 100 + ppb * (x - 6);
  72. rect.x2 = rect.x1 + ppb - 1;
  73. rect.y1 = 16 + ppb * y ;
  74. rect.y2 = rect.y1 + ppb - 1;
  75. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0x00, 0x00);
  76. rtgui_dc_fill_rect(dc, &rect);
  77. }
  78. rtgui_dc_end_drawing(dc, RT_TRUE);
  79. return RT_EOK;
  80. }
  81. static rt_err_t _rt_tetris_view_update_level(rt_tetris_view_t* thiz, rt_tetris_t* tetris)
  82. {
  83. struct rtgui_dc* dc;
  84. struct rtgui_rect rect;
  85. rtgui_widget_t* widget;
  86. char text[4];
  87. RT_ASSERT(thiz != RT_NULL);
  88. RT_ASSERT(tetris != RT_NULL);
  89. widget = (rtgui_widget_t*)thiz->private;
  90. dc = rtgui_dc_begin_drawing(widget);
  91. if (dc == RT_NULL) return -RT_ERROR;
  92. rect.x1 = 96;
  93. rect.y1 = 42;
  94. rect.x2 = 128;
  95. rect.y2 = rect.y1 + 10;
  96. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0xff, 0xff);
  97. rtgui_dc_fill_rect(dc, &rect);
  98. rt_sprintf(text, "%d", rt_tetris_level(tetris));
  99. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0x00, 0x00);
  100. rtgui_dc_draw_text(dc, text, &rect);
  101. /* Redraw panel */
  102. rtgui_dc_end_drawing(dc, RT_TRUE);
  103. return RT_EOK;
  104. }
  105. static rt_err_t _rt_tetris_view_update_score_and_lines(rt_tetris_view_t* thiz, rt_tetris_t* tetris)
  106. {
  107. struct rtgui_dc* dc;
  108. struct rtgui_rect rect;
  109. rtgui_widget_t* widget;
  110. char text[4];
  111. RT_ASSERT(thiz != RT_NULL);
  112. RT_ASSERT(tetris != RT_NULL);
  113. widget = (rtgui_widget_t*)thiz->private;
  114. dc = rtgui_dc_begin_drawing(widget);
  115. if (dc == RT_NULL) return -RT_ERROR;
  116. rect.x1 = 96;
  117. rect.y1 = 64;
  118. rect.x2 = 128;
  119. rect.y2 = rect.y1 + 10;
  120. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0xff, 0xff);
  121. rtgui_dc_fill_rect(dc, &rect);
  122. rt_sprintf(text, "%d", rt_tetris_lines(tetris));
  123. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0x00, 0x00);
  124. rtgui_dc_draw_text(dc, text, &rect);
  125. rect.y1 += 22;
  126. rect.y2 = rect.y1 + 10;
  127. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0xff, 0xff);
  128. rtgui_dc_fill_rect(dc, &rect);
  129. rt_sprintf(text, "%d", rt_tetris_score(tetris));
  130. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0x00, 0x00);
  131. rtgui_dc_draw_text(dc, text, &rect);
  132. /* Redraw panel */
  133. rtgui_dc_end_drawing(dc, RT_TRUE);
  134. return RT_EOK;
  135. }
  136. static rt_err_t _rt_tetris_view_update(rt_tetris_view_t* thiz, rt_tetris_t* tetris)
  137. {
  138. struct rtgui_dc* dc;
  139. struct rtgui_rect rect;
  140. rt_uint32_t width, height;
  141. rt_uint32_t j,k, ppb;
  142. rtgui_widget_t* widget;
  143. RT_ASSERT(thiz != RT_NULL);
  144. RT_ASSERT(tetris != RT_NULL);
  145. widget = (rtgui_widget_t*)thiz->private;
  146. width = rt_tetris_width(tetris);
  147. height = rt_tetris_height(tetris);
  148. ppb = thiz->width / width;
  149. dc = rtgui_dc_begin_drawing(widget);
  150. if (dc == RT_NULL) return -RT_ERROR;
  151. /* Redraw panel */
  152. for(j=0; j<width; j++)
  153. {
  154. for(k=1; k<height; k++)
  155. {
  156. rect.x1 = ppb * j;
  157. rect.x2 = ppb * (j + 1) - 1;
  158. rect.y1 = ppb * (k - 1);
  159. rect.y2 = ppb * k - 1;
  160. if(rt_tetris_check_collision(tetris, k * width + j))
  161. {
  162. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0xff, 0xff);
  163. }
  164. else
  165. {
  166. RTGUI_DC_BC(dc) = RTGUI_RGB(0xff, 0x00, 0x00);
  167. }
  168. rtgui_dc_fill_rect(dc, &rect);
  169. }
  170. }
  171. /* Redraw panel */
  172. rtgui_dc_end_drawing(dc, RT_TRUE);
  173. return RT_EOK;
  174. }