我一直试图让我的迷宫游戏背景成为我在电脑上的照片,这样我就可以让游戏看起来更好看。你可以看到我的班级的背景,但我卡住了,我不知道该怎么办,任何人都可以帮助它会很棒。
import os
import pygame
import random
pygame.init()
#Colours im using in the game
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
FPS = 60
#The dimension of the game
display_width = 680
display_height = 440
#Class for the player
class Player(object):
def __init__(self):
self.rect = pygame.Rect(40, 40, 30, 30)
def move(self, dx, dy):
#Move each axis separately. Note that this checks for collisions both times.
if dx != 0:
self.move_single_axis(dx, 0)
if dy != 0:
self.move_single_axis(0, dy)
def move_single_axis(self, dx, dy):
#Move the player
self.rect.x += dx
self.rect.y += dy
#If you collide with a wall, move out based on velocity
for wall in walls:
if self.rect.colliderect(wall.rect):
if dx > 0: #Moving right, Hit the left side of the wall
self.rect.right = wall.rect.left
if dx < 0: #Moving left, Hit the right side of the wall
self.rect.left = wall.rect.right
if dy > 0: #Moving down, Hit the top side of the wall
self.rect.bottom = wall.rect.top
if dy < 0: #Moving up, Hit the bottom side of the wall
self.rect.top = wall.rect.bottom
#Class for background
class Background(pygame.sprite.Sprite):
def __init__(self, image_file, location):
pygame.sprite.Sprite._init_(self) #call sprite initializer
self.image = pygame.image.load(image_file)
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = location
#Class to hold a wall rect
class Wall(object):
def __init__(self, pos):
walls.append(self)
self.rect = pygame.Rect(pos[0], pos[1], 40, 40)
#Initialise pygame
os.environ["Time to play"] = "1"
#Title of game
pygame.display.set_caption("Wrath of the gods")
gameDisplay = pygame.display.set_mode((display_width,display_height))
clock = pygame.time.Clock()
walls = [] #List to hold the walls
background = None
player = None
end_rect = None
def reinit():
global player, end_rect
player = Player() #Create the player
#Holds the level layout in a list of strings.
level = [
"WWWWWWWWWWWWWWWWW",
"W W W W",
"W WW W WW WWW W",
"W W W W W W W W",
"W WWWWW WWW W W W",
"W W W W W W",
"WW W WW WWWWWWW W",
"W W W W",
"W WWWW W WWWWW WW",
"W W W W",
"WWWWWWWWWWWWWWWEW",
]
# W = wall, E = exit
x = y = 0
for row in level:
for col in row:
if col == "W":
Wall((x, y))
if col == "E":
end_rect = pygame.Rect(x, y, 40, 40)
x += 40
y += 40
x = 0
reinit()
bigfont = pygame.font.Font(None, 80)
smallfont = pygame.font.Font(None, 45)
def play_again():
SCREEN_WIDTH = display_width
SCREEN_HEIGHT = display_height
screen = gameDisplay
text = bigfont.render("YOU WIN Play again?", 13, (0, 0, 0))
textx = SCREEN_WIDTH / 2 - text.get_width() / 2
texty = SCREEN_HEIGHT / 2 - text.get_height() / 2
textx_size = text.get_width()
texty_size = text.get_height()
pygame.draw.rect(screen, (255, 255, 255), ((textx - 5, texty - 5),
(textx_size + 10, texty_size +
10)))
screen.blit(text, (SCREEN_WIDTH / 2 - text.get_width() / 2,
SCREEN_HEIGHT / 2 - text.get_height() / 2))
#Clock = pygame.time.Clock()
pygame.display.flip()
in_main_menu = True
while in_main_menu:
clock.tick(50)
for event in pygame.event.get():
if event.type == pygame.QUIT:
in_main_menu = False
return False
elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
x, y = event.pos
if x >= textx - 5 and x <= textx + textx_size + 5:
if y >= texty - 5 and y <= texty + texty_size + 5:
in_main_menu = False
return True
running = True
while running:
clock.tick(FPS)
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE:
running = False
#Move the player
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
player.move(-2, 0)
if key[pygame.K_RIGHT]:
player.move(2, 0)
if key[pygame.K_UP]:
player.move(0, -2)
if key[pygame.K_DOWN]:
player.move(0, 2)
if player.rect.colliderect(end_rect):
again = play_again()
if again:
reinit()
else:
break
#Draw the scene
gameDisplay.fill((black))
for wall in walls:
pygame.draw.rect(gameDisplay, red, wall.rect)
pygame.draw.rect(gameDisplay, black, end_rect)
pygame.draw.rect(gameDisplay, white, player.rect)
pygame.display.flip()
pygame.quit()
quit()
答案 0 :(得分:0)
首先,我不确定你为什么要将背景变成精灵或类,这似乎是一种不必要的实现。
可以使用pygame.image.load()加载背景并将其存储为表面并进行blitted,以便于显示。
一个简短的例子:
import pygame as py
py.init()
WINDOW_WIDTH = 640
WINDOW_HEIGHT = 360
screen = py.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))
background = py.image.load("image.png") ## Load the image file
background = py.transform.scale(background,(WINDOW_WIDTH,WINDOW_HEIGHT)) ## Make it the same size as the screen
clock = py.time.Clock()
done = False
while not done:
for event in py.event.get():
if event.type == py.QUIT:
done = True
screen.blit(background,(0,0)) ## Blit the background onto the screen first
## All other display stuff goes here
py.display.flip()
clock.tick(60)
py.quit()
如果您需要基于精灵和/或类的方法来显示背景,请询问,希望这会有所帮助。