【问题标题】:My spawning system doesn't work and I dont know why我的产卵系统不起作用,我不知道为什么
【发布时间】:2019-12-14 06:50:18
【问题描述】:

简单来说,我的产卵系统不起作用

我正在制作一个躲避方块游戏,我希望 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 个是空的,但由于某种原因,当我运行游戏时,精灵的第一个“波”总是没有空的空间。与此同时,比赛继续以预期的结果进行。没有错误信息

任何帮助将不胜感激

【问题讨论】:

  • 我似乎无法正确格式化它。有那么大的问题吗?
  • 好吧,我做到了,但有点糟糕
  • 我修正了你的缩进。顺便说一句,尝试发布MCVE(我知道用游戏创建 MCVE 很难,但尝试删除所有不必要的东西)。我们无法尝试您的代码,因为缺少spritesgame_options,如果您将它们发布在这里,恐怕真的有很多代码需要检查。
  • 感谢您修复格式!抱歉,我试图在上传之前制作一个 MCVE,正如 stackoverflow 指南告诉我的那样,但我就是做不到。此外,我确实发布了其他不太大或与产卵有关的文件。

标签: python pygame spawning


【解决方案1】:

我对 pygame 不熟悉,但我看不出一旦它们通过躲避块,你在哪里重置块。我猜每次你在现有块上添加块并且它们会在旧块之上重新绘制,因此很难清楚每次运行都会有无数块下雨。

并添加一个 print(self.blocks) 来证明这一点,证明我的猜测:D

...
<Group(15 sprites)>
<Group(19 sprites)>
<Group(23 sprites)>
...

【讨论】:

  • 一旦超过阈值,OP 就会杀死 Block 类的 update 方法中的精灵。实际上那里有一个错误:应该是if self.rect.y &gt; HEIGHT,而不是self.x。所以,是的,他/她实际上并没有杀死他们。
  • 哎呀,这是一个错字。要把它改成 self.rect.y
【解决方案2】:

精灵的第一个“波”总是没有空格

这是由于:

self.SPAWNENEMIES = 1

改成:

self.SPAWNENEMIES = pg.USEREVENT

事件的 id 是一个整数。 pygame 事件系统使用一组整数来识别普通动作(鼠标移动或按钮点击、按键等)。正如文档所说:

用户定义事件的值应在 USEREVENT 到 NUMEVENTS - 1 的范围内。

您不应将self.SPAWNENEMIES 定义为等于 1,因为 1 是为另一种类型的事件保留的(不确定实际上是哪一个),这会造成混乱和意外行为。
似乎在您的情况下 yourv 事件实际上已发布多次,尤其是在开始时,因此您叠加了两个波。除非碰巧两个波在同一位置有缺失的方块,否则您会看到 5 个方块。


您应该解决的另一件事是:

num = random.randint(0,len(self.spawnpoints))

应该是:

num = random.randint(0,len(self.spawnpoints)-1)

或者,或者:

num = random.randrange(0,len(self.spawnpoints))

函数random.randint

返回一个随机整数 N,使得 a

端点是包容性的。

您有 5 个块,其索引从 0 到 4。当random.randint 返回 5 时,没有一个块会从以下生成循环中删除。

【讨论】:

  • @M.Michalopoulos 我修正了我的答案,抱歉我之前错过了重点。
  • 感谢您的两次修复!产卵系统现在完美运行! :D
猜你喜欢
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 2020-09-19
  • 2014-01-17
  • 2013-11-27
  • 1970-01-01
  • 2019-05-27
  • 2021-06-07
相关资源
最近更新 更多