【发布时间】:2015-04-23 01:28:17
【问题描述】:
您好,我正在尝试随机生成 Pipes 类的副本,然后将它们显示到屏幕上。我设置了一个随机数生成器,它有 1/3 的机会得到 1。如果得到 1,我制作了另一个随机数生成器来选择 0 和 600(我的屏幕宽度)之间的一个数字作为 x 坐标的新精灵。然后我使用随机的 x 坐标和预定义的 y 坐标在屏幕上显示该精灵。
class Pipes(pygame.sprite.Sprite):
def __init__(self, x):
pygame.sprite.Sprite.__init__(self)
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert()
self.imx = 0
self.imgy = 375
self.setDisplay = pygame.display.get_surface()
def playerRect(self):
self.x = self.imgx
self.y = self.imgy
self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32))
def draw(self):
self.setDisplay.blit(self.img)
def update(self):
self.spawn = random.randint(0, 3)
if self.spawn == 1:
self.spawnx = random.randint(0, 600)
setDisplay.blit(self.img, [self.spawnx, 375])
allPipes.add(new_instance(self.spawnx))
然后我制作了一组名为 allPipes 的精灵,它们将保存 Pipe 的新实例并为 Pipe 创建一个构造函数。
allPipes = pygame.sprite.Group()
pipe = Pipes(0)
然后在我的游戏循环中,我调用了 Pipes 绘制函数,该函数随机生成新实例并绘制和更新 allPipes 组,但精灵的图像出现在屏幕上,但当新的出现时消失,这让我相信它实际上并不是每次都创建一个新的 Pipes 实例。有人可以帮忙吗?
def gameLoop():
imgx = 10
imgy = 10
lead_x_change = 0
lead_y_change = 0
move_variable = 100
jumpcounter = 0
while True:
for event in pygame.event.get():
#print (event)
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == timer_event:
trail
allPipes = pygame.sprite.RenderPlain(())
player.playerRect()
#setDisplay.blit(background.img, [0, 0])
setDisplay.blit(background.img2, [0, 0])
setDisplay.blit(player.img, [player.imgx, player.imgy])
#setDisplay.blit(background.img, [0, 0])
setDisplay.blit(ground.img, [ground.imgx, ground.imgy])
pipe.update()
allPipes.draw(setDisplay)
for sprite in allPipes:
sprite.update()
这是完整的代码:
import pygame
import sys
from pygame.locals import *
import random
#creates a clock to count framerate
clock = pygame.time.Clock()
#starts the program
pygame.init()
isFalling = True
allPipes = pygame.sprite.Group()
#creates a window of 800x600
setDisplay = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Menu')
#loads image for sprite
img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png')
allPipes = pygame.sprite.Group()
#player class
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert()
self.imgx = 0
self.imgy = 375
self.setDisplay = pygame.display.get_surface()
def playerRect(self):
self.x = self.imgx
self.y = self.imgy
self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32))
def draw(self):
self.setDisplay.blit(self.img)
def load(self, filename):
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert_alpha()
class Trail(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.x = player.imgx - 1
self.y = player.imgy - 1
self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 10, 10))
self.setDisplay = pygame.display.get_surface()
def trailrect(self):
self.x = player.imgx - 1
self.y = player.imgy - 1
self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 10, 10))
def draw(self):
self.setDisplay.blit(self.img)
trail.trailrect()
class Background(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert()
self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert()
self.treesx = 0
self.treesy = 70
self.treesrect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255),pygame.Rect(self.treesx, self.treesy, 376, 100))
def draw(self):
self.setDisplay.blit(self.img)
self.setDisplay.blit(self.img2)
def load(self, filename):
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert_alpha()
self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert_alpha()
class Ground(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\ground.png').convert()
self.imgx = 0
self.imgy = 400
self.setDisplay = pygame.display.get_surface()
self.x = self.imgx
self.y = self.imgy
self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 800, 200))
def draw(self):
self.setDisplay.blit(self.img)
def load(self, filename):
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert_alpha()
class Pipes(pygame.sprite.Sprite):
def __init__(self, x):
pygame.sprite.Sprite.__init__(self)
self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert()
self.imx = 0
self.imgy = 375
self.setDisplay = pygame.display.get_surface()
def playerRect(self):
self.x = self.imgx
self.y = self.imgy
self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32))
def draw(self):
self.setDisplay.blit(self.img)
def update(self):
self.spawn = random.randint(0, 3)
if self.spawn == 1:
self.spawnx = random.randint(0, 600)
setDisplay.blit(self.img, [self.spawnx, 375])
allPipes.add(new_instance(self.spawnx))
player = Player()
background = Background()
ground = Ground()
trail = Trail()
timer_event = pygame.USEREVENT + 1
pygame.time.set_timer(timer_event, 250)
trail.trailrect()
pipe = Pipes(0)
def gameLoop():
imgx = 10
imgy = 10
lead_x_change = 0
lead_y_change = 0
move_variable = 100
jumpcounter = 0
while True:
for event in pygame.event.get():
#print (event)
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == timer_event:
trail
allPipes = pygame.sprite.RenderPlain(())
player.playerRect()
#setDisplay.blit(background.img, [0, 0])
setDisplay.blit(background.img2, [0, 0])
setDisplay.blit(player.img, [player.imgx, player.imgy])
#setDisplay.blit(background.img, [0, 0])
setDisplay.blit(ground.img, [ground.imgx, ground.imgy])
pipe.update()
allPipes.draw(setDisplay)
for sprite in allPipes:
sprite.update()
#rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(player.x, player.y, 32, 32))
player.imgy += 30
isFalling = False
groundColliding = False
if isFalling == True:
player.imgy += 0
if player.rect.colliderect(ground.rect):
print("collided")
isFalling = False
groundColliding = True
player.imgy = 370
jumpcounter = 0
if player.rect.colliderect(background.treesrect):
print("c")
keys = pygame.key.get_pressed()
if keys[K_LEFT]:
player.imgx -= 20
if keys[K_RIGHT]:
player.imgx += 20
if keys[K_UP]:
if jumpcounter < 2:
player.imgy -= 50
isFalling = True
jumpcounter += 1
print(player.x, player.y)
print (isFalling, groundColliding)
pygame.display.flip()
#pygame.display.update()
clock.tick(70)
gameLoop()
#start (0, 71)
#length (376, 71)
#width (0, 168)
【问题讨论】:
-
请验证代码中的缩进是否正确,并删除代码中所有前导空格以使其更具可读性。如果这里的代码与您的代码完全一样,请查看:
for sprite in allPipes:之后的行不会在循环中执行,因为它没有缩进。 -
在管道的更新方法中添加
new_instance(self.spanx)但我认为您实际上并没有在任何地方定义 new_instance
标签: python class random pygame sprite