鱼C论坛

 找回密码
 立即注册
查看: 1331|回复: 3

[已解决]pygame飞机大战问题求助2

[复制链接]
发表于 2023-10-5 15:39:45 | 显示全部楼层 |阅读模式

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

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

x
file:///E:/DXYF2415/Documents/WeChat%20Files/wxid_xrudwy5xte0n22/FileStorage/Video/2023-10/8c13fc48440b196af45ea73499a5a4dc.mp4
麻烦大家查看一下这个视频,刚刚有几位鱼油帮忙还是没解决这个bug,搞不懂是怎么回事
myplane代码如下:
import pygame

class MyPlane(pygame.sprite.Sprite):
    def __init__(self,bg_size):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load('images/me1.png').convert_alpha()
        self.rect = self.image.get_rect()
        self.width, self.height = bg_size[0], bg_size[1]
        self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, self.height - self.rect.height - 60
        self.speed = 10

    def moveUp(self):
        if self.rect.top > 0:
            self.rect.top -= self.speed
        else:
            self.rect.top = 0

    def moveDown(self):
        if self.rect.bottom < self.height:
            self.rect.top += self.speed
        else:
            self.rect.bottom = self.height - 60

    def moveLeft(self):
        if self.rect.left > 0:
            self.rect.left -= self.speed
        else:
            self.rect.left = 0

    def moveRight(self):
        if self.rect.right < self.width:
            self.rect.right += self.speed
        else:
            self.rect.right = self.width
主体代码如下:
import pygame
import sys
import traceback
import myplane
from pygame.locals import *

pygame.init()
pygame.mixer.init()

bg_size = width, height = 480, 700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption('飞机大战-- FishC Demo')

background = pygame.image.load('images/background.png').convert()

#载入游戏音乐
pygame.mixer.music.load("sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
bullet_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
bomb_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound("sound/supply.wav")
supply_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
get_bullet_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
upgrade_sound.set_volume(0.2)
enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
enemy3_fly_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.2)
enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.5)
me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
me_down_sound.set_volume(0.2)

def main():
    pygame.mixer.music.play(-1)

    me = myplane.MyPlane(bg_size)

    clock = pygame.time.Clock()

    running = True

    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        key_pressed = pygame.key.get_pressed()

        if key_pressed[K_w] or key_pressed[K_UP]:
            me.moveUp()
        if key_pressed[K_s] or key_pressed[K_DOWN]:
            me.moveDown()
        if key_pressed[K_a] or key_pressed[K_LEFT]:
            me.moveLeft()
        if key_pressed[K_d] or key_pressed[K_RIGHT]:
            me.moveRight()
        

            screen.blit(background, (0, 0))
            screen.blit(me.image,me.rect)

            pygame.display.flip()

            clock.tick(60)

if __name__ == '__main__':
    try:
        main()
    except SystemExit:
        pass
    except:
        traceback.print_exc()
        pygame.quit()
        input()
最佳答案
2023-10-5 15:40:21
根据视频中的现象,可以看出飞机移动时出现了闪烁的问题。这是因为在每次循环中,都会重新绘制背景和飞机,导致屏幕闪烁。解决方法是将背景和飞机的绘制放在游戏循环外面,只在飞机移动时更新飞机的位置即可。

修改后的代码如下:

  1. import pygame
  2. import sys
  3. import traceback
  4. import myplane
  5. from pygame.locals import *

  6. pygame.init()
  7. pygame.mixer.init()

  8. bg_size = width, height = 480, 700
  9. screen = pygame.display.set_mode(bg_size)
  10. pygame.display.set_caption('飞机大战-- FishC Demo')

  11. background = pygame.image.load('images/background.png').convert()

  12. #载入游戏音乐
  13. pygame.mixer.music.load("sound/game_music.ogg")
  14. pygame.mixer.music.set_volume(0.2)
  15. bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
  16. bullet_sound.set_volume(0.2)
  17. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  18. bomb_sound.set_volume(0.2)
  19. supply_sound = pygame.mixer.Sound("sound/supply.wav")
  20. supply_sound.set_volume(0.2)
  21. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  22. get_bomb_sound.set_volume(0.2)
  23. get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
  24. get_bullet_sound.set_volume(0.2)
  25. upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
  26. upgrade_sound.set_volume(0.2)
  27. enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
  28. enemy3_fly_sound.set_volume(0.2)
  29. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  30. enemy1_down_sound.set_volume(0.2)
  31. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  32. enemy2_down_sound.set_volume(0.2)
  33. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  34. enemy3_down_sound.set_volume(0.5)
  35. me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
  36. me_down_sound.set_volume(0.2)

  37. def main():
  38.     pygame.mixer.music.play(-1)

  39.     me = myplane.MyPlane(bg_size)

  40.     clock = pygame.time.Clock()

  41.     # 在游戏循环外面绘制背景和飞机
  42.     screen.blit(background, (0, 0))
  43.     screen.blit(me.image, me.rect)
  44.     pygame.display.flip()

  45.     running = True

  46.     while running:
  47.         for event in pygame.event.get():
  48.             if event.type == QUIT:
  49.                 pygame.quit()
  50.                 sys.exit()

  51.         key_pressed = pygame.key.get_pressed()

  52.         if key_pressed[K_w] or key_pressed[K_UP]:
  53.             me.moveUp()
  54.         if key_pressed[K_s] or key_pressed[K_DOWN]:
  55.             me.moveDown()
  56.         if key_pressed[K_a] or key_pressed[K_LEFT]:
  57.             me.moveLeft()
  58.         if key_pressed[K_d] or key_pressed[K_RIGHT]:
  59.             me.moveRight()

  60.         # 只更新飞机的位置
  61.         screen.blit(background, (0, 0))
  62.         screen.blit(me.image, me.rect)
  63.         pygame.display.update(me.rect)

  64.         clock.tick(60)

  65. if __name__ == '__main__':
  66.     try:
  67.         main()
  68.     except SystemExit:
  69.         pass
  70.     except:
  71.         traceback.print_exc()
  72.         pygame.quit()
  73.         input()
