首页 > 解决方案 > 当角色没有接球时,我希望球被随机放置然后再次落下,但这并没有发生,为什么?

问题描述

1.Catch it.py 这是主要的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.字符.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()

标签: pythonpygame

解决方案


self.rect.yBall实例由 更新self.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

sleep(1)从类中删除Ball。如果您想延迟游戏,请使用该pygame.time模块。


推荐阅读