我是Pygame的初学者。我编写了一个用于在不同方向上移动两个球的功能,我按照编码的说明进行操作,但似乎无法正常工作。我可以在屏幕上画两个球,但它们不会移动。我把它固定了差不多1个小时,但不知道为什么球没有移动。
所以,有人可以帮助我检查我的代码,并给我一些提示。我真的很感激任何帮助我的人!
import pygame,sys,time
from pygame.locals import *
# User define function
def ball_move(Surface,white,pos,rad,speed):
size=Surface.get_size()
for item in [0,1]:
pos[item]=pos[item]+speed[item]
if pos[item]<rad:
speed[item]=-speed[item]
if pos[item]+rad>size[item]:
speed[item]=-speed[item]
# Open a brand-new window
pygame.init()
Screen_size = (500,400)
Title = ('Pong')
Frame_Delay = 0.01
Surface= pygame.display.set_mode(Screen_size,0,0)
pygame.display.set_caption(Title)
# Set up white color for drawing balls
white=pygame.Color('white')
# Now, we start to draw two balls
pos1=(100,200)
pos2=(400,200)
rad=10
ball1=pygame.draw.circle(Surface,white,pos1,rad,0)
ball2=pygame.draw.circle(Surface,white,pos2,rad,0)
pygame.display.update()
# Now, define speed
speed1=(2,-2)
speed2=(-2,2)
# Now, we define a loop
while ball1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# Now, we move the ball
ball1move=ball_move(Surface,white,pos1,rad,speed1)
ball2move=ball_move(Surface,white,pos2,rad,speed2)
pygame.draw.circle(Surface,white,pos1,rad,0,0)
pygame.draw.circle(Surface,white,pos2,rad,0,0)
surface.fill(pygame.Color('black'))
答案 0 :(得分:1)
部分saulspatz答案是正确的,部分内容不正确。如果你不想,你不必使用精灵。 pygame.draw
不是很漂亮但完全可用。主要问题似乎是您对事件循环中要做的事情的理解。所有这一切都应该包括在内:
while running:
# Handdle your events
# update your state
# draw to your display
pygame.display.update()
此外,我在你的抽奖之后填写的循环之后注意到你的无法访问的代码。请记住,fill
,blit
或draw
最新事物是否会超过其余部分。所以对你的例子来说:
import pygame ,sys, time
from pygame.locals import *
# User define function
def ball_move(surface, pos, rad, speed):
def _add(l_pos, l_speed, l_size):
l_pos += l_speed
if l_pos <= rad or l_pos >= l_size - rad:
l_speed = -l_speed
return l_pos, l_speed
size = surface.get_size()
pos_x, speed_x = _add(pos[0], speed[0], size[0])
pos_y, speed_y = _add(pos[1], speed[1], size[1])
return (pos_x, pos_y), (speed_x, speed_y)
pygame.init()
screen_size = (500, 400)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('Pong')
running = True
pos1 = (100, 200)
pos2 = (400, 200)
speed1 = (2, -2)
speed2 = (-2, 2)
rad = 10
while running:
# Handdle your events
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# update your state
pos1, speed1 = ball_move(screen, pos1, rad, speed1)
pos2, speed2 = ball_move(screen, pos2, rad, speed2)
# draw to your display
screen.fill(pygame.Color('black'))
pygame.draw.circle(screen, pygame.Color('white'), pos1, rad)
pygame.draw.circle(screen, pygame.Color('white'), pos2, rad)
pygame.display.update()
答案 1 :(得分:0)
您的代码存在很多问题。最基本的是你还没有弄清楚事件驱动编程是如何工作的。您需要放置将球移动到循环中的代码。
另一个问题是我认为您不想使用pygame.draw
模块。自从我编写任何pygame脚本以来已经很长时间了,但是我记得,这个模块对于绘制固定对象很有用,比如背景。快速浏览文档似乎证实了这一点。
对于移动对象,我认为你需要查看pygame.sprite
模块。即使你有这个代码工作,它也不会移动球。它只会在另一个位置画一个新球。所以你会有前两个球,然后是四个,然后是八个......精灵实际上是移动的。对象不仅在新位置绘制,而且在旧位置被删除。您的代码根本不解决擦除问题。
希望这会有所帮助。