当我编写'Pong'时,为什么在Pygame中我的代码中的球无法移动?有人可以帮我查看我的代码吗?

时间:2015-10-07 02:44:46

标签: python pygame

我是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'))

2 个答案:

答案 0 :(得分:1)

部分saulspatz答案是正确的,部分内容不正确。如果你不想,你不必使用精灵。 pygame.draw不是很漂亮但完全可用。主要问题似乎是您对事件循环中要做的事情的理解。所有这一切都应该包括在内:

while running:
    # Handdle your events
    # update your state
    # draw to your display
    pygame.display.update()

此外,我在你的抽奖之后填写的循环之后注意到你的无法访问的代码。请记住,fillblitdraw最新事物是否会超过其余部分。所以对你的例子来说:

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模块。即使你有这个代码工作,它也不会移动球。它只会在另一个位置画一个新球。所以你会有前两个球,然后是四个,然后是八个......精灵实际上是移动的。对象不仅在新位置绘制,而且在旧位置被删除。您的代码根本不解决擦除问题。

希望这会有所帮助。