鱼C论坛

 找回密码
 立即注册
查看: 135|回复: 8

[已解决]pygame问题

[复制链接]
回帖奖励 20 鱼币 回复本帖可获得 5 鱼币奖励! 每人限 1 次(中奖概率 10%)
发表于 2025-8-11 10:23:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在上小甲鱼的pygame课时上到了play the ball第一节课,我让ai帮我把代码敲了出来,图片也搞好了,代码运行后就这样了


代码:
  1. # 导入必要的库
  2. import pygame  # Pygame游戏开发库
  3. import sys     # 系统相关功能
  4. from pygame.locals import *  # 导入Pygame本地常量
  5. from random import randint  # 导入随机数生成函数

  6. class Ball(pygame.sprite.Sprite):
  7.     """
  8.     Ball类,继承自pygame.sprite.Sprite,表示游戏中的小球对象
  9.     属性:
  10.         image: 小球的图像
  11.         rect: 小球的矩形区域
  12.         speed: 小球的移动速度
  13.     """
  14.     def __init__(self, image, position, speed):
  15.         pygame.sprite.Sprite.__init__(self)
  16.         self.image = pygame.image.load(image).convert_alpha()
  17.         self.rect = self.image.get_rect()
  18.         self.rect.left, self.rect.top = position
  19.         self.speed = speed
  20.    
  21.     def move(self, screen_width, screen_height):
  22.         # 移动小球
  23.         self.rect = self.rect.move(self.speed)
  24.         
  25.         # 边界检查 - 实现屏幕环绕效果
  26.         if self.rect.left > screen_width:
  27.             self.rect.right = 0
  28.         if self.rect.right < 0:
  29.             self.rect.left = screen_width
  30.         if self.rect.top > screen_height:
  31.             self.rect.bottom = 0
  32.         if self.rect.bottom < 0:
  33.             self.rect.top = screen_height

  34. def main():
  35.     # 初始化pygame
  36.     pygame.init()
  37.    
  38.     # 定义球的图片路径和背景图片路径
  39.     ball_image = "img/gray_Ball.png"
  40.     bg_image = "img/bg2.png"
  41.    
  42.     # 设置更合理的窗口尺寸
  43.     screen_size = width, height = 1024, 768
  44.     screen = pygame.display.set_mode(screen_size)
  45.     pygame.display.set_caption("Play the ball - Save the Earth")
  46.    
  47.     try:
  48.         # 尝试加载背景图片
  49.         background = pygame.image.load(bg_image).convert_alpha()
  50.     except:
  51.         # 如果背景图不存在,创建纯色背景
  52.         background = pygame.Surface(screen_size)
  53.         background.fill((0, 0, 0))
  54.    
  55.     balls = []
  56.    
  57.     # 创建五个小球
  58.     for i in range(5):
  59.         # 随机生成小球位置和速度
  60.         position = randint(0, width-100), randint(0, height-100)
  61.         speed = [randint(-10, 10), randint(-10, 10)]
  62.         # 确保速度不为0,避免小球静止
  63.         while speed[0] == 0 or speed[1] == 0:
  64.             speed = [randint(-10, 10), randint(-10, 10)]
  65.         # 创建小球对象并添加到列表
  66.         ball = Ball(ball_image, position, speed)
  67.         balls.append(ball)
  68.    
  69.     # 初始化时钟对象
  70.     clock = pygame.time.Clock()
  71.     running = True
  72.    
  73.     # 主游戏循环
  74.     while running:
  75.         # 处理事件
  76.         for event in pygame.event.get():
  77.             if event.type == QUIT:
  78.                 running = False
  79.         
  80.         # 绘制背景
  81.         screen.blit(background, (0, 0))
  82.         
  83.         # 更新和绘制所有小球
  84.         for ball in balls:
  85.             ball.move(width, height)
  86.             screen.blit(ball.image, ball.rect)
  87.         
  88.         # 更新显示
  89.         pygame.display.flip()
  90.         # 控制帧率为30fps
  91.         clock.tick(30)
  92.    
  93.     # 退出pygame
  94.     pygame.quit()
  95.     sys.exit()

  96. if __name__ == "__main__":
  97.     main()
复制代码


最佳答案
2025-8-11 11:43:37
你这个现象(屏幕上出现一大堆球的“拖影”)其实是因为背景没有每一帧都被重新覆盖掉。
从截图来看,小球移动后,上一帧的小球图像没有被清掉,就变成了密密麻麻的轨迹。
原因:
  1. screen.blit(background, (0, 0))
