我一直在尝试学习pygame,更具体地说是如何在pygame中使用sprite。然而经过一些实验后,下面的代码就是我最终得到的结果,我想知道为什么我的播放器类没有显示出来。
from pygame.locals import *
import pygame
pygame.init()
size = width, height = 500, 700
screen = pygame.display.set_mode(size)
plr_g = pygame.sprite.Group()
blue = (0,206,209)
class player(pygame.sprite.Sprite):
def __init__(self, s_x, s_y):
pygame.sprite.Sprite.__init__(self, plr_g)
self.s_x = 300
self.s_y = 300
self.image.fill(blue)
#self.plr_img = pygame.image.load("Xpic.png")
plr_g.add(self)
self.image = pygame.screen([s_x, s_y])
self.rect = self.image.get_rect()
plr_g.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
plr_g.draw(screen)
screen.fill((50, 50, 50))
#player.draw(screen)
plr_g.draw(screen)
pygame.display.flip()
答案 0 :(得分:0)
首先,你没有正确使用精灵类。定义新的精灵时,至少需要两件事:图像和矩形。图像将显示,而rect定义在屏幕上绘制时将放置的位置。
对于图像,要使用简单的矩形,只需创建一个pygame Surface并填充它。然后只需使用内置的get_rect()命令来定义矩形:
self.image = pygame.Surface([s_x, s_y])
self.image.fill(blue)
self.rect = self.image.get_rect()
然后,您实际上需要创建对象的实例。 Python标准是用大写字母命名类,以区别于变量:
class Player(pygame.sprite.Sprite):
然后你像这样创建一个玩家精灵的实例:
player = Player(50, 50)
在你的游戏循环中,你在sprite组上调用draw两次,一次在填充屏幕之前,一次之后 - 你只需要这样做一次,第一个就是被抽出来了。您也可以在您的组上调用update(),但在您的精灵上定义更新方法之前,它不会做任何事情。
以下是一些评论/清理过的代码:
from pygame.locals import *
import pygame
pygame.init()
# use caps to indicate constants (Python convention)
SIZE = WIDTH, HEIGHT = 500, 700
screen = pygame.display.set_mode(SIZE)
# consider naming your group something more friendly
plr_g = pygame.sprite.Group()
BLUE = (0, 206, 209)
class Player(pygame.sprite.Sprite):
# assuming s_x and s_y are supposed to be size. What about using width/height?
def __init__(self, width, height):
pygame.sprite.Sprite.__init__(self, plr_g)
# what are these for?
# self.s_x = 300
# self.s_y = 300
self.image = pygame.Surface([width, height])
self.image.fill(BLUE)
self.rect = self.image.get_rect()
# this isn't necessary, since you're adding to the group in the __super__ call
# plr_g.add(self)
# set your location via the rect:
self.rect.center = (WIDTH / 2, HEIGHT / 2)
player = Player(50, 50)
while True:
for event in pygame.event.get():
# don't put multiple statements on a single line
if event.type == pygame.QUIT:
sys.exit()
# update sprites in group
plr_g.update()
# fill screen, then draw
screen.fill((50, 50, 50))
plr_g.draw(screen)
pygame.display.flip()
现在,尝试在精灵中定义一个更新方法,通过更改rect坐标使其移动,例如
self.rect.x += 1
您还应该查看http://www.pygame.org/docs/ref/time.html#pygame.time.Clock以了解如何设置帧速率。