Pygame - 生成随机对象错误

时间:2021-04-04 18:23:05

标签: python pygame

晚上好,亲爱的stackoverflowers。 我正在 Pygame 中创建一个游戏。到目前为止,我并没有真正遇到任何问题,但现在我会很感激一些帮助。我正在尝试创建每次调用时都会自动生成新关卡的函数(在击败当前关卡中的每个敌人之后,更具体地说)。现在我只生成你不会碰撞的图像,只是为了让关卡更漂亮,但我也会使用这个函数来生成对象,所以这对我来说很重要。所以问题是我显然需要不断更新游戏窗口,但该功能也会继续生成所有内容,正如您在下面的视频中看到的那样。我不知道如何使关卡只生成一次并使游戏记住生成的所有图像(它们的 x 和 y 位置)以及如何保持它们显示,直到我到达另一个关卡时再次调用该函数。有什么想法吗?

这是视频: https://vimeo.com/532903523

这是功能以及您需要了解的关于我的问题的所有信息。你可能更难理解,因为它不是英文,但翻译会很烦人,所以我至少翻译了这两个功能中最重要的东西。

vytvor_level = create_level
sirka_okna = ´width of the game window´
vyska_okna = ´height of the game window´
trava = grass
kytka = flower
aktulizace_okna = ´updating the game window´
okno = window
hrac.animace_hrace = player.player_animation
hrac.animace_dashe = player.dash_animation
def vytvor_level():
    for objekt in range(200):
        x = random.randint(0, sirka_okna)
        y = random.randint(0, vyska_okna)
        trava = random.choice(travy)
        okno.blit(trava, (x,y))
        x = random.randint(0, sirka_okna)
        y = random.randint(0, vyska_okna)
        kytka = random.choice(kytky)
        okno.blit(kytka, (x,y))
        
def aktulizace_okna():
    okno.blit(pozadi, (0,0))
    hrac.animace_hrace(okno)
    hrac.animace_dashe(okno)
    vytvor_level()
    py.display.update()

如果需要,这里是完整的代码。

import pygame as py
import random
py.init()

sirka_okna = 1000
vyska_okna = 600

okno = py.display.set_mode((sirka_okna, vyska_okna))

py.display.set_caption("Little Hero")

bezi_program = True

# Animace hráče
animaceVpravo = [py.image.load('WR1.png'), py.image.load('WR2.png'), py.image.load('WR3.png'), py.image.load('WR4.png'), py.image.load('WR5.png'), py.image.load('WR6.png')]
animaceVlevo = [py.image.load('WL1.png'), py.image.load('WL2.png'), py.image.load('WL3.png'), py.image.load('WL4.png'), py.image.load('WL5.png'), py.image.load('WL6.png')]
animaceNahoru = [py.image.load('WU1.png'), py.image.load('WU2.png'), py.image.load('WU3.png'), py.image.load('WU4.png'), py.image.load('WU5.png'), py.image.load('WU6.png')]
animaceDolu = [py.image.load('WD1.png'), py.image.load('WD2.png'), py.image.load('WD3.png'), py.image.load('WD4.png'), py.image.load('WD5.png'), py.image.load('WD6.png')]
animaceDash = [py.image.load('DASH1.png'), py.image.load('DASH2.png'), py.image.load('DASH3.png'), py.image.load('DASH4.png'), py.image.load('DASH5.png'), py.image.load('DASH6.png'), py.image.load('DASH7.png')]
animaceStoji = [py.image.load('IDLE1.png'), py.image.load('IDLE2.png'), py.image.load('IDLE3.png'), py.image.load('IDLE4.png'), py.image.load('IDLE5.png'), py.image.load('IDLE6.png')]

# Prostředí
travy = [py.image.load('GRASS1.png'), py.image.load('GRASS2.png'), py.image.load('GRASS3.png'), py.image.load('GRASS4.png'), py.image.load('GRASS5.png'), py.image.load('GRASS6.png')]
kytky = [py.image.load('FLOWERS1.png'), py.image.load('FLOWERS2.png'), py.image.load('FLOWERS3.png'), py.image.load('FLOWERS4.png')]
pozadi = py.image.load('Little_Hero_Pozadi.png')


#------------------------------------------------------

