如何让球从上到下反弹?
我正在制作一个简单的乒乓球游戏,想让球在上下之间反弹。我知道我需要修改代码中的“test_collide_top_ball”和“test_collide_bottom_ball”这两个部分(在下面的第二个代码块中找到),但我有点不确定我的逻辑和解决方案是否正确。
所以,如果我想让球在碰到顶部时反弹回去,是否可以这样说:“self.y = self.y - dy”?当球碰到底部时也是同样的道理,只不过这次是加上去,而不是减去?
另外,我对如何让球在基础代码中移动有点困惑。谢谢你们的帮助!
这是我的基础代码:
import math
import random
import sys, pygame
from pygame.locals import *
import ball
import colors
import paddle
# draw the scene
def draw(screen, ball1, paddle1) :
screen.fill((128, 128, 128))
ball1.draw_ball(screen)
paddle1.draw_paddle(screen)
#function to start up the main drawing
def main():
pygame.init()
width = 600
height = 600
screen = pygame.display.set_mode((width, height))
ball1 = ball.Ball(300, 1, 40, colors.RED)
paddle1 = paddle.Paddle(100, 575, colors.BLUE, 100, 20)
while 1:
for event in pygame.event.get():
if event.type == QUIT: sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
paddle1.update_paddle('right', 15)
if event.key == pygame.K_LEFT:
paddle1.update_paddle('left', 15)
draw(screen, ball1, paddle1)
pygame.display.flip()
if __name__ == '__main__':
main()
这是我为球定义的类和方法:
import pygame
class Ball:
def __init__(self, x, y, radius, color):
self.x = x
self.y = y
self.radius = radius
self.color = color
def draw_ball(self, screen):
pygame.draw.ellipse(screen, self.color,
pygame.Rect(self.x, self.y, self.radius, self.radius))
def update_ball(self, dx, dy):
self.x += dx
self.y += dy
def test_collide_top_ball(self, top_height):
if (self.y == top_height):
return True
else:
return False
def test_collide_bottom_ball(self, coll_height):
if (self.y == coll_height):
return True
else:
return False
提前谢谢你们!
1 个回答
0
问题在于,球的 self.y
值和屏幕的宽度很少会“相等”。所以,你应该检查一下球是否超出了屏幕的边界。你的更新方法应该是这样的:
[注意] dx
和 dy
这两个变量应该是类的属性,而不是从外部传入的。
def update_ball(self, dx, dy, screen_w, screen_h): #added screen width and height parameters
self.x += self.dx
self.y += self.dy
if self.y > screen_h:
self.y -= 5
self.dy *= -1
elif self.y < 0:
self.y += 5
self.dy *= -1
if self.x > screen_w:
self.x -= 5
self.dx *= -1
elif self.x < 0:
self.x += 5
self.dx *= -1