【问题标题】:How to get a ball to stay in the screen in Pygame如何让球留在 Pygame 的屏幕上
【发布时间】:2017-08-04 04:59:21
【问题描述】:

我是编码、python 和 pygame 的新手。我试图让一个球从屏幕上掉下来,在两侧反弹,直到它慢慢失去能量并停留在页面底部。我得到了大部分的工作,我的球反弹并失去了能量,但是当它减速并击中底部边缘时,它被卡住并慢慢地移出屏幕。完全不明白为什么,如果有人能告诉我我做错了什么,或者我需要添加到我的代码中,那将会很有帮助。谢谢!

import pygame
from math import  pi

pygame.init()

red = (255,0,0)
black = (0,0,0)
white = (255,255,255)
blue = (0,0,255)

pygame.mouse.set_visible(0)
clock = pygame.time.Clock()

displaySize = (800,600)

screen = pygame.display.set_mode(displaySize)
gameon = True

dt = 0.05

m= 5

ball_r = 30

ball_x = 100
ball_y = 500

ball_vx = 50
ball_vy = -50

g = 10

while gameon == True:

    Dy = 0.05*ball_vy*ball_vy
    Dx = 0.05*ball_vx*ball_vx

    Fy = m*g + Dy
    Fx = -Dx

    ay = Fy/m
    ax = Fx/m

    ball_vy += ay*dt
    ball_vx += ax*dt

    ball_x +=ball_vx*dt
    ball_y +=ball_vy*dt

    if ball_x <= ball_r or ball_x >= displaySize[0]-ball_r:
        ball_vx *=-1
    if ball_y <= ball_r or ball_y >= displaySize[1] - ball_r:
        ball_vy *=-1

    pos = pygame.mouse.get_pos()

    screen.fill(red)

    pygame.draw.circle(screen, white,(pos[0],pos[1]),30,0)

    pygame.draw.circle(screen,    blue,(long(round(ball_x)),long(round(ball_y))),ball_r,0)

    pygame.display.update()

    clock.tick(60)

    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

【问题讨论】:

  • long()的功能是什么?
  • long() 类似于 int() 但用于更长的整数。我使用它是因为它有时会在使用 int() 时给我错误。

标签: python python-2.7 pygame


【解决方案1】:

问题出在以下语句中:

if ball_y <= ball_r or ball_y >= displaySize[1] - ball_r:
    ball_vy *=-1

实际上,您正在设置一个条件,即在第二次在地板上反弹后,ball_y 变得大于displaySize[1]-ball_r

这是一个解决方案;只需在ball_y 试图变得大于displaySize[1] 时将ball_y 的值设置为等于displaySize[1]。将以上行替换为以下行:

if ball_y <= ball_r or ball_y >= displaySize[1] - ball_r:
    ball_y = displaySize[1]- ball_r 
    ball_vy *= -.7

我还将ball_vy 的速度更改为.7。您可以根据自己的情况进行更改。

【讨论】:

  • 好的,谢谢,这有效,但我仍然没有完全理解它。为什么它只发生在第二次反弹而不是第一次反弹之后?
  • 实际上,根据您的代码,每次反弹时,球都会从底部离开屏幕。这就是为什么当 ball_y 大于 displaySize[1]-ball_r(第二次反弹后)时,球不能从 displaySize[1]-ball_r 上方翻过来。
猜你喜欢
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2022-01-21
相关资源
最近更新 更多