class Hrac:
    def __init__(self, x, y, sirka, vyska, rychlost, sila_dashe):
        self.x = y
        self.y = y
        self.sirka = sirka
        self.vyska = vyska
        self.rychlost = rychlost
        self.sila_dashe = sila_dashe
        self.jde_vpravo = False
        self.jde_vlevo = False
        self.jde_nahoru = False
        self.jde_dolu = False
        self.stoji = True
        self.dashuje = False
        self.pocet_kroku = 0
        self.snimek_dashe = 0 

    def animace_hrace(self, okno):
        if self.pocet_kroku + 1 >= 18:
            self.pocet_kroku = 0
        
        if not self.stoji:
            if self.jde_vlevo:  
                okno.blit(animaceVlevo[hrac.pocet_kroku//3], (round(hrac.x),round(hrac.y)))
                self.pocet_kroku += 1                          
            elif self.jde_vpravo:
                okno.blit(animaceVpravo[hrac.pocet_kroku//3], (round(hrac.x),round(hrac.y)))
                self.pocet_kroku += 1
            elif hrac.jde_nahoru:
                okno.blit(animaceNahoru[hrac.pocet_kroku//3], (round(hrac.x),round(hrac.y)))
                self.pocet_kroku += 1
            else:
                okno.blit(animaceDolu[hrac.pocet_kroku//3], (round(hrac.x),round(hrac.y)))
                self.pocet_kroku += 1
        else:
            okno.blit(animaceStoji[hrac.pocet_kroku//3], (round(hrac.x),round(hrac.y)))
            self.pocet_kroku += 1

    def animace_dashe(self, okno):
        x = self.x + self.sirka
        y = self.y + self.vyska * 0.25
        if self.snimek_dashe + 1 >= 7:
            self.snimek_dashe = 0
            
        if self.dashuje:
            self.snimek_dashe += 0.25
            okno.blit(animaceDash[int(self.snimek_dashe)], (round(x),round(y)))
 
    def pohyb_hrace(self):
        if (klavesa[py.K_a] or klavesa[py.K_LEFT]) and self.x > self.rychlost:
            self.jde_vlevo = True
            self.jde_vpravo = False
            self.jde_nahoru = False
            self.jde_dolu = False
            self.stoji = False
            self.x -= self.rychlost
            if (klavesa[py.K_e]) and self.x > self.sila_dashe:
                self.dashuje = True
                self.x -= self.sila_dashe
            if (klavesa[py.K_w] or klavesa[py.K_UP]) and self.y > self.rychlost:
                hrac.y -= self.rychlost
            if (klavesa[py.K_s] or klavesa[py.K_DOWN]) and self.y > self.rychlost:
                hrac.y += self.rychlost
        elif (klavesa[py.K_d] or klavesa[py.K_RIGHT]) and self.x < sirka_okna - self.sirka - self.rychlost:
            self.jde_vlevo = False
            self.jde_vpravo = True
            self.jde_nahoru = False
            self.jde_dolu = False
            self.stoji = False
            self.x += self.rychlost
            if (klavesa[py.K_e]) and self.x < sirka_okna - self.sila_dashe - self.sirka:
                self.dashuje = True
                self.x += self.sila_dashe
            if (klavesa[py.K_w] or klavesa[py.K_UP]) and self.y > self.rychlost:
                hrac.y -= self.rychlost
            if (klavesa[py.K_s] or klavesa[py.K_DOWN]) and self.y > self.rychlost:
                hrac.y += self.rychlost
        elif (klavesa[py.K_w] or klavesa[py.K_UP]) and self.y > self.rychlost:
            self.jde_vlevo = False
            self.jde_vpravo = False
            self.jde_nahoru = True
            self.jde_dolu = False
            self.stoji = False
            self.y -= hrac.rychlost
            if (klavesa[py.K_e]) and self.y > self.sila_dashe:
                self.dashuje = True
                self.y -= self.sila_dashe           
        elif (klavesa[py.K_s] or klavesa[py.K_DOWN]) and self.y < vyska_okna - self.vyska - self.rychlost:
            self.jde_vlevo = False
            self.jde_vpravo = False
            self.jde_nahoru = False
            self.jde_dolu = True
            self.stoji = False
            self.y += self.rychlost
            if (klavesa[py.K_e]) and self.y < vyska_okna - self.sila_dashe - self.sirka:
                self.dashuje = True
                self.y += self.sila_dashe
        else:
            self.stoji = True
            self.pocet_kroku = 0
            self.dashuje = False
            self.snimek_dashe = 0

  
def vytvor_level():
    for objekt in range(200):
        x = random.randint(0, sirka_okna)
        y = random.randint(0, vyska_okna)
        trava = random.choice(travy)
        okno.blit(trava, (x,y))
        x = random.randint(0, sirka_okna)
        y = random.randint(0, vyska_okna)
        kytka = random.choice(kytky)
        okno.blit(kytka, (x,y))
        
def aktulizace_okna():
    okno.blit(pozadi, (0,0))
    hrac.animace_hrace(okno)
    hrac.animace_dashe(okno)
    vytvor_level()
    py.display.update()
    
hrac = Hrac(10, 458, 40, 40, 3, 20)


tik = py.time.Clock()


while bezi_program:
    tik.tick(60)

    for event in py.event.get():
        if event.type == py.QUIT:
            bezi_program = False

    klavesa = py.key.get_pressed()

    hrac.pohyb_hrace()
        
    #if hrac.x < enemy.x + enemy.sirka and hrac.x + hrac.sirka > enemy.x and hrac.y < enemy.y + enemy.vyska and hrac.y + hrac.vyska > enemy.y:
        #print("Kolize detekována")

    aktulizace_okna()
            
py.quit()

1 个答案:

答案 0 :(得分:-1)

好的,我设法做到了。我使用 Pillow 将所有生成的图像粘贴到我的背景中,然后继续显示该背景。

相关问题