鱼C论坛

 找回密码
 立即注册
查看: 2137|回复: 6

pygame

[复制链接]
发表于 2023-8-4 15:46:42 | 显示全部楼层 |阅读模式

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

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

x
import sys
import pygame
import random
class Bird(object):
    '''定义一个鸟类'''
    def __init__(self):
        '''定义初始化方法'''
        self.birdrect = pygame.Rect(65, 50, 50, 50)             # 鸟的矩形
        # 定义鸟的3种状态列表
        self.birdStatus = [pygame.image.load('niao.png'), pygame.image.load('niao.png'), pygame.image.load('niao.png')]
        self.status = 0                 # 默认飞行状态
        self.birdX = 120                # 鸟所在 X 轴坐标
        self.birdY = 350                # 鸟所在 Y 轴坐标, 及上下飞行高度
        self.jump = False               # 默认情况下小鸟自动降落
        self.jumpspeed = 10             # 跳跃高度
        self.gravity = 5                # 重力
        self.dead = False               # 默认小鸟生命状态为活着

    def bird_update(self):
        if self.jump:
            self.jumpspeed -= 1                     # 速度递减 上升越来越慢
            self.birdY -= self.jumpspeed            # 鸟 Y 轴坐标减小 小鸟上升
        else:
            # 小鸟坠落
            self.gravity += 0.2                     # 重力递增,下降越来越快
            self.birdY += self.gravity              # 鸟 Y 轴坐标增加 小鸟下降
        self.birdrect[1] = self.birdY               # 更改 Y 轴位置

class Guandao(object):
    '''定义一个管道类'''
    def __init__(self):
        '''定义初始化方法'''
        pass
    def updateGuandao(self):
        '''水平移动'''
        pass

def ditu():
    '''定义创建地图的方法'''
    screen.fill((255, 255, 255))                                # 填充颜色
    screen.blit(background, (0, 0))                             # 填入到背景
    # 显示小鸟
    if Bird.dead:
        Bird.status = 2
    elif Bird.jump:                                             # 起飞状态
        Bird.status = 1
    screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))            # 设置小鸟的坐标
    Bird.bird_update()                                          # 鸟移动
    pygame.display.update()                                     # 更新显示

if __name__ == '__main__':
    '''主程序'''
    pygame.init()                                               # 初始化 pygame
    size   = width, height = 400, 680                           # 设置窗口大小
    screen = pygame.display.set_mode(size)                      # 显示窗口
    clock  = pygame.time.Clock()                                # 设置时钟
    guandao = Guandao()                                         # 实例化管道
    bird = Bird()                                               # 实例化鸟
   
    # 执行死循环,确保窗口一直显示
    while True:
        clock.tick(60)
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True                                # 跳跃
                Bird.gravity = 5                                # 重力
                Bird.jumpspeed = 10                             # 跳跃速度

        background = pygame.image.load('女孩.jpg')
        ditu()

如上,窗口还是就闪一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 15:46:53 | 显示全部楼层
根据你提供的代码,窗口只是闪一下的问题可能是由于没有设置主循环中的窗口刷新频率导致的。你可以尝试在主循环中添加 pygame.display.flip() 或者 pygame.display.update() 来刷新窗口显示。

修改后的代码如下所示:
if __name__ == '__main__':
    '''主程序'''
    pygame.init()
    size  = width, height = 400, 680     # 设置窗口大小
    screen = pygame.display.set_mode(size)    # 显示窗口
    clock  = pygame.time.Clock()     # 设置时钟
    
    guandao = Guandao()    # 实例化管道
    bird = Bird()    # 实例化鸟
    
    # 执行死循环,确保窗口一直显示
    while True:
        clock.tick(60)
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True        # 跳跃
                Bird.gravity = 5        # 重力
                Bird.jumpspeed = 10     # 跳跃速度
        
        background = pygame.image.load('女孩.jpg')
        ditu()
        pygame.display.flip()   # 刷新窗口显示

这样的话,窗口应该能够正常显示了。希望能帮到你!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-4 15:46:55 | 显示全部楼层
问题:

你好!根据你提供的代码,窗口运行后只是闪一下就消失了,请问你想要实现什么样的效果?

回答:

根据你提供的代码,似乎是在创建一个小鸟类的游戏。我看到代码中有一个ditu()函数用于创建地图的方法,但是在主程序中没有调用该函数。你可以尝试在主程序的循环中调用该函数来更新显示。