复制代码


希望能帮到你。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-5 15:40:00 | 显示全部楼层
请问你的问题是什么,视频无法观看?如果是这样的话,可以描述一下你遇到的问题,我们会尽力帮你解决。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-5 15:40:21 | 显示全部楼层    本楼为最佳答案   
根据视频中的现象,可以看出飞机移动时出现了闪烁的问题。这是因为在每次循环中,都会重新绘制背景和飞机,导致屏幕闪烁。解决方法是将背景和飞机的绘制放在游戏循环外面,只在飞机移动时更新飞机的位置即可。

修改后的代码如下:

  1. import pygame
  2. import sys
  3. import traceback
  4. import myplane
  5. from pygame.locals import *

  6. pygame.init()
  7. pygame.mixer.init()

  8. bg_size = width, height = 480, 700
  9. screen = pygame.display.set_mode(bg_size)
  10. pygame.display.set_caption('飞机大战-- FishC Demo')

  11. background = pygame.image.load('images/background.png').convert()

  12. #载入游戏音乐
  13. pygame.mixer.music.load("sound/game_music.ogg")
  14. pygame.mixer.music.set_volume(0.2)
  15. bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
  16. bullet_sound.set_volume(0.2)
  17. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  18. bomb_sound.set_volume(0.2)
  19. supply_sound = pygame.mixer.Sound("sound/supply.wav")
  20. supply_sound.set_volume(0.2)
  21. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  22. get_bomb_sound.set_volume(0.2)
  23. get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
  24. get_bullet_sound.set_volume(0.2)
  25. upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
  26. upgrade_sound.set_volume(0.2)
  27. enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
  28. enemy3_fly_sound.set_volume(0.2)
  29. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  30. enemy1_down_sound.set_volume(0.2)
  31. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  32. enemy2_down_sound.set_volume(0.2)
  33. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  34. enemy3_down_sound.set_volume(0.5)
  35. me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
  36. me_down_sound.set_volume(0.2)

  37. def main():
  38.     pygame.mixer.music.play(-1)

  39.     me = myplane.MyPlane(bg_size)

  40.     clock = pygame.time.Clock()

  41.     # 在游戏循环外面绘制背景和飞机
  42.     screen.blit(background, (0, 0))
  43.     screen.blit(me.image, me.rect)
  44.     pygame.display.flip()

  45.     running = True

  46.     while running:
  47.         for event in pygame.event.get():
  48.             if event.type == QUIT:
  49.                 pygame.quit()
  50.                 sys.exit()

  51.         key_pressed = pygame.key.get_pressed()

  52.         if key_pressed[K_w] or key_pressed[K_UP]:
  53.             me.moveUp()
  54.         if key_pressed[K_s] or key_pressed[K_DOWN]:
  55.             me.moveDown()
  56.         if key_pressed[K_a] or key_pressed[K_LEFT]:
  57.             me.moveLeft()
  58.         if key_pressed[K_d] or key_pressed[K_RIGHT]:
  59.             me.moveRight()

  60.         # 只更新飞机的位置
  61.         screen.blit(background, (0, 0))
  62.         screen.blit(me.image, me.rect)
  63.         pygame.display.update(me.rect)

  64.         clock.tick(60)

  65. if __name__ == '__main__':
  66.     try:
  67.         main()
  68.     except SystemExit:
  69.         pass
  70.     except:
  71.         traceback.print_exc()
  72.         pygame.quit()
  73.         input()
复制代码


希望能帮到你。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-5 16:22:41 | 显示全部楼层
代码太长了,解决了就好!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 20:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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