问题描述
晚上好,亲爱的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,vyska_okna)
kytka = random.choice(kytky)
okno.blit(kytka,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.y)))
self.pocet_kroku += 1
elif hrac.jde_nahoru:
okno.blit(animaceNahoru[hrac.pocet_kroku//3],round(hrac.y)))
self.pocet_kroku += 1
else:
okno.blit(animaceDolu[hrac.pocet_kroku//3],round(hrac.y)))
self.pocet_kroku += 1
else:
okno.blit(animaceStoji[hrac.pocet_kroku//3],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,0))
hrac.animace_hrace(okno)
hrac.animace_dashe(okno)
vytvor_level()
py.display.update()
hrac = Hrac(10,458,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()
解决方法
好的,我设法做到了。我使用 Pillow 将所有生成的图像粘贴到我的背景中,然后继续显示该背景。