另外,你的代码中没有包含循环结束的条件,所以窗口会一直保持打开状态。你可以在主程序的循环中增加一个结束条件,例如当用户按下关闭窗口按钮时退出循环。

最后,如果你希望保持窗口的显示时间更长,可以将clock.tick(60)中的参数值增大,例如改为clock.tick(30),表示每秒钟最多更新30次窗口显示。

希望以上回答对你有帮助!如果还有其他问题,请继续提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-4 15:46:59 | 显示全部楼层
问题:pygame窗口闪烁问题解决方案

要解决pygame窗口闪烁的问题,可以尝试以下几个方法:

1. 双缓冲绘图:使用pygame.DOUBLEBUFpygame.HWSURFACE参数创建窗口,启用硬件加速和双缓冲。修改创建窗口的代码如下:
screen = pygame.display.set_mode(size, pygame.DOUBLEBUF | pygame.HWSURFACE)

2. 延迟显示更新:在每次更新窗口后,添加延迟一小段时间再更新显示的代码。例如,在pygame.display.update()之后添加pygame.time.delay(10),其中的延迟时间可以根据具体情况进行调整。修改代码如下:
pygame.display.update()
pygame.time.delay(10)

3. 限制帧率:使用pygame.time.Clock()来控制游戏的帧率。在主循环中,使用clock.tick()方法来限制帧率。例如,clock.tick(60)将每秒钟刷新屏幕60次。修改代码如下:
clock = pygame.time.Clock()
while True:
    clock.tick(60)
    # 其他代码

请注意,以上方法可能需要根据您的具体情况进行适当调整和组合使用。如果问题仍然存在,请检查您的计算机硬件性能是否满足游戏需求,并确保您的图片资源正确加载。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-4 15:47:28 | 显示全部楼层
根据提供的代码,窗口只会闪烁一下的原因是因为在while循环中,每次循环都会重新绘制整个窗口,导致窗口内容闪烁。为了解决这个问题,可以在每次循环中只绘制需要更新的部分。

具体的修改方法如下:

1. 在 ditu() 方法中,将 screen.fill((255, 255, 255)) 和 screen.blit(background, (0, 0)) 这两行代码移动到while循环外面,只执行一次,这样窗口的背景和填充颜色只会绘制一次。

2. 在 bird_update() 方法中,将 pygame.display.update() 这行代码移动到while循环的最后,只在每次循环结束时更新显示。

修改后的代码如下:
import sys
import pygame
import random

class Bird(object):
    '''定义一个鸟类'''
    def __init__(self):
        '''定义初始化方法'''
        self.birdrect = pygame.Rect(65, 50, 50, 50)              # 鸟的矩形
        # 定义鸟的3种状态列表
        self.birdStatus = [pygame.image.load('niao.png'), pygame.image.load('niao.png'), pygame.image.load('niao.png')]
        self.status = 0                                          # 默认飞行状态
        self.birdX = 120                                         # 鸟所在 X 轴坐标
        self.birdY = 350                                         # 鸟所在 Y 轴坐标, 及上下飞行高度
        self.jump = False                                        # 默认情况下小鸟自动降落
        self.jumpspeed = 10                                     # 跳跃高度
        self.gravity = 5                                        # 重力
        self.dead = False                                        # 默认小鸟生命状态为活着

    def bird_update(self):
        if self.jump:
            self.jumpspeed -= 1                                  # 速度递减 上升越来越慢
            self.birdY -= self.jumpspeed                         # 鸟 Y 轴坐标减小 小鸟上升
        else:
            # 小鸟坠落
            self.gravity += 0.2                                  # 重力递增,下降越来越快
            self.birdY += self.gravity                           # 鸟 Y 轴坐标增加 小鸟下降
        self.birdrect[1] = self.birdY                             # 更改 Y 轴位置

def ditu():
    '''定义创建地图的方法'''
    screen.blit(background, (0, 0))                             # 填入到背景
    # 显示小鸟
    if Bird.dead:
        Bird.status = 2
    elif Bird.jump:                                              # 起飞状态
        Bird.status = 1
    screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))   # 设置小鸟的坐标
    Bird.bird_update()                                           # 鸟移动

