#python-3.x #pygame
#python-3.x #pygame
Вопрос:
У меня есть игра на Python. Когда вы нажимаете 1, а затем щелкаете куда-нибудь, вы можете разместить солдата. Я занимаюсь этим некоторое время и не могу понять, как заставить солдата остаться. У меня есть список солдат, который заполняется каждый раз, когда вы размещаете солдата. Когда вы достигнете максимального количества, вы больше не сможете размещать. Я знаю, что вызываю pygame.display.set_mode() в каждом цикле, и это сделано намеренно. Я знаю, что происходит, так это то, что солдат прорисовывается поверх. Как я узнаю, каких солдат следует уничтожать, а каких — нет?
import pygame, random, sys
from pygame.locals import *
class Menu():
def Main(self):
pygame.init()
MenuChoice = 1
noMoreRand = 0
RocketY = 750
ExpNum = 0
Soldier1Coords = pygame.mouse.get_pos()
while 1:
screen = pygame.display.set_mode((1366, 768))
pygame.display.set_caption("Throne Paranoia")
Title = pygame.image.load("TitleScreen.png").convert_alpha()
screen.blit(Title, (0, 0))
font = pygame.font.Font(None, 64)
img1 = font.render("Throne Paranoia", 1, (0, 50, 255))
screen.blit(img1, (5, 5))
img2 = font.render("Classic", 1, (255, 50, 0))
screen.blit(img2, (200, 65))
img3 = font.render("Hardcore", 1, (255, 50, 0))
screen.blit(img3, (200, 115))
img4 = font.render("Survival", 1, (255, 50, 0))
screen.blit(img4, (200, 165))
img5 = font.render("Quit", 1, (255, 50, 0))
screen.blit(img5, (200, 715))
pointer = pygame.image.load("pointer.png").convert_alpha()
if noMoreRand == 1:
if RocketY > 50:
RocketY = RocketY - 5
screen.blit(rocket, (1000, RocketY))
if RocketY <= 55:
Exp1 = pygame.image.load("EXP1.png")
Exp2 = pygame.image.load("EXP2.png")
screen.blit(Exp1, (700, 50))
pygame.display.flip()
pygame.time.wait(200)
screen = pygame.display.set_mode((1366, 768))
pygame.display.set_caption("Throne Paranoia")
Title = pygame.image.load("TitleScreen.png").convert_alpha()
screen.blit(Title, (0, 0))
font = pygame.font.Font(None, 64)
img1 = font.render("Throne Paranoia", 1, (0, 50, 255))
screen.blit(img1, (5, 5))
img2 = font.render("Classic", 1, (255, 50, 0))
screen.blit(img2, (200, 65))
img3 = font.render("Hardcore", 1, (255, 50, 0))
screen.blit(img3, (200, 115))
img4 = font.render("Survival", 1, (255, 50, 0))
screen.blit(img4, (200, 165))
img5 = font.render("Quit", 1, (255, 50, 0))
screen.blit(img5, (200, 715))
pointer = pygame.image.load("pointer.png").convert_alpha()
screen.blit(Exp2, (700, 50))
pygame.display.flip()
pygame.time.wait(200)
RocketY = 750
noMoreRand = 0
if MenuChoice == 5:
MenuChoice = 1
elif MenuChoice == 0:
MenuChoice = 4
elif MenuChoice == 1:
screen.blit(pointer, (20, 50))
elif MenuChoice == 2:
screen.blit(pointer, (20, 100))
elif MenuChoice == 4:
screen.blit(pointer, (20, 700))
elif MenuChoice == 3:
screen.blit(pointer, (20, 150))
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == K_UP:
MenuChoice = MenuChoice - 1
elif event.key == K_DOWN:
MenuChoice = MenuChoice 1
elif event.key == K_RETURN:
if MenuChoice == 4:
pygame.quit()
sys.exit()
elif MenuChoice == 1:
Game().Classic()
elif MenuChoice == 2:
Game().Hardcore()
elif MenuChoice == 3:
Game().Survival()
if noMoreRand == 0:
MissileRand = random.randint(0, 30)
if noMoreRand == 0 and MissileRand == 17:
print("Rocket Fired!")
noMoreRand = 1
rocket = pygame.image.load("Rocket.png")
rocket = pygame.transform.scale(rocket, (50, 150))
pygame.display.update()
class Game():
def Classic(self):
screen = pygame.display.set_mode((1366, 768))
base_type = "basic"
soldiers = 2
cash = 500
font = pygame.font.Font(None, 32)
slot1 = font.render("1", 1, (255, 255, 255))
slot2 = font.render("2", 1, (255, 255, 255))
slot3 = font.render("3", 1, (255, 255, 255))
slot4 = font.render("4", 1, (255, 255, 255))
stuff1 = pygame.image.load("Soldier.png")
stuff1 = pygame.transform.scale(stuff1, (68, 68))
stuff2 = pygame.image.load("Turret.png")
stuff2 = pygame.transform.scale(stuff2, (68, 68,))
slot1obj = "Spawn Soldier"
slot2obj = "Place Turret"
slot3obj = "Upgrade Menu"
slot4obj = "Sell"
Soldier = pygame.image.load("Soldier.png")
Turret = pygame.image.load("Turret.png")
SoldierCoords = []
I=0
while I<10:
SoldierCoords.append(I)
I=I 1
I=0
while 1:
screen = pygame.display.set_mode((1366, 768))
background = pygame.image.load("Grass.png")
screen.blit(background, (0, 0))
screen.blit(slot1, (30, 680))
screen.blit(slot2, (98, 680))
screen.blit(slot3, (166, 680))
screen.blit(stuff1, (0, 700))
screen.blit(stuff2, (69, 700))
if base_type == "basic":
base = pygame.image.load("BasicBase.png")
elif base_type == "military":
base = pygame.image.load("MilitaryBase.png")
elif base_type == "castle":
base = pygame.image.load("Castle.png")
screen.blit(base, (498, 671))
pygame.draw.line(screen, (255, 255, 255), (0, 700), (498, 700), 1)
pygame.draw.line(screen, (255, 255, 255), (68, 700), (68, 769), 1)
pygame.draw.line(screen, (255, 255, 255), (868, 700), (1367, 700), 1)
pygame.draw.line(screen, (255, 255, 255), (136, 700), (136, 769), 1)
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_1:
currentSelection = font.render(slot1obj, 1, (255, 255, 255))
screen.blit(currentSelection, (683, 500))
pygame.display.flip()
pygame.time.wait(200)
Selection = 1
elif event.key == K_2:
currentSelection = font.render(slot2obj, 1, (255, 255, 255))
screen.blit(currentSelection, (683, 500))
pygame.display.flip()
pygame.time.wait(200)
Selection = 2
elif event.key == K_ESCAPE:
Pause().Pause()
pressed = pygame.mouse.get_pressed()
elif event.type == pygame.MOUSEBUTTONDOWN:
if I>9:
tell1 = font.render("You can't spawn any more soldiers.", 1, (255, 255, 255))
screen.blit(tell1, (600, 864))
pygame.display.flip()
print("No more soldiers are allowed.")
pygame.time.wait(1000)
break
SoldierCoords[I] = pygame.mouse.get_pos()
soldiers = soldiers - 1
screen.blit(Soldier, SoldierCoords[I])
pygame.display.flip()
print(I)
print("Spawning soldier!")
I=I 1
elif event.type == pygame.QUIT:
Pause().Pause()
pygame.display.flip()
class Pause():
def Pause(self):
while 1:
screen = pygame.display.set_mode((640, 480))
font = pygame.font.Font(None, 64)
Msg1 = font.render("Paused.", 1, (255, 255, 255))
Msg2 = font.render("Press ESC to continue or", 1, (255, 255, 255))
Msg3 = font.render("the space bar to exit to", 1, (255, 255, 255))
Msg4 = font.render("the main menu.", 1, (255, 255, 255))
screen.blit(Msg1, (20, 20))
screen.blit(Msg2, (20, 100))
screen.blit(Msg3, (20, 180))
screen.blit(Msg4, (20, 260))
pygame.display.update()
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
return 0
if event.key == K_SPACE:
Menu().Main()
elif event.type == pygame.QUIT:
return 0
Menu().Main()
Ответ №1:
Вы должны удалить всех солдат из SoldierCoords
в каждом цикле, прежде чем pygame.display.flip()
КСТАТИ:
Используйте
screen = pygame.display.set_mode((1366, 768))
pygame.display.set_caption("Throne Paranoia")
Title = pygame.image.load("TitleScreen.png").convert_alpha()
перед while True
( while 1
)
Вам не нужно создавать экран в каждом цикле и загружать изображение заголовка.
В конечном итоге вы можете заливать экран черным цветом в каждом цикле.
Есть еще хуже — в каждом цикле вы снова загружаете все изображения и снова отображаете весь текст.
Сделайте это только один раз — перед while 1
Если бы у вас был __init__
класс, вы могли бы загружать изображения и отображать текст в __init__
, но тогда вам пришлось бы использовать экземпляр класса, как вы должны были сделать в начале.
И используйте pygame.display.flip()
только один раз в цикле — в конце.
КСТАТИ: В Python есть правило — использовать нижний регистр и ‘_’ в имени переменной,
например SoldierCoords
=> soldier_coords