簡體   English   中英

我的產卵系統不起作用,我也不知道為什么

[英]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個是空的,但是由於某種原因,當我運行游戲時,子圖形的第一個“波浪”始終沒有空白空間。 同時,游戲繼續以預期的結果進行。 沒有錯誤訊息

任何幫助,將不勝感激

精靈的第一個“波浪”始終沒有空白空間

這是因為:

self.SPAWNENEMIES = 1

更改為:

self.SPAWNENEMIES = pg.USEREVENT

事件的ID是整數。 pygame事件系統使用一組整數來標識普通操作(鼠標移動或按鈕單擊,按鍵按下等)。 正如文檔所說:

用戶定義的事件的值應在USEREVENT到NUMEVENTS-1的范圍內。

您不應該將self.SPAWNENEMIES定義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))

函數random.randint

返回一個隨機整數N,使得a <= N <= b。 randrange(a,b + 1)的別名。

端點包含在內。

您有5個塊,其索引從0到4。當random.randint返回5時,沒有一個塊從以下生成循環中刪除。

我對pygame不熟悉,但是一旦它們穿過閃避塊,我就看不到您在哪里重置塊。 我猜想每次您在現有塊上添加塊時,它們都會在舊塊之上重繪,因此,每次運行時都有不計其數的塊正在下雨並不容易。

並添加一個print(self.blocks)來解決這個問題,證明我的猜測:D

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM