我的产卵系统不工作,我不知道为什么
My spawning system doesn't work and I dont know why
简而言之,我的重生系统不工作
我正在制作躲避方块游戏,我希望 5 个生成点中有 1 个为空,以便玩家可以躲避其他生成点。当然那个重生点是随机的。我尝试更改数字并查看我的一些旧游戏和类似游戏,但没有任何效果
编辑:我发布了其他 2 个文件,以便您可以 运行 游戏。我不认为它们是问题的一部分,因为它们不包含与产卵过程相关的任何内容
这是我的主要文件:
import pygame as pg
import random
from sprites import *
from game_options import *
class Game:
def __init__(self):
pg.init()
pg.mixer.init()
self.screen = pg.display.set_mode((WIDTH, HEIGHT))
pg.display.set_caption("BRUH")
self.clock = pg.time.Clock()
self.running = True
def new(self):
self.SPAWNENEMIES = 1
self.my_event = pg.event.Event(self.SPAWNENEMIES)
pg.event.post(self.my_event)
pg.time.set_timer(self.SPAWNENEMIES, 3000)
self.spawnpoint1 = 20, -80
self.spawnpoint2 = 140, -80
self.spawnpoint3 = 260, -80
self.spawnpoint4 = 380, -80
self.spawnpoint5 = 500, -80
self.spawnpoints = (self.spawnpoint1,self.spawnpoint2,self.spawnpoint3,self.spawnpoint4,self.spawnpoint5)
self.all_sprites = pg.sprite.Group()
self.blocks = pg.sprite.Group()
self.player = Player()
self.all_sprites.add(self.player)
self.all_sprites.add(self.blocks)
g.run()
def run(self):
self.running = True
while self.running:
self.clock.tick(FPS)
self.events()
self.update()
self.draw()
def update(self):
self.all_sprites.update()
def events(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.running = False
if event.type == self.SPAWNENEMIES:
num = random.randint(0,len(self.spawnpoints))
#print(num)
for i in range(5):
if num != i:
print(i)
self.block = Block(self.spawnpoints[i])
self.blocks.add(self.block)
self.all_sprites.add(self.blocks)
dead_blocks = pg.sprite.spritecollide(self.player, self.blocks, True)
# if dead_blocks:
# self.running = False
def draw(self):
self.screen.fill(MY_RED)
self.all_sprites.draw(self.screen)
pg.display.flip()
g = Game()
while g.running:
g.new()
g.quit()
这里是game_options.py:
WIDTH = 580
HEIGHT = 800
FPS = 30
# Simple colors
WHITE = (255,255,255)
BLACK = (0,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
RED = (255,0,0)
MY_RED = (255, 67, 67)
GREY = (108,106,106)
和sprites.py
import pygame as pg
from game_options import *
class Player(pg.sprite.Sprite):
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((70,70))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH/2, HEIGHT - 100)
self.speedx = 0
def update(self):
keystate = pg.key.get_pressed()
if keystate[pg.K_LEFT]:
self.speedx += -30
if keystate[pg.K_RIGHT]:
self.speedx += 30
self.rect.x = self.speedx
class Block(pg.sprite.Sprite):
def __init__(self,position):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((100,70))
self.image.fill(GREY)
self.rect = self.image.get_rect()
self.rect.center = position
self.speedy = 20
def update(self):
self.rect.y += self.speedy
if self.rect.x > HEIGHT:
self.kill()
我预计 5 个生成点中有 1 个是空的,但由于某些原因,当我 运行 游戏时,第一个 "wave" 精灵总是没有空的 space。与此同时,游戏继续进行,并取得了预期的结果。没有错误消息
如有任何帮助,我们将不胜感激
我不熟悉pygame,但我没看到你在方块通过躲避方块后在哪里重置方块。我猜想每次你在现有块上添加块时,它们都会在旧块上重新绘制,因此很难清楚地知道每个 运行.[=11 上都有无数的块下雨=]
然后添加一个 print(self.blocks) 输出这个,证明我的猜测 :D
...
<Group(15 sprites)>
<Group(19 sprites)>
<Group(23 sprites)>
...
the first "wave" of sprites always has no empty space
这是由于:
self.SPAWNENEMIES = 1
改为:
self.SPAWNENEMIES = pg.USEREVENT
事件的id是一个整数。 pygame 事件系统使用一组整数来识别普通动作(鼠标移动或按钮单击、按键等)。正如文档所说:
User defined events should have a value in the inclusive range of USEREVENT to NUMEVENTS - 1.
您不应将 self.SPAWNENEMIES
定义为 1,因为 1 是另一种类型的事件(不确定实际上是哪种),这会造成混淆和意外行为。
似乎在您的情况下,您的事件实际上已发布多次,尤其是在开始时,因此您叠加了两个波浪。除非碰巧两个波都在同一位置丢失了方块,否则您会看到 5 个方块。
您应该修复的另一件事是:
num = random.randint(0,len(self.spawnpoints))
应该是:
num = random.randint(0,len(self.spawnpoints)-1)
或者,或者:
num = random.randrange(0,len(self.spawnpoints))
Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).
端点包括在内。
你有 5 个块,它们的索引从 0 到 4。当 random.randint
returns 5 时,没有一个块从以下生成循环中移除。
简而言之,我的重生系统不工作
我正在制作躲避方块游戏,我希望 5 个生成点中有 1 个为空,以便玩家可以躲避其他生成点。当然那个重生点是随机的。我尝试更改数字并查看我的一些旧游戏和类似游戏,但没有任何效果
编辑:我发布了其他 2 个文件,以便您可以 运行 游戏。我不认为它们是问题的一部分,因为它们不包含与产卵过程相关的任何内容
这是我的主要文件:
import pygame as pg
import random
from sprites import *
from game_options import *
class Game:
def __init__(self):
pg.init()
pg.mixer.init()
self.screen = pg.display.set_mode((WIDTH, HEIGHT))
pg.display.set_caption("BRUH")
self.clock = pg.time.Clock()
self.running = True
def new(self):
self.SPAWNENEMIES = 1
self.my_event = pg.event.Event(self.SPAWNENEMIES)
pg.event.post(self.my_event)
pg.time.set_timer(self.SPAWNENEMIES, 3000)
self.spawnpoint1 = 20, -80
self.spawnpoint2 = 140, -80
self.spawnpoint3 = 260, -80
self.spawnpoint4 = 380, -80
self.spawnpoint5 = 500, -80
self.spawnpoints = (self.spawnpoint1,self.spawnpoint2,self.spawnpoint3,self.spawnpoint4,self.spawnpoint5)
self.all_sprites = pg.sprite.Group()
self.blocks = pg.sprite.Group()
self.player = Player()
self.all_sprites.add(self.player)
self.all_sprites.add(self.blocks)
g.run()
def run(self):
self.running = True
while self.running:
self.clock.tick(FPS)
self.events()
self.update()
self.draw()
def update(self):
self.all_sprites.update()
def events(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.running = False
if event.type == self.SPAWNENEMIES:
num = random.randint(0,len(self.spawnpoints))
#print(num)
for i in range(5):
if num != i:
print(i)
self.block = Block(self.spawnpoints[i])
self.blocks.add(self.block)
self.all_sprites.add(self.blocks)
dead_blocks = pg.sprite.spritecollide(self.player, self.blocks, True)
# if dead_blocks:
# self.running = False
def draw(self):
self.screen.fill(MY_RED)
self.all_sprites.draw(self.screen)
pg.display.flip()
g = Game()
while g.running:
g.new()
g.quit()
这里是game_options.py:
WIDTH = 580
HEIGHT = 800
FPS = 30
# Simple colors
WHITE = (255,255,255)
BLACK = (0,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
RED = (255,0,0)
MY_RED = (255, 67, 67)
GREY = (108,106,106)
和sprites.py
import pygame as pg
from game_options import *
class Player(pg.sprite.Sprite):
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((70,70))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.rect.center = (WIDTH/2, HEIGHT - 100)
self.speedx = 0
def update(self):
keystate = pg.key.get_pressed()
if keystate[pg.K_LEFT]:
self.speedx += -30
if keystate[pg.K_RIGHT]:
self.speedx += 30
self.rect.x = self.speedx
class Block(pg.sprite.Sprite):
def __init__(self,position):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((100,70))
self.image.fill(GREY)
self.rect = self.image.get_rect()
self.rect.center = position
self.speedy = 20
def update(self):
self.rect.y += self.speedy
if self.rect.x > HEIGHT:
self.kill()
我预计 5 个生成点中有 1 个是空的,但由于某些原因,当我 运行 游戏时,第一个 "wave" 精灵总是没有空的 space。与此同时,游戏继续进行,并取得了预期的结果。没有错误消息
如有任何帮助,我们将不胜感激
我不熟悉pygame,但我没看到你在方块通过躲避方块后在哪里重置方块。我猜想每次你在现有块上添加块时,它们都会在旧块上重新绘制,因此很难清楚地知道每个 运行.[=11 上都有无数的块下雨=]
然后添加一个 print(self.blocks) 输出这个,证明我的猜测 :D
...
<Group(15 sprites)>
<Group(19 sprites)>
<Group(23 sprites)>
...
the first "wave" of sprites always has no empty space
这是由于:
self.SPAWNENEMIES = 1
改为:
self.SPAWNENEMIES = pg.USEREVENT
事件的id是一个整数。 pygame 事件系统使用一组整数来识别普通动作(鼠标移动或按钮单击、按键等)。正如文档所说:
User defined events should have a value in the inclusive range of USEREVENT to NUMEVENTS - 1.
您不应将 self.SPAWNENEMIES
定义为 1,因为 1 是另一种类型的事件(不确定实际上是哪种),这会造成混淆和意外行为。
似乎在您的情况下,您的事件实际上已发布多次,尤其是在开始时,因此您叠加了两个波浪。除非碰巧两个波都在同一位置丢失了方块,否则您会看到 5 个方块。
您应该修复的另一件事是:
num = random.randint(0,len(self.spawnpoints))
应该是:
num = random.randint(0,len(self.spawnpoints)-1)
或者,或者:
num = random.randrange(0,len(self.spawnpoints))
Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).
端点包括在内。
你有 5 个块,它们的索引从 0 到 4。当 random.randint
returns 5 时,没有一个块从以下生成循环中移除。