if __name__ == '__main__':
    '''主程序'''
    pygame.init()                                               # 初始化 pygame
    size = width, height = 400, 680                             # 设置窗口大小
    screen = pygame.display.set_mode(size)                       # 显示窗口
    clock = pygame.time.Clock()                                  # 设置时钟
    guandao = Guandao()                                          # 实例化管道
    bird = Bird()                                                # 实例化鸟
    
    background = pygame.image.load('女孩.jpg')
    screen.fill((255, 255, 255))                                 # 填充颜色

    # 执行死循环,确保窗口一直显示
    while True:
        clock.tick(60)
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True                                   # 跳跃
                Bird.gravity = 5                                   # 重力
                Bird.jumpspeed = 10                                # 跳跃速度

        ditu()
        pygame.display.update()                                   # 更新显示

通过以上修改,窗口内容将会保持稳定,不再闪烁。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-4 16:26:28 | 显示全部楼层
没素材,跑不了程序,可能会导致没人看,其次,代码请以code形式发出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 18:42:20 | 显示全部楼层
运行后报错:
Traceback (most recent call last):
  File "D:\1.py", line 74, in <module>
    ditu()
  File "D:\1.py", line 43, in ditu
    if Bird.dead:
AttributeError: type object 'Bird' has no attribute 'dead'
所以才会一闪而过。
错误原因:
self.birdrect = pygame.Rect(65, 50, 50, 50) # 鸟的矩形
self.birdStatus = [pygame.image.load('niao.png'), pygame.image.load('niao.png'), pygame.image.load('niao.png')]
self.status = 0# 默认飞行状态
self.birdX = 120# 鸟所在 X 轴坐标
self.birdY = 350# 鸟所在 Y 轴坐标, 及上下飞行高度
self.jump = False# 默认情况下小鸟自动降落
self.jumpspeed = 10# 跳跃高度
self.gravity = 5# 重力
self.dead = False# 默认小鸟生命状态为活着

这些实例属性只有通过实例bird才能调用,而在你的程序里你尝试用Bird类直接调用。
修改后的程序:
import sys
import pygame
import random
class Bird(object):
    '''定义一个鸟类'''
    def __init__(self):
        '''定义初始化方法'''
        self.birdrect = pygame.Rect(65, 50, 50, 50)             # 鸟的矩形
        # 定义鸟的3种状态列表
        self.birdStatus = [pygame.image.load('niao.png'), pygame.image.load('niao.png'), pygame.image.load('niao.png')]
        self.status = 0                 # 默认飞行状态
        self.birdX = 120                # 鸟所在 X 轴坐标
        self.birdY = 350                # 鸟所在 Y 轴坐标, 及上下飞行高度
        self.jump = False               # 默认情况下小鸟自动降落
        self.jumpspeed = 10             # 跳跃高度
        self.gravity = 5                # 重力
        self.dead = False               # 默认小鸟生命状态为活着

    def bird_update(self):
        if self.jump:
            self.jumpspeed -= 1                     # 速度递减 上升越来越慢
            self.birdY -= self.jumpspeed            # 鸟 Y 轴坐标减小 小鸟上升
        else:
            # 小鸟坠落
            self.gravity += 0.2                     # 重力递增,下降越来越快
            self.birdY += self.gravity              # 鸟 Y 轴坐标增加 小鸟下降
        self.birdrect[1] = self.birdY               # 更改 Y 轴位置

class Guandao(object):
    '''定义一个管道类'''
    def __init__(self):
        '''定义初始化方法'''
        pass
    def updateGuandao(self):
        '''水平移动'''
        pass

def ditu():
    '''定义创建地图的方法'''
    screen.fill((255, 255, 255))                                # 填充颜色
    screen.blit(background, (0, 0))                             # 填入到背景
    # 显示小鸟
    if bird.dead:
        bird.status = 2
    elif bird.jump:                                             # 起飞状态
        bird.status = 1
    screen.blit(bird.birdStatus[bird.status], (bird.birdX, bird.birdY))            # 设置小鸟的坐标
    bird.bird_update()                                          # 鸟移动
    pygame.display.update()                                     # 更新显示

if __name__ == '__main__':
    '''主程序'''
    pygame.init()                                               # 初始化 pygame
    size   = width, height = 400, 680                           # 设置窗口大小
    screen = pygame.display.set_mode(size)                      # 显示窗口
    clock  = pygame.time.Clock()                                # 设置时钟
    guandao = Guandao()                                         # 实例化管道
    bird = Bird()                                               # 实例化鸟
   
    # 执行死循环,确保窗口一直显示
    while True:
        clock.tick(60)
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not bird.dead:
                bird.jump = True                                # 跳跃
                bird.gravity = 5                                # 重力
                bird.jumpspeed = 10                             # 跳跃速度

        background = pygame.image.load('女孩.jpg')
        ditu()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 21:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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