python - 当角色没有接球时,我希望球被随机放置然后再次落下,但这并没有发生,为什么?
问题描述
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()
解决方案
self.rect.y
的Ball
实例由 更新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
模块。
推荐阅读
- sql - 在 Bigquery 中按用户计算登录之间的时间
- javascript - 在 JavaScript 中监听变量值的变化
- python - 根据项目的常见切片文本对列表项进行分组
- r - 如何在R中标记时间序列数据中提取的峰值
- javascript - 如何在 Javascript 上链接两个 CSS 转换?
- ios - 如何使用 UICollectionViewCompositionalLayout 的部分提供程序跳过部分?
- javascript - 将 PHP 变量传递给 JavaScript 控制台错误
- bash - 如何使用 bash 脚本将完全限定的类名转换为标题大小写?
- python - 每次获取字典值时执行函数的方法
- python - 你将如何使用哈希映射而不是集合来解决这个问题?