微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第25章 Sprites

第25章 Sprites

时间:10-02 整理:3721RD 点击:

第25章 Sprites


    本期教程主要是跟大家讲解sprite的显示,这里讲的sprite跟第23章讲的游标是类似的,只是这里的游标是可以任意跑动的,可以根据程序设置跑动的路径。

    25. 1 介绍

    25. 2 模拟器上演示sprite例子

    25. 3总结


25.1 介绍

    emWin sprite作为一种纯粹的软件解决方案实现。使用emWin sprite不需要额外的硬件。它们可以显示、移动和删除,而不影响当前可见的图形项目。

存储器要求

    每个sprite都需要一个存储器区,用于保存sprite后面的显示数据,以便在移动或删除sprite时能

恢复背景显示。另外需要一个存储区,用作颜色缓存。颜色缓存的大小取决于sprite图像中使用的颜色数量。因此,sprite需要的全部字节数可以按以下等式计算:

    SizeOfSpriteObject (~30 bytes) +

    (XSize * YSize + NumberOfBitmapColors) * REQUIRED_BYTES_PER_PIXEL

Sprite的最大数目

    emWin并不限制同时可见的sprite的数量。具体取决于可用存储器的大小。

性能

    需要注意的是,绘制sprite比绘制简单的位图需要耗费更多计算资源,因为需要处理背景数据以及与其他sprite的交叉点。

叠置顺序

    叠置顺序是对有重叠的二维对象 (此处为sprite)的排序。当两个sprite重叠时,它们的叠置顺序决定了哪个sprite位于另一个sprite的上方。最后创建的sprite位于最上面。


25.2 模拟器上演示sprite例子

    模拟器中有一个例子专门做了sprite的演示,这个例子位置在:



此DEMO的实际代码如下:

  1. /*********************************************************************
  2. *
  3. *       Dolphin bitmap arrays
  4. */
  5. GUI_CONST_STORAGE GUI_BITMAP * _apImages_0[] = {(1)
  6. &bmDolphin_00,
  7. &bmDolphin_01,
  8. &bmDolphin_02,
  9. &bmDolphin_03,
  10. &bmDolphin_04,
  11. };

  12. GUI_CONST_STORAGE GUI_BITMAP * _apImages_1[] = {   (2)
  13. &bmDolphin_10,
  14. &bmDolphin_11,
  15. &bmDolphin_12,
  16. &bmDolphin_13,
  17. &bmDolphin_14,
  18. };

  19. /*********************************************************************
  20. *
  21. *       Sprite array
  22. */
  23. static SPRITE _aSprite[] = {
  24.   { -90,  20, 10,  3, GUI_COUNTOF(_apImages_1), _apImages_1},
  25.   { 290, 150, -8, -2, GUI_COUNTOF(_apImages_0), _apImages_0},
  26. };

  27. /*********************************************************************
  28. *
  29. *       Static code
  30. *
  31. **********************************************************************
  32. */
  33. /*********************************************************************
  34. *
  35. *       _MoveSprite
  36. */
  37. static void _MoveSprite(SPRITE * pSprite) {
  38.   //
  39.   // Set new index
  40.   //
  41.   pSprite->Index += 1;
  42.   if (pSprite->Index >= pSprite->NumImages) { (3)
  43.     pSprite->Index = 0;
  44.   }
  45.   //
  46.   // Adjust X-position
  47.   //
  48.   pSprite->xPos += pSprite->dx;(4)
  49.   if (pSprite->xPos > 320) {
  50.     pSprite->xPos = -1L * pSprite->apImages[pSprite->Index]->XSize;
  51.   }
  52.   if (pSprite->xPos < -1L * pSprite->apImages[pSprite->Index]->XSize) {
  53.     pSprite->xPos = 320;
  54.   }
  55.   //
  56.   // Adjust Y-position
  57.   //
  58.   pSprite->yPos += pSprite->dy;  (5)
  59.   if (pSprite->yPos < 0) {
  60.     pSprite->dy = -pSprite->dy;
  61.   }
  62.   if (pSprite->yPos > (240 - pSprite->apImages[pSprite->Index]->YSize)) {
  63.     pSprite->dy = -1 * pSprite->dy;
  64.   }
  65.   //
  66.   // Change sprite
  67.   //(6)
  68.   GUI_SPRITE_SetBitmapAndPosition(pSprite->hSprite, pSprite->apImages[pSprite->Index], pSprite->xPos, pSprite->yPos);
  69. }

  70. /*********************************************************************
  71. *
  72. *       _ShowSprites
  73. */
  74. static void _ShowSprites(void) {
  75.   unsigned i;

  76.   //
  77.   // Create the sprites
  78.   //
  79.   for (i = 0; i < GUI_COUNTOF(_aSprite); i++) {  (7)
  80.     _aSprite[i].hSprite = GUI_SPRITE_Create(_aSprite[i].apImages[0], _aSprite[i].xPos, _aSprite[i].yPos);
  81.   }
  82.   //
  83.   // Move them forever...
  84.   //
  85.   while (1) {
  86.     for (i = 0; i < GUI_COUNTOF(_aSprite); i++) {
  87.       _MoveSprite(&_aSprite[i]);
  88.       GUI_Delay(100);
  89.     }
  90.   }
  91. }

  92. /*********************************************************************
  93. *
  94. *       _DrawBackground
  95. */
  96. static void _DrawBackground(void) {
  97.   GUI_DrawGradientV(0, 0, 319, 239, 0xffffff, 0xff0000);  // Draw background gradient
  98.   GUI_SetTextMode(GUI_TM_TRANS);
  99.   GUI_SetFont(&GUI_Font24B_ASCII);
  100.   GUI_SetColor(GUI_BLACK);
  101.   GUI_DispStringHCenterAt("Showing sprites...", 160, 20); // Draw sample text
  102.   GUI_DrawBitmap(&bmSeggerLogoLarge, 60, 80);             // Draw company logo
  103. }

  104. /*********************************************************************
  105. *
  106. *       Public code
  107. *
  108. **********************************************************************
  109. */
  110. /*********************************************************************
  111. *
  112. *       MainTask
  113. */
  114. void MainTask(void) {
  115.   GUI_Init();        // Initialize emWin
  116.   _DrawBackground(); // Draw background
  117.   _ShowSprites();    // Show sprites
  118. }

复制代码

1. 这里面的5个位图是用于sprite显示的,通过这5张图的切换实现动态效果。Sprite对位图的要求如下:

  n 不得压缩。

  n 必须透明。

  n 应是基于调色板的位置,为1、2、4或8bpp。

    这个要求跟前面讲的游标是一样的。

2. 和上面讲的一样。

3. 实现5幅sprite图的切换。

4. 调整sprite显示的X轴位置。

5. 调整sprite显示的Y轴位置。

6. 显示sprite。

7. 创建sprite。

实际显示效果如下:




25.3 总结

    本期教程有一个问题还没有解决,就是如何生成这种8bpp还带透明的图片数据,这个问题有待解决。


谢谢帖子通过审核

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top