<p>为了使你的程序不那么复杂,你需要一些关于气球和螺丝的类。第一个类是为你的玩家准备的,假设你只从左向右移动:</p>
<pre><code>class Player(pygame.sprite.Sprite):
def __init__(self, image_file, location):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image_file)
self.rect = pygame.image.get_rect()
self.rect.top, self.rect.left = location
</code></pre>
<p>这段代码将使你的气球成为精灵,准备好检测碰撞。你的screws类看起来很相似,只是在类的<code>move</code>和<code>location</code>函数和<code>speed</code>在类的<code>__init__</code>部分:</p>
^{2}$
<p>这个类使螺丝精灵,也准备好检测。课程部分到此结束。现在我们来谈谈这些精灵的分组,等等:</p>
<pre><code>balloon = Player('/users/Gaming/Desktop/rsz_baloon.png', [a, b])
screw = Screws('/users/Gaming/Desktop/rsz_screw_png3029.png', random.randint(0, <ScreenSize>), c)
ScrewGroup = pygame.sprite.Group()
</code></pre>
<p>同样,变量是可变的,但是<code>c</code>越高,螺钉下降的速度就越快。<code>a</code>和<code>b</code>将决定气球的位置,<code>random.randint()</code>将决定螺钉的位置。<code>self.rect.top</code>是一种查找位置的方法,它将其用作<code>rect</code>的“顶部”侧的位置。在这种情况下,它保持不变。对于,<code>self.rect.left</code>也是一样,但它是<code>rect</code>的“左”侧的位置。现在转到气球的移动部分,为了避免上下按键的过度按下(以及疲劳),请在后面添加以下代码行:</p>
<pre><code>delay = 100
interval = 50
pygame.key.set_repeat(delay, interval)
on = True
screwy = 0
</code></pre>
<p><code>delay</code>是每个KEYDOWN被激活之间的毫秒数,interval是等待到重复的KEYDOWN的毫秒数。这将帮助用户只需按住右箭头键的左边,气球将继续朝所需的方向移动。下一节将讨论<code>on</code>和<code>screwy</code>变量。接下来,while循环即将出现:</p>
<pre><code>while True:
screen.blit(balloon.image, balloon.rect)
while int(screwy - 1) > -1:
screen.blit(screw.image, screw.rect)
pygame.display.flip()
</code></pre>
<p>只要<code>screwy</code>-1的<em>值</em>小于-1(负1),while循环会生成尽可能多的螺钉。这还会翻转屏幕,以避免屏幕上留下任何“轨迹”。现在到气球的移动部分:</p>
<pre><code>for event in pygame.event.get():
#Remember to do this : from pygame.locals import *#
if event.type == QUIT:
on = False
#Remember to import sys!#
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key = K_LEFT:
balloon.rect.left -= 30
elif event.key == K_RIGHT:
#This can only work if (width_of_the_picture - a) is equal to 30#
balloon.rect.left += int(width_of_the_picture - a)
</code></pre>
<p>这将允许你移动气球(你可以按住键使气球像在真正的电子游戏中一样移动)。接下来将是螺丝钉的继续繁殖:</p>
<pre><code>if screwy < 10:
ScrewGroup.append(Screws('/users/Gaming/Desktop/rsz_screw_png3029.png', random.randint(0, b), [0, 15]))
screwy += 1
</code></pre>
<p>这将在随机位置生成螺钉(相同的<code>self.rect.top</code>值使其看起来真实)。<code>b</code>在本例中等于屏幕的宽度。最后,精灵检测:</p>
<pre><code>if pygame.sprite.spritecollide(balloon, ScrewGroup, True):
on = False
sys.exit()
pass
</code></pre>
<p>这将检测气球是否与螺丝相撞。如果那是真的,你可以决定。您可以退出while循环并退出程序,这是一种方法。但是,如果您计划执行<code>print 'Game Over!</code>之类的操作,请在执行<code>on = False</code>/<code>sys.exit()</code>之前添加这一行,这将立即退出循环/程序。您需要重新blit图像并允许屏幕顺利退出(<code>pygame.quit</code>):</p>
<pre><code> screen.fill([255, 255, 255])
screen.blit(balloon.image, balloon.rect)
while int(screwy - 1) > -1:
screen.blit(screw)
pygame.display.flip()
pygame.quit()
</code></pre>
<p>记住把<code>pygame.quit()</code>放在while循环之外,否则屏幕会立即消失。当然,做一些代码来防止气球离开屏幕。将KEYDOWN部分更改为以下内容:</p>
<pre><code>elif event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
if int(balloon.rect.left) - 30 < 0:
pass
elif int(balloon.rect.left) - 30 >= 0:
balloon.rect.left -= 30
elif event.key == K_RIGHT:
if int(balloon.rect.left) + (<Width_OF_Balloon> - a) > <Width_OF_Screen>:
pass
elif int(balloon.rect.left) + (<Width_OF_Balloon> - a) <= <Width_OF_Screen>:
#This can only work if (<Width_OF_Balloon> - a) is equal to 30#
baloon.rect.left + (<Width_OF_Balloon> - a)
</code></pre>
<p>如果向左/向右移动一次使气球部分离开屏幕,程序将不允许气球通过不使用<code>pass</code>向左/向右移动。这将大大改善你的计划,并回答你的问题。我希望这对你有帮助!在</p>