你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第25章 Sprites

[复制链接]
baiyongbin2009 发布时间:2015-2-6 16:42
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第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的演示,这个例子位置在:
25.1.png

此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.2.png

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

收藏 评论0 发布时间:2015-2-6 16:42

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版