硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4478|回复: 0
收起左侧

[emWin教程入门篇] 【STemWin教程】第25章 Sprites

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-1 11:28:48 | 显示全部楼层 |阅读模式
特别说明:完整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还带透明的图片数据,这个问题有待解决。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 05:06 , Processed in 0.150383 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表