在图形化python应用程序中使用哪种方法生成Cozmo的表达式?

2024-06-11 02:08:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个想法,我想制作一双机器人眼睛的动画,类似于Anki的Cozmo,但是我不想在LED屏幕上显示,我想在python应用程序中运行它,同时仍然有类似的感觉/效果(轻微闪烁,看起来像素化)。问题是我不知道从哪里开始。我必须有所有的动画精灵的所有表情(悲伤,快乐,愤怒…)和过渡,然后使用tkinter或pygame。或者我可以直接从一组配置(例如数组)中提取?如果你能提出一些方法,那就太好了。你知道吗


Tags: 应用程序led屏幕tkinter机器人动画像素pygame
1条回答
网友
1楼 · 发布于 2024-06-11 02:08:05

一种简单的方法是将数据存储在一个简单的字符串中,然后从这些字符串创建曲面。它不需要太多的内存,同时易于阅读和修改,并且可以在您的代码中使用。你知道吗

当然,有很多不同的方法来做你想做的事情,但我想像这样简单的事情会是一个很好的开始(你会明白的):

enter image description here

import pygame
from itertools import cycle

TILE_SIZE = 32
SCREEN_SIZE = pygame.Rect((0, 0, 21*TILE_SIZE, 8*TILE_SIZE))


class Expression(pygame.sprite.Sprite):
    def __init__(self, data):
        super().__init__()
        self.image = pygame.Surface((len(data[0]), len(data)))
        x = y = 0
        for row in data:
            for col in row:
                if col == "O":
                    self.image.set_at((x, y), pygame.Color('dodgerblue'))
                x += 1
            y += 1
            x = 0
        self.image = pygame.transform.scale(self.image, (TILE_SIZE*len(data[0]), TILE_SIZE*len(data)))
        self.rect = self.image.get_rect()

REGULAR = Expression([
"                     ",
"                     ",
"    OOOO     OOOO    ",
"   OOOOOO   OOOOOO   ",
"   OOOOOO   OOOOOO   ",
"    OOOO     OOOO    ",
"                     ",
"                     ",
])

QUESTION = Expression([
"                     ",
"                     ",
"    OOOO             ",
"   OOOOOO    OOOO    ",
"   OOOOOO   OOOOOO   ",
"    OOOO     OOOO    ",
"                     ",
"                     ",
])

SAD = Expression([
"                     ",
"                     ",
"                     ",
"                     ",
"                     ",
"   OOOOOO   OOOOOO   ",
"                     ",
"                     ",
])

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE.size)
    timer = pygame.time.Clock()
    expressions = cycle([REGULAR, QUESTION, REGULAR, QUESTION, SAD])
    current = next(expressions)
    pygame.time.set_timer(pygame.USEREVENT, 1000)

    while True:

        for e in pygame.event.get():
            if e.type == pygame.QUIT: 
                return
            if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE:
                return
            if e.type == pygame.USEREVENT:
                current = next(expressions)

        screen.fill((30, 30, 30))
        screen.blit(current.image, current.rect)
        timer.tick(60)
        pygame.display.update()

if __name__ == "__main__":
    main()

从这里到哪里:

  • 使用较小的平铺大小和较大的字符串来获得更好的分辨率。

  • 或者在程序外(在绘图工具中)为动画创建图像,并使用所需的图像。

  • 创建定义不同动画的不同表达式列表,并为每个“情绪”更改当前动画。

相关问题 更多 >