如何驱动单个精灵
How can I drive individual sprites
我希望个别汽车在一定时间内从左到右驶过屏幕interval.It应该是一个无限循环。它由程序结束结束
使用我的代码,它们都是同时开始的。此外,rect.y 由默认值 300 更改为 0。
import pygame
import random
WIDTH = 800
HEIGHT = 600
FPS = 30
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
class Car(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.images = []
for i in range(5):
img = pygame.image.load(f"Bilder/Gegenstaende/quer_auto_{i}.png")
self.images.append(img)
self.image = self.images[random.randrange(0, 5)]
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 300
self.last = pygame.time.get_ticks()
self.delay = 5000
def update(self):
self.rect.x += 5
current = pygame.time.get_ticks()
if current - self.last > self.delay:
self.last = current
self.image = self.images[random.randrange(0, 5)]
self.rect = self.image.get_rect()
self.rect.x = 100
background = pygame.image.load("Bilder/starfield.png")
background_rect = background.get_rect()
cars = pygame.sprite.Group()
for i in range(3):
m = Car()
cars.add(m)
running = True
while running:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
cars.update()
screen.fill((250,250,250))
screen.blit(background,background_rect)
cars.draw(screen)
pygame.display.flip()
pygame.quit()
(假设您希望这些汽车成为机器人)首先创建变量并将它们命名为 car_move_right
和 car_move_left
。如果您希望汽车在游戏开始时向右移动,请将 car_move_right
设置为 True,将另一个变量设置为 False,反之亦然。然后在主循环中,添加一个 if
语句,如下所示:
(以carX为car的X坐标)
if car_move_right:
carX += ai_move_speed
if carX == WINDOWWIDTH or carX > WINDOWWIDTH:
car_move_right = False
car_move_left = True
if car_move_left:
carX -= ai_move_speed
if carX == 0 or carX < 0:
car_move_left = False
car_move_right = True
请注意:我为机器人运动编写了这段代码,其中还包括上下运动。不是最干净和最好的,但我认为它适合你。
rect.y 更改为 0,因为您重置了矩形,默认矩形的 x 和 y 值为 0。
if current - self.last > self.delay:
self.last = current
self.image = self.images[random.randrange(0, 5)]
self.rect = self.image.get_rect() ##<--- here
self.rect.x = 100
您还应该考虑将汽车的位置存储在 python 变量中,因为 self.rect.x
只能存储整数。
对于计时器,您应该将更新功能移到您的汽车之外 class,因为它没有关于其他汽车的任何信息,而它需要它。
这是一个示例实现。
import pygame
WIDTH = 800
HEIGHT = 600
FPS = 30
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
class Car(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 50)).convert()
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 300
def finished(self):
return self.rect.x >= WIDTH - self.rect.width
class Driver:
def __init__(self, cars):
self.cars = cars
self.currentCar = 0
self.delay = 1000
self.current = pygame.time.get_ticks()
self.last = pygame.time.get_ticks()
self.timePassed = False
def updateCar(self, car):
if self.timePassed:
car.rect.x += 1 #5
def runTimer(self):
self.current = pygame.time.get_ticks()
self.timePassed = False
if self.current - self.last > self.delay:
self.timePassed = True
def Run(self):
self.runTimer()
car = self.cars.sprites()[self.currentCar]
if not car.finished():
self.updateCar(car)
else:
self.current = pygame.time.get_ticks()
self.last = pygame.time.get_ticks()
self.currentCar += 1
def allFinished(self):
return self.currentCar >= len(self.cars)
cars = pygame.sprite.Group()
for i in range(3):
m = Car()
cars.add(m)
driver = Driver(cars)
while True:
if not driver.allFinished():
driver.Run()
#btw, no need to fill if you have background image the size of window
screen.fill((250,250,250))
#screen.blit(background,background_rect)
cars.draw(screen)
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
创造 10 辆车 类。给它们起一个不同的名字,比如 car1
、car2
等
让我们暂时关注 car1
。让 car1X
代表 car1
.
的 x 坐标
现在是移动速度。如果希望每辆车的速度相同,只需创建一个名为 ai_move_speed
的变量即可。现在,如果您希望速度不同,则创建 10 个变量而不是 ai_move_speed
,并将这些变量命名为 ai1_move_speed
、ai2_move_speed
等。现在,将这些变量设置为整数2 的值。
对于从左到右的移动,创建一个名为car1_move_right
的变量并将其设置为True。
由于每辆车都会从左向右行驶,然后死亡,我们可以简单地将这段代码添加到我们的主循环中:
if car1_move_right:
car1X += ai_move_speed
现在一旦游戏进入 运行,car1
将从其 x 坐标向左侧移动。对其他汽车重复此过程。
但是如果你想让小车在出界或者死亡的情况下回到原来的位置,那么只需要在上面代码的末尾添加这行代码:
if carX == 800:
carX = 100
到目前为止我们已经修复了移动。现在,如果您希望汽车一辆接一辆地启动,请删除之前的整个代码。现在您可以自定义汽车启动的时间。对于 car1
让我们简单地创建一个变量并将此变量命名为 c1_time
。现在将其设置为 5000。现在我想向您介绍一个名为 pygame.time.get_ticks()
的 pygame 函数。它获取自 pygame.init()
被调用以来的毫秒数(以毫秒为单位)。还记得 c1_time
吗?我们将其设置为整数值 5000,因为 1000 毫秒为 1 秒,因此 car1
将在解释器读取 pygame.init()
.
后 5 秒后开始移动
现在创建此变量:time_init
并将此代码存储在其中:pygame.time.get_ticks()
。之后创建一个 if
语句:
if car1_move_right:
if time_init >= c1_time:
car1X += ai_move_speed
if car1X == 800:
car1X = 100
现在上面的代码所做的是在游戏开始 5 秒后,它会开始移动 car1
。如果 car1 超出边界,它会再次返回。对其他汽车重复这些步骤。这是我能做到的最简单且没有错误的方法。
PS - 随意更改任何变量名称。只需确保在代码中的所有位置都进行更改即可。
PPS - 请通读全文。如果您觉得这有帮助,也请点赞,因为我在这上面花了很多时间。
我希望个别汽车在一定时间内从左到右驶过屏幕interval.It应该是一个无限循环。它由程序结束结束 使用我的代码,它们都是同时开始的。此外,rect.y 由默认值 300 更改为 0。
import pygame
import random
WIDTH = 800
HEIGHT = 600
FPS = 30
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
class Car(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.images = []
for i in range(5):
img = pygame.image.load(f"Bilder/Gegenstaende/quer_auto_{i}.png")
self.images.append(img)
self.image = self.images[random.randrange(0, 5)]
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 300
self.last = pygame.time.get_ticks()
self.delay = 5000
def update(self):
self.rect.x += 5
current = pygame.time.get_ticks()
if current - self.last > self.delay:
self.last = current
self.image = self.images[random.randrange(0, 5)]
self.rect = self.image.get_rect()
self.rect.x = 100
background = pygame.image.load("Bilder/starfield.png")
background_rect = background.get_rect()
cars = pygame.sprite.Group()
for i in range(3):
m = Car()
cars.add(m)
running = True
while running:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
cars.update()
screen.fill((250,250,250))
screen.blit(background,background_rect)
cars.draw(screen)
pygame.display.flip()
pygame.quit()
(假设您希望这些汽车成为机器人)首先创建变量并将它们命名为 car_move_right
和 car_move_left
。如果您希望汽车在游戏开始时向右移动,请将 car_move_right
设置为 True,将另一个变量设置为 False,反之亦然。然后在主循环中,添加一个 if
语句,如下所示:
(以carX为car的X坐标)
if car_move_right:
carX += ai_move_speed
if carX == WINDOWWIDTH or carX > WINDOWWIDTH:
car_move_right = False
car_move_left = True
if car_move_left:
carX -= ai_move_speed
if carX == 0 or carX < 0:
car_move_left = False
car_move_right = True
请注意:我为机器人运动编写了这段代码,其中还包括上下运动。不是最干净和最好的,但我认为它适合你。
rect.y 更改为 0,因为您重置了矩形,默认矩形的 x 和 y 值为 0。
if current - self.last > self.delay:
self.last = current
self.image = self.images[random.randrange(0, 5)]
self.rect = self.image.get_rect() ##<--- here
self.rect.x = 100
您还应该考虑将汽车的位置存储在 python 变量中,因为 self.rect.x
只能存储整数。
对于计时器,您应该将更新功能移到您的汽车之外 class,因为它没有关于其他汽车的任何信息,而它需要它。
这是一个示例实现。
import pygame
WIDTH = 800
HEIGHT = 600
FPS = 30
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
class Car(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 50)).convert()
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 300
def finished(self):
return self.rect.x >= WIDTH - self.rect.width
class Driver:
def __init__(self, cars):
self.cars = cars
self.currentCar = 0
self.delay = 1000
self.current = pygame.time.get_ticks()
self.last = pygame.time.get_ticks()
self.timePassed = False
def updateCar(self, car):
if self.timePassed:
car.rect.x += 1 #5
def runTimer(self):
self.current = pygame.time.get_ticks()
self.timePassed = False
if self.current - self.last > self.delay:
self.timePassed = True
def Run(self):
self.runTimer()
car = self.cars.sprites()[self.currentCar]
if not car.finished():
self.updateCar(car)
else:
self.current = pygame.time.get_ticks()
self.last = pygame.time.get_ticks()
self.currentCar += 1
def allFinished(self):
return self.currentCar >= len(self.cars)
cars = pygame.sprite.Group()
for i in range(3):
m = Car()
cars.add(m)
driver = Driver(cars)
while True:
if not driver.allFinished():
driver.Run()
#btw, no need to fill if you have background image the size of window
screen.fill((250,250,250))
#screen.blit(background,background_rect)
cars.draw(screen)
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
创造 10 辆车 类。给它们起一个不同的名字,比如
car1
、car2
等让我们暂时关注
的 x 坐标car1
。让car1X
代表car1
.现在是移动速度。如果希望每辆车的速度相同,只需创建一个名为
ai_move_speed
的变量即可。现在,如果您希望速度不同,则创建 10 个变量而不是ai_move_speed
,并将这些变量命名为ai1_move_speed
、ai2_move_speed
等。现在,将这些变量设置为整数2 的值。对于从左到右的移动,创建一个名为
car1_move_right
的变量并将其设置为True。由于每辆车都会从左向右行驶,然后死亡,我们可以简单地将这段代码添加到我们的主循环中:
if car1_move_right:
car1X += ai_move_speed
现在一旦游戏进入 运行,car1
将从其 x 坐标向左侧移动。对其他汽车重复此过程。
但是如果你想让小车在出界或者死亡的情况下回到原来的位置,那么只需要在上面代码的末尾添加这行代码:
if carX == 800:
carX = 100
到目前为止我们已经修复了移动。现在,如果您希望汽车一辆接一辆地启动,请删除之前的整个代码。现在您可以自定义汽车启动的时间。对于
后 5 秒后开始移动car1
让我们简单地创建一个变量并将此变量命名为c1_time
。现在将其设置为 5000。现在我想向您介绍一个名为pygame.time.get_ticks()
的 pygame 函数。它获取自pygame.init()
被调用以来的毫秒数(以毫秒为单位)。还记得c1_time
吗?我们将其设置为整数值 5000,因为 1000 毫秒为 1 秒,因此car1
将在解释器读取pygame.init()
.现在创建此变量:
time_init
并将此代码存储在其中:pygame.time.get_ticks()
。之后创建一个if
语句:
if car1_move_right:
if time_init >= c1_time:
car1X += ai_move_speed
if car1X == 800:
car1X = 100
现在上面的代码所做的是在游戏开始 5 秒后,它会开始移动 car1
。如果 car1 超出边界,它会再次返回。对其他汽车重复这些步骤。这是我能做到的最简单且没有错误的方法。
PS - 随意更改任何变量名称。只需确保在代码中的所有位置都进行更改即可。
PPS - 请通读全文。如果您觉得这有帮助,也请点赞,因为我在这上面花了很多时间。