复制代码

虽然你有这一行,但 background 是 convert_alpha() 加载的 PNG(带透明通道),透明部分不会完全覆盖之前的画面——导致旧的像素残留。
解决方法有两个:
方法1:用 convert() 而不是 convert_alpha()
如果背景图不需要透明,直接:
  1. background = pygame.image.load(bg_image).convert()
复制代码

这样 blit 会把整个屏幕画满(无透明叠加)。
方法2:如果背景确实有透明,就先清空屏幕
在绘制背景前加一行:
  1. screen.fill((0, 0, 0))  # 先用黑色把上一帧清掉
  2. screen.blit(background, (0, 0))
复制代码

这样即使背景有透明通道,也不会叠出轨迹。
另外,你的小球速度最大到 10 像素/帧,在 30 FPS 下运动轨迹挺明显,如果想更丝滑,可以降低到 3~5 像素/帧。
屏幕截图 2025-08-11 101922.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-11 10:25:02 | 显示全部楼层
您的代码存在两处问题,导致小球无法显示:

1. 小球列表 balls 未初始化
2. 小球速度 speed 未正确赋值

以下是修正后的代码(修改部分已标注):

[code=python]
# 导入必要的库
import pygame  # Pygame游戏开发库
import sys     # 系统相关功能
from pygame.locals import *  # 导入Pygame本地常量
from random import randint  # 导入随机数生成函数

class Ball(pygame.sprite.Sprite):
    """Ball类,继承自pygame.sprite.Sprite,表示游戏中的小球对象"""
    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))
   
    # ====== 修正1:初始化小球列表 ======
    balls = []
   
    # 创建五个小球
    for i in range(5):
        # 随机生成小球位置
        position = randint(0, width-100), randint(0, height-100)
        
        # ====== 修正2:正确生成速度向量 ======
        # 生成x方向速度(-3到3之间,不为0)
        speed_x = 0
        while speed_x == 0:
            speed_x = randint(-3, 3)
        
        # 生成y方向速度(-3到3之间,不为0)
        speed_y = 0
        while speed_y == 0:
            speed_y = randint(-3, 3)
        
        speed = [speed_x, speed_y]
        
        # 创建小球对象并添加到列表
        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()
[/code]

修改说明:
1. 小球列表初始化:添加了 balls = []
2. 速度生成逻辑:分别生成x/y方向速度,确保不为0
3. 速度范围:使用 randint(-3, 3) 生成合理速度值

如果仍有问题,请检查:
1. 图片路径是否正确(img/gray_Ball.pngimg/bg2.png
2. 图片文件是否在项目目录的 img 文件夹内
3. 图片文件名是否拼写正确(注意大小写)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-11 11:36:04 | 显示全部楼层
建议你用trae ai
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-11 11:41:13 | 显示全部楼层
本帖最后由 FC粉丝 于 2025-8-11 11:43 编辑

hh
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-11 11:43:37 | 显示全部楼层    本楼为最佳答案   
你这个现象(屏幕上出现一大堆球的“拖影”)其实是因为背景没有每一帧都被重新覆盖掉。
从截图来看,小球移动后,上一帧的小球图像没有被清掉,就变成了密密麻麻的轨迹。
原因:
  1. screen.blit(background, (0, 0))
复制代码

虽然你有这一行,但 background 是 convert_alpha() 加载的 PNG(带透明通道),透明部分不会完全覆盖之前的画面——导致旧的像素残留。
解决方法有两个:
方法1:用 convert() 而不是 convert_alpha()
如果背景图不需要透明,直接:
  1. background = pygame.image.load(bg_image).convert()
复制代码

这样 blit 会把整个屏幕画满(无透明叠加)。
方法2:如果背景确实有透明,就先清空屏幕
在绘制背景前加一行:
  1. screen.fill((0, 0, 0))  # 先用黑色把上一帧清掉
  2. screen.blit(background, (0, 0))
复制代码

这样即使背景有透明通道,也不会叠出轨迹。
另外,你的小球速度最大到 10 像素/帧,在 30 FPS 下运动轨迹挺明显,如果想更丝滑,可以降低到 3~5 像素/帧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-11 11:44:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-11 12:47:36 | 显示全部楼层

回帖奖励 +5 鱼币

蹭币114514
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
蹭币2.0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 From FishC Mobile | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-20 06:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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