Pygame侧面卷轴街机游戏

3

我正在编写一个横向卷轴式的街机游戏,玩家需要控制火箭并躲避陨石。但是,我想让陨石从右侧移动到左侧的最后一部分还没有成功。这是我目前的代码,但运行时没有任何反应。我尝试了另一种方式,但所有的陨石都同时出现了。非常感谢帮助。

import pygame as pg
from random import *



pg.init()

asteroidgif = pg.image.load("Asteroid.gif")
asteroidimg = pg.transform.scale(asteroidgif, (75,75))

#Setup screen and define colors
res = (1000,800)
screen = pg.display.set_mode(res)
pg.display.set_caption('Rocket game')

#pg.image.load("space.jpg")
black = (0,0,0)
white = (255,255,255)
background1 = pg.image.load("space.jpg").convert()
background2 = pg.image.load("space.jpg").convert()


#Generate random asteroids.
Nasteroid = 1
i = 0
x = 999
y = randint(1,800)
dx = 10                 #pixel step for asteroid
dy = 0
while i < Nasteroid:
    x = x - dx
    y = y

    pg.event.pump()
    screen.blit(asteroidimg,(x,y))
    pg.display.flip()
    i = i + 1
pg.quit()

当你“尝试了一些不同的东西”时,你调整了什么?另外,为什么没有小行星出现,具体是怎么回事? - SuperBiasedMan
我使用了其他代码,但已将其删除。确实,在屏幕上似乎有小行星,但它们并没有出现。我对Python和Pygame还不是很熟悉。 - aeengineer
即使它已经被删除,您能否解释一下您尝试更改的内容以及原因?这可能对解决您的问题非常有帮助。 - SuperBiasedMan
我在游戏循环中生成小行星的部分已经完成。小行星出现在屏幕右侧并不断生成,但仍停留在屏幕右侧。我希望它们不要同时出现,并像“小行星高速公路”一样沿着屏幕移动,而不是像汽车一样。 - aeengineer
为什么你把它们放在只运行一次的while循环内?(while i < Nasteroid: ... i = i + 1) 你在上面设置了Nasteroid为1,而i=0 - SuperBiasedMan
这是一次尝试逐个生成小行星,将它们绘制在屏幕上,然后再生成下一个的尝试。 - aeengineer
1个回答

2
使用Pygame的项目需要一个明确的游戏“主循环” - 这是你的代码的一部分,将在应用程序的每个帧(甚至更频繁)中再次运行。
而且 - 要移动所有的小行星,您需要在每个帧中循环遍历所有小行星。
在学习阶段,您混淆了两个不同的循环的需求 - 所以应该成为您的“永恒”主循环的内容在迭代完所有小行星后立即退出:
while i < Nasteroid:
    x = x - dx
    y = y
    ...
    pg.display.flip()
    i = i + 1
pg.quit()

看到上面了吗?在你的第一轮后,它包含了“2”,然后你的循环就退出了。 作为第一步,在你的游戏实际变得交互之前,你至少需要:

while True:
    i = 0
    pg.event.pump()
    while i < Nasteroid:
        x -= dx
        #y = y
        screen.blit(asteroidimg,(x,y))
        i = i + 1
    pg.display.flip()
    pg.time.delay(30)
pg.quit()

这应该足够让您在应用程序退出之前看到一个小行星在屏幕上闪过 - 在使其可玩之前还有几个步骤,但您应该一次只处理一件事。下一步不起作用的一个问题是:您显然可以使用全局的“x”和“y”变量来控制多个小行星 - 基本的方法是将所有小行星放在一个容器中 - 就像Python列表或pygame精灵组一样,并让每个小行星保持自己的坐标。


哇!谢谢,这确实显示了一些改进。现在发生了什么(我添加了一些自己的代码),一个小行星从右向左移动。然而,小行星的先前位置仍然出现在屏幕上。我该如何避免这种情况?非常感谢您迄今为止的帮助。 - aeengineer
正如我所说,这个项目还有很长的路要走,你还有很多东西需要学习 - 然而,既然你提出的具体问题已经解决,我建议你用更新版本的代码提出其他新问题。 - jsbueno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接