GPILOPD 2023-07-04 12:40 采纳率: 14.3%
浏览 25
已结题

关于#pygame#的问题,如何解决?

我写了个pygame程序

img

img


```python
import pygame
import os
pygame.font.init()
pygame.mixer.init()

WIDTH,HEIGHT=900,500 # 窗口大小
BULLET_VEL = 7#子弹速度
WIN = pygame.display.set_mode((WIDTH,HEIGHT)) #创建窗口屏幕对象,可以绘制东西
YELLOW_HIT = pygame.USEREVENT + 1
RED_HIT = pygame.USEREVENT + 2
FPS=100 # 帧数
VEL=5 # 飞船速度
MAX_BULLETS=3 #子弹
SPACESHIP_WIDTH=55 # 飞船宽
SPACESHIP_HEIGHT=40 # 飞船高
BORDER=pygame.Rect(WIDTH//2,0,10,HEIGHT) # 中间线大小
BLAKE=(0,0,0) # 颜色
RED=(255,0,0)
YELLOW=(255,100,0) # 使黄色更显眼
BULLET_HIT_SOUND = pygame.mixer.Sound("Assets/Grenade+1.mp3")
BULLET_FIRE_SOUND = pygame.mixer.Sound("Assets/Gun+Silencer.mp3")
YELLOW_SPACESHIP_IMAGE = pygame.image.load(os.path.join("Assets","spaceship_yellow.png")) # 图片加载1
YELLOW_SPACESHIP=pygame.transform.rotate(pygame.transform.scale(YELLOW_SPACESHIP_IMAGE,(SPACESHIP_WIDTH,SPACESHIP_HEIGHT)),90) # 图片设置1
RED_SPACESHIP_IMAGE = pygame.image.load(os.path.join("Assets","spaceship_red.png")) # 图片加载2
RED_SPACESHIP=pygame.transform.rotate(pygame.transform.scale(RED_SPACESHIP_IMAGE,(SPACESHIP_WIDTH,SPACESHIP_HEIGHT)),270) # 图片设置2
SPACE=pygame.transform.scale(pygame.image.load(os.path.join("Assets", "space.png")), (WIDTH, HEIGHT))
MUSIC=pygame.mixer.music.load("Assets/BackGround.mp3") # 这个就是背景音乐
pygame.display.set_caption("first Game!") #标题

def handle_bullets(yellow_bullets,red_bullets,yellow,red):
    for bullet in yellow_bullets:
        bullet.x+=BULLET_VEL
        if red.colliderect(bullet):
            pygame.event.post(pygame.event.Event(RED_HIT))
            yellow_bullets.remove(bullet)
        elif bullet.x > WIDTH:
            yellow_bullets.remove(bullet)

    for bullet in red_bullets:
        bullet.x-=BULLET_VEL
        if yellow.colliderect(bullet):
            pygame.event.post(pygame.event.Event(YELLOW_HIT))
            red_bullets.remove(bullet)
        elif bullet.x < 0:
            red_bullets.remove(bullet)

def yello_handle_movement(keys_pressed,yellow): # 1飞船按键运动,遇到边缘就停下
    if keys_pressed[pygame.K_a] and yellow.x-VEL>0:
        yellow.x-=VEL
    if keys_pressed[pygame.K_d] and yellow.x+VEL+yellow.width<BORDER.x:
        yellow.x+=VEL
    if keys_pressed[pygame.K_w] and yellow.y-VEL>0:
        yellow.y-=VEL
    if keys_pressed[pygame.K_s] and yellow.y+VEL+yellow.height<HEIGHT-15:
        yellow.y+=VEL

def red_handle_movement(keys_pressed,red): # 2飞船按键运动,遇到边缘就停下
    if keys_pressed[pygame.K_LEFT] and red.x-VEL>BORDER.x + BORDER.width:
        red.x-=VEL
    if keys_pressed[pygame.K_RIGHT] and red.x + VEL + red.width < WIDTH:
        red.x+=VEL
    if keys_pressed[pygame.K_UP] and red.y - VEL > 0:
        red.y-=VEL
    if keys_pressed[pygame.K_DOWN] and red.y + VEL + red.height < HEIGHT:
        red.y+=VEL

def draw_window(red,yellow,red_bullets,yellow_bullets): # 窗口渲染
    WIN.blit(SPACE,(0,0))
    pygame.draw.rect(WIN,BLAKE,BORDER)
    WIN.blit(YELLOW_SPACESHIP,(yellow.x,yellow.y))
    WIN.blit(RED_SPACESHIP,(red.x,red.y))
    for bullet in red_bullets:
        pygame.draw.rect(WIN,RED,bullet)
    for bullet in yellow_bullets:
        pygame.draw.rect(WIN,YELLOW,bullet)
    pygame.display.update()

if __name__=="__main__": # 主函数
    red=pygame.Rect(700,300,SPACESHIP_WIDTH,SPACESHIP_HEIGHT) # 1飞机
    yellow=pygame.Rect(100,300,SPACESHIP_WIDTH,SPACESHIP_HEIGHT) # 2飞机
    clock=pygame.time.Clock() # Clock(帧数)对象
    red_bullets=[]
    yellow_bullets=[]
    run=True # 游戏是否运行
    while run:
        clock.tick(FPS) # 设置帧数
        for event  in pygame.event.get():
            pygame.mixer.music.play()
            if event.type == pygame.QUIT: # 游戏窗口关闭
                run = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q and len(yellow_bullets) < MAX_BULLETS:
                    bullet = pygame.Rect(
                        yellow.x + yellow.width, yellow.y + yellow.height//2 - 2, 10, 5)
                    yellow_bullets.append(bullet)
                    BULLET_FIRE_SOUND.play()
                if event.key == pygame.K_RETURN and len(red_bullets) < MAX_BULLETS:
                    bullet = pygame.Rect(
                        red.x, red.y + red.height//2 - 2, 10, 5)
                    red_bullets.append(bullet)
                    BULLET_FIRE_SOUND.play()
        keys_pressed = pygame.key.get_pressed() # 按键侦测
        yello_handle_movement(keys_pressed,yellow)
        red_handle_movement(keys_pressed,red)
        handle_bullets(yellow_bullets,red_bullets,yellow,red) # 子弹侦测
        draw_window(red,yellow,red_bullets,yellow_bullets)
    pygame.quit() # 退出游戏

但音效和背景音乐总是有矛盾
移动飞船,背景音乐就会重新播放
发射子弹,背景音乐也会重新播放
求帮助

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-04 14:27
    关注
    • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7809676
    • 这篇博客也不错, 你可以看下Pygame实战:风靡全球的经典泡泡龙小游戏来袭,你会喜欢嘛?(附源码)
    • 除此之外, 这篇博客: pygame之倒计时实现中的 最近在用pygame这个模块进行游戏开发,进行到计时设计的时候,在网上找了很久都没找到自己想要的,然后只能自己瞎几把弄,终于弄出来了一个简陋的倒计时下面是源代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • import pygame
      import time
      def game_clock():
          clock_ = 300
          while True:
              pygame.time.get_ticks()
              if (pygame.time.get_ticks()%1000 == 0):
                  clock_ = clock_ - 1
                  clock_g = str(clock_)
                  gameDisplay.fill(white)
                  largeText = pygame.font.SysFont('comicsansms', 25)
                  TextSurf, TextRect = text_objects(clock_g, largeText)
                  TextRect.center = (750, (display_height / 10))
                  gameDisplay.blit(TextSurf, TextRect)
                  pygame.display.update()
                  clock.tick(15)
                  print(clock_)
    • 您还可以看一下 程序员学院老师的Python专项训练 巩固语法+数据分析+商城开发课程中的 Pygame开发实战之游戏简介与分析小节, 巩固相关知识点
    • 以下回答由chatgpt基于相关博客总结生成:

      问题解答: 你遇到的问题是当你移动飞船和发射子弹时,背景音乐会重新播放。解决这个问题的方法是在播放背景音乐时,检查音乐是否已经在播放,如果已经在播放,则不重新播放。

      下面是一个示例代码:

      import pygame
      from pygame.locals import *
      
      # 初始化
      pygame.init()
      # 创建显示窗口
      screen = pygame.display.set_mode((800, 600))
      
      # 加载背景音乐并设置循环播放
      pygame.mixer.music.load("background_music.mp3")
      pygame.mixer.music.play(-1)
      
      def play_sound(sound_file):
          # 检查音乐是否正在播放
          if not pygame.mixer.music.get_busy():
              pygame.mixer.music.load(sound_file)
              pygame.mixer.music.play()
      
      while True:
          for event in pygame.event.get():
              if event.type == KEYDOWN:
                  if event.key == K_UP:
                      play_sound("move_ship.wav")
                  if event.key == K_SPACE:
                      play_sound("shoot_bullet.wav")
      

      在上面的代码中,我们使用pygame.mixer.music.get_busy()方法来检查背景音乐是否正在播放,如果已经在播放,则不重新播放。同时,我们在按下上方向键时播放移动飞船的音效,按下空格键时播放发射子弹的音效。

      注意,你需要将背景音乐文件名替换为你自己的音乐文件名,将音效文件名替换为你自己的音效文件名。

      希望这个解决方案对你有帮助!如果还有任何问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月5日
  • 已采纳回答 7月5日
  • 创建了问题 7月4日

悬赏问题

  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?