之前在学pygame 时看了一些博客(来自http://eyehere.net/2011/python-pygame-novice-professional-plant-zombie-1/),觉得写得挺不错的,这篇博客写了 如何在pygame里制作动态效果。其中,用了植物大战僵尸的向日葵作为例子。这里有一个点,就是,他是用sprite的,而我的呢,是不用sprite,之所以要这样做,就是要看一下行不行,以及效果怎么样,然后,就是要了解一下原理。
这里的素材来自http://www.easyicon.net/。我p了一张这样的图:
代码是用python2.7.6和相应版本的pygame 写的,直接上代码:
# -*- coding: cp936 -*- import os,sys,pygame from pygame.locals import * size=(600,580) #对话框大小 white=(255,255,255) #游戏主角是机器人android class Android(): def __init__(self,img,rect,speed): #full_img 是整张图,imgs 是full_img的surface #rect 是机器人的位置,speed则是移动速度 self.ful_img = img self.imgs = [self.ful_img.subsurface(Rect((i*64.5,0),(64.5,64))) for i in xrange(11)] self.rect = rect self.speed = speed self.num = 0 def update(self,screen,press_keys): #根据按下的方向键来移动机器人 if press_keys[K_LEFT]: self.rect.left -= self.speed if self.rect.left <= 55: self.rect.left = 55 if press_keys[K_RIGHT]: self.rect.left += self.speed if self.rect.right >= 545: self.rect.right = 545 if press_keys[K_UP]: self.rect.top -= self.speed if self.rect.top <= 2: self.rect.top = 2 if press_keys[K_DOWN]: self.rect.top += self.speed if self.rect.bottom >= 578: self.rect.bottom = 578 #num是surface的编号,根据编号来轮流显示surface self.num += 1 if self.num%11 == 0: self.num = 0 screen.blit(self.imgs[self.num],self.rect) return 0 def game(): #使窗口居中 os.environ['SDL_VIDEO_CENTERED'] = '1' speed_android = 50 dwTime = 6 r_android = Rect(250,200,64.5,64) pygame.init() clock = pygame.time.Clock() screen = pygame.display.set_mode(size, 0, 32) android=pygame.image.load('11_androids.png').convert_alpha() #定义一个Android Andr = Android(android,r_android,speed_android) pygame.display.set_caption("Test") while True: screen.fill(white) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() press_keys=pygame.key.get_pressed() Andr.update(screen,press_keys) pygame.display.update() clock.tick(dwTime) if __name__ == "__main__": game()运行,结果如图:
动态效果出来了,移动方向键,就可以看到机器人移动了。不过,这里是看不到动态效果的,代码在这里下载
http://download.csdn.net/detail/kamsau/6873565, 对了,这个链接里的代码有个bug ,要在前面添加
import sys不用sprite也是可以的,不过,可能在需要大量图片的情况下,sprite 会更好。
版权声明:本文为博主原创文章,未经博主允许不得转载。