pygame学习之绘制移动的矩形

Pygame矩形动画
本文介绍了一个使用Python和Pygame库创建的简单矩形动画示例。该程序在一个600x500像素的游戏窗口中绘制了一个可以自动反弹移动的黄色矩形,通过调整速度变量来控制其移动方向。
 1 import pygame
 2 from pygame.locals import *
 3 
 4 pygame.init()
 5 screen = pygame.display.set_mode((600, 500))
 6 pygame.display.set_caption("drawing a rectangle")
 7 pos_x = 300
 8 pos_y = 250
 9 vel_x = 2                            # 设置速度变量
10 vel_y = 1
11 while True:
12     for event in pygame.event.get():
13         if event.type in (QUIT, KEYDOWN):
14             exit()
15     screen.fill((0, 0, 200))
16     pos_x += vel_x
17     pos_y += vel_y
18 
19     if pos_x > 500 or pos_x < 0:
20         vel_x = -vel_x                       # 让矩形在窗口范围内移动
21     if pos_y > 400 or pos_y < 0:
22         vel_y = -vel_y
23     color = 255, 255, 0
24     width = 0
25     pos = pos_x, pos_y, 100, 100             # 矩形长和宽都为100
26     pygame.draw.rect(screen, color, pos, width)
27     pygame.display.update()

 

转载于:https://www.cnblogs.com/mazhong/p/6132490.html

### 脏矩形的概念与用法 在 Pygame 中,“脏矩形”(Dirty Rectangles 或 Dirty Regions)是一种优化技术,用于减少绘制操作的开销。当游戏或应用程序需要频繁更新屏幕的一部分而不是整个屏幕时,这种方法特别有用。 #### 什么是脏矩形? 脏矩形是指屏幕上那些需要重新绘制的部分区域。这些区域可能因为某些事件而发生了变化,比如移动了一个精灵、改变了文字内容或者调整了某个按钮的位置。通过只重绘这些发生变化的小部分区域,可以显著提高性能,尤其是在处理复杂场景或多层图像叠加的情况下[^1]。 #### 如何实现脏矩形机制? Pygame 提供了一种简单的方式来管理这种机制——使用 `Sprite` 类及其子类中的 `dirty` 属性以及 `Group` 的变体如 `RenderUpdates` 组合。以下是具体方法: 1. **定义 Sprite 并设置其 dirty 属性** 当一个 sprite 对象的状态发生改变时,将其标记为“脏”,即设置它的 `self.dirty = 1`。这表明该对象所在的矩形区域需要被刷新到屏幕上。 2. **利用 RenderClear/RenderUpdates Group** 使用专门设计用来支持脏矩形的组类型之一:`pygame.sprite.RenderUpdates`。这个特殊的 group 不仅存储 sprites 还会跟踪哪些区域已经变得“脏”。每次调用 `draw()` 方法时,它只会更新并返回一个列表包含所有需要更新的矩形区域。 3. **实际应用例子** 下面展示一段代码片段说明如何运用上述概念构建高效的游戏循环: ```python import pygame from pygame.locals import * class MySprite(pygame.sprite.DirtySprite): def __init__(self, image, position): super().__init__() self.image = image self.rect = self.image.get_rect(topleft=position) def main(): pygame.init() screen = pygame.display.set_mode((800, 600)) background = pygame.Surface(screen.get_size()) background.fill((0, 0, 0)) all_sprites = pygame.sprite.LayeredUpdates() my_image = pygame.Surface((50, 50)).convert_alpha() my_image.fill(Color('dodgerblue')) mysprite = MySprite(my_image, (100, 100)) all_sprites.add(mysprite) clock = pygame.time.Clock() running = True while running: for event in pygame.event.get(): if event.type == QUIT: running = False # Update logic here... # Mark as dirty when necessary. mysprite.dirty = 1 # Clear previous positions of all Sprites by filling with the background color/image. rects_to_update = all_sprites.draw(screen) pygame.display.update(rects_to_update) clock.tick(60) if __name__ == "__main__": main() ``` 在这个示例中,每当 `mysprite` 发生任何变动后都会自动标注自己为 “dirty”,随后由 `all_sprites.draw(screen)` 函数负责找出所有需更新的矩形并将它们传递给 `pygame.display.update()` 来完成局部刷新工作而非全局覆盖[^2]. #### 性能优势 采用这种方式能够有效降低 CPU/GPU 工作负担,特别是在高分辨率显示器上运行大型项目时尤为明显。由于减少了不必要的像素级运算次数,因此整体帧速率得以提升从而带来更流畅用户体验效果[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值