|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我在上小甲鱼的pygame课时上到了play the ball第一节课,我让ai帮我把代码敲了出来,图片也搞好了,代码运行后就这样了
代码:
- # 导入必要的库
- import pygame # Pygame游戏开发库
- import sys # 系统相关功能
- from pygame.locals import * # 导入Pygame本地常量
- from random import randint # 导入随机数生成函数
- class Ball(pygame.sprite.Sprite):
- """
- Ball类,继承自pygame.sprite.Sprite,表示游戏中的小球对象
- 属性:
- image: 小球的图像
- rect: 小球的矩形区域
- speed: 小球的移动速度
- """
- def __init__(self, image, position, speed):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.image.load(image).convert_alpha()
- self.rect = self.image.get_rect()
- self.rect.left, self.rect.top = position
- self.speed = speed
-
- def move(self, screen_width, screen_height):
- # 移动小球
- self.rect = self.rect.move(self.speed)
-
- # 边界检查 - 实现屏幕环绕效果
- if self.rect.left > screen_width:
- self.rect.right = 0
- if self.rect.right < 0:
- self.rect.left = screen_width
- if self.rect.top > screen_height:
- self.rect.bottom = 0
- if self.rect.bottom < 0:
- self.rect.top = screen_height
- def main():
- # 初始化pygame
- pygame.init()
-
- # 定义球的图片路径和背景图片路径
- ball_image = "img/gray_Ball.png"
- bg_image = "img/bg2.png"
-
- # 设置更合理的窗口尺寸
- screen_size = width, height = 1024, 768
- screen = pygame.display.set_mode(screen_size)
- pygame.display.set_caption("Play the ball - Save the Earth")
-
- try:
- # 尝试加载背景图片
- background = pygame.image.load(bg_image).convert_alpha()
- except:
- # 如果背景图不存在,创建纯色背景
- background = pygame.Surface(screen_size)
- background.fill((0, 0, 0))
-
- balls = []
-
- # 创建五个小球
- for i in range(5):
- # 随机生成小球位置和速度
- position = randint(0, width-100), randint(0, height-100)
- speed = [randint(-10, 10), randint(-10, 10)]
- # 确保速度不为0,避免小球静止
- while speed[0] == 0 or speed[1] == 0:
- speed = [randint(-10, 10), randint(-10, 10)]
- # 创建小球对象并添加到列表
- ball = Ball(ball_image, position, speed)
- balls.append(ball)
-
- # 初始化时钟对象
- clock = pygame.time.Clock()
- running = True
-
- # 主游戏循环
- while running:
- # 处理事件
- for event in pygame.event.get():
- if event.type == QUIT:
- running = False
-
- # 绘制背景
- screen.blit(background, (0, 0))
-
- # 更新和绘制所有小球
- for ball in balls:
- ball.move(width, height)
- screen.blit(ball.image, ball.rect)
-
- # 更新显示
- pygame.display.flip()
- # 控制帧率为30fps
- clock.tick(30)
-
- # 退出pygame
- pygame.quit()
- sys.exit()
- if __name__ == "__main__":
- main()
复制代码
你这个现象(屏幕上出现一大堆球的“拖影”)其实是因为背景没有每一帧都被重新覆盖掉。
从截图来看,小球移动后,上一帧的小球图像没有被清掉,就变成了密密麻麻的轨迹。
原因:
- screen.blit(background, (0, 0))
复制代码
虽然你有这一行,但 background 是 convert_alpha() 加载的 PNG(带透明通道),透明部分不会完全覆盖之前的画面——导致旧的像素残留。
解决方法有两个:
方法1:用 convert() 而不是 convert_alpha()
如果背景图不需要透明,直接:
- background = pygame.image.load(bg_image).convert()
复制代码
这样 blit 会把整个屏幕画满(无透明叠加)。
方法2:如果背景确实有透明,就先清空屏幕
在绘制背景前加一行:
- screen.fill((0, 0, 0)) # 先用黑色把上一帧清掉
- screen.blit(background, (0, 0))
复制代码
这样即使背景有透明通道,也不会叠出轨迹。
另外,你的小球速度最大到 10 像素/帧,在 30 FPS 下运动轨迹挺明显,如果想更丝滑,可以降低到 3~5 像素/帧。
|
-
|