当角色没有接住球时,我希望球被随机放置,然后再次落下,但这不会发生,为什么?

2024-06-02 08:07:18 发布

您现在位置:Python中文网/ 问答频道 /正文

1.抓住它 这是主python文件

 import sys
 import pygame
 from settings import Settings
 from character import Character
 from ball import Ball
 import game_functions as gf
 def run_game():
    ai_settings=Settings(1200,700,(230,230,230))
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption('catch it')

    boy=Character(screen,ai_settings)
    ball=Ball(screen,ai_settings)
    while True:
       gf.check_events(screen,ai_settings,boy)
       gf.update_ball(screen,ai_settings,ball,boy)
       boy.update()
    
       gf.update_screen(screen,ai_settings,boy,ball)
 run_game()

2.settings.py 该文件具有屏幕、球速和角色速度的所有设置

 class Settings():
    def __init__(self,screen_width,screen_height,screen_bg_color):
      self.screen_width=screen_width
      self.screen_height=screen_height
      self.screen_bg_color=screen_bg_color
      self.speed_ball=0.1
      self.speed_character=2
    

3.ball.py 更新方法将球向下移动一个像素,并检查球的底部是否到达屏幕底部。在球到达底部后,我尝试放置另一个随机落下的球,但我的球没有落下,我可以看到一个随机球形成但没有移动,然后消失,然后出现另一个,依此类推

from time import sleep
import pygame
from random import randint
class Ball():
   def __init__(self,screen,ai_settings):
    self.screen=screen
    self.screen_rect=screen.get_rect()
    self.ai_settings=ai_settings


    self.image=pygame.image.load('/Users/WIN-10/Desktop/game/catching ball/ball.bmp')
    self.rect=self.image.get_rect()
    '''randomly initialize position of ball'''
    self.rect.x=randint(0,self.ai_settings.screen_width)
    self.rect.y=randint(0,self.ai_settings.screen_height)

    self.y=float(self.rect.y)

   def update(self):
    '''check if ball reached bottom of screen'''
    
    
    self.y+=self.ai_settings.speed_ball
    self.rect.y=self.y
    if self.rect.bottom>=self.screen_rect.bottom:
      self.rect.x=randint(0,self.ai_settings.screen_width)
    sleep(1)
   def blitme(self):
    self.screen.blit(self.image,self.rect)

4.character.py

from random import randint
import pygame
class Character():
  def __init__ (self,screen,ai_settings):
    self.screen=screen
    self.ai_settings=ai_settings
    self.image=pygame.image.load('/Users/WIN-10/Desktop/game/catching ball/boy.bmp ')
    self.rect=self.image.get_rect()
    self.screen_rect=self.screen.get_rect()

    '''initializing position'''
    self.rect.x=self.screen_rect.centerx
    self.rect.bottom=self.screen_rect.bottom

    
    
    self.moving_left=False
    self.moving_right=False
    self.x=float(self.rect.x)
    
    
  def update(self):
    if self.moving_left and self.x>0:
        self.x-=self.ai_settings.speed_character
    if self.moving_right and self.x<self.screen_rect.right:
        self.x+=self.ai_settings.speed_character
    self.rect.x=self.x

  def blitme(self):
      self.screen.blit(self.image,self.rect)
        

5.game_functions.py

   import pygame
   import sys
   from random import randint
   def check_key_down(event,screen,ai_settings,boy):

      if event.key==pygame.K_LEFT:
         boy.moving_left=True
      elif event.key==pygame.K_RIGHT:
        boy.moving_right=True





   def check_key_up(event,screen,ai_settings,ship):
      if event.key==pygame.K_LEFT:
         ship.moving_left=False
      elif event.key==pygame.K_RIGHT:
        ship.moving_right=False


   def check_events(screen,ai_settings,boy):

      for event in pygame.event.get():
        if event.type==pygame.K_q:
           sys.exit()
        elif event.type==pygame.KEYUP:
           check_key_up(event,screen,ai_settings,boy)
        elif event.type==pygame.KEYDOWN:
           check_key_down(event,screen,ai_settings,boy)


   def check_ball_character_collision(screen,ai_settings,ball,boy):
       collisions=pygame.sprite.collide_rect(ball, boy)
       return collisions

   def ball_caught(ball):
       ball.rect.x=randint(0,ball.ai_settings.screen_width)
       ball.rect.y=randint(0,ball.ai_settings.screen_height-200)
 
   def update_ball(screen,ai_settings,ball,boy):
     ball.update()

    
     if check_ball_character_collision(screen,ai_settings,ball,boy):
        ball_caught(ball)
   

    


   def update_screen(screen,ai_settings,boy,ball):
      screen.fill(ai_settings.screen_bg_color)
      ball.blitme()
      boy.blitme()
      pygame.display.flip()

1条回答
网友
1楼 · 发布于 2024-06-02 08:07:18

Ball实例的self.rect.yself.y更新。因此,您必须更改ball.y而不是ball.rect.y

def ball_caught(ball):
    
    ball.rect.x = randint(0,ball.ai_settings.screen_width)
    
    # ball.rect.y = randint(0,ball.ai_settings.screen_height-200) < - DELETE

    ball.y = randint(0,ball.ai_settings.screen_height-200)      # < - ADD

从类Ball中删除sleep(1)。如果您想延迟游戏,那么使用^{}模块

相关问题 更多 >