在pygame中使用精灵时遇到困难

问题描述:

我一直在尝试学习pygame,更具体地说,如何在pygame中使用精灵。然而,经过一些实验后,下面的代码就是我最终的结果,我想知道为什么我的播放器类没有显示出来。在pygame中使用精灵时遇到困难

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() 
+1

不知道这是答案还是错字,但实际上并没有创建一个类的实例(即p = player(300,300)),然后它会被添加到您的plr_g中。作为奖励小费,请查看PEP 0008;除了别的以外,类应该在CapWords中命名...所以你会得到类Player(然后可能有一个叫做player的实例) – Foon

首先,你没有正确使用sprite类。当你定义一个新的精灵时,你至少需要两件事:一个图像和一个矩形。图像是显示的内容,矩形定义了在屏幕上绘制时的放置位置。

对于图像,要使用一个简单的矩形,只需创建一个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) 

在你的游戏循环,你在呼唤平局在精灵组上两次,在填充屏幕之前和之后一次 - 你只需要这样做一次,第一次正在绘制。你也可以在你的组上调用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以了解如何设置帧率。