之前在学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 会更好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

pygame简单动态图 & 动态图片的移动的更多相关文章

  1. javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图

    wjavaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG. ...

  2. GIMP也疯狂之动态图的制作(四)

    本篇文章为gimp制作动态图的第四篇.在之前的基础上简单的拓展了下思路.就能做出蛮实用的动态图.本文将介绍两个动态图.第一个为在一张静态图上添加动态图,第二个图为修改部分渐变. 效果: 素材: 其实, ...

  3. iOS 播放gif动态图的方式探讨

    原文链接:http://my.oschina.net/u/2340880/blog/608560 摘要iOS中没有现成的接口来展示gif动态图,但可以通过其他的方式来处理gif图的展示.iOS中播放g ...

  4. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

  5. PS软件怎么把视频转成gif动态图?

    PS软件怎么把视频转成gif动态图?Adobe PhotoShop软件的最新版本是可以编辑视频的,并且可以将视频转换为GIF动态图,使用也很简单,下面分享ps制作gif动态图的教程,需要的朋友可以参考 ...

  6. 如何录制视频生成GIF动态图?

    前言 在分享文章时有些知识不好讲清,就打算用gif图来展示,可是在网上找了几个录视频的工具都要会员才可以生成gif动态图,很是郁闷,不过苦苦寻找后,发现LICEcap很好用,可以很方便的生成gif动态 ...

  7. Latex中也能展示动态图?

    技术背景 在学术领域,很多文档是用Latex做的,甚至有很多人用Latex Beamer来做PPT演示文稿.虽然在易用性和美观等角度来说,Latex Beamer很大程度上不如PowerPoint,但 ...

  8. HighChartS cpu利用率动态图(Java版)

    来源:http://www.cnblogs.com/haifg/p/3217699.html   最近项目需要监控服务器cpu的利用率,并做成动态图.在网上查找了一些资料,最终选择了HighChart ...

  9. ie6,7下js动态加载图片不显示错误

    ie6,7下js动态加载图片不显示错误 先描述一下出现这种匪夷所思bug的背景: 我在页面加载的时候加载一堆小缩略图,<a href="javascript:void(0);" ...

随机推荐

  1. Servlet和JAVA BEAN 分析探讨

    在JSP中调用JAVA类和使用JavaBean有什么区别? 可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类.特殊在可以通过<jsp:useBean   />调用Jav ...

  2. Web Api 接口文档制作

    参考地址: http://blogs.msdn.com/b/yaohuang1/archive/2012/05/21/asp-net-web-api-generating-a-web-api-help ...

  3. POJ 2446 Chessboard (二分图匹配)

    题意 在一个N*M的矩形里,用1*2的骨牌去覆盖该矩形,每个骨牌只能覆盖相邻的两个格子,问是否能把每个格子都盖住.PS:有K个孔不用覆盖. 思路 容易发现,棋盘上坐标和为奇数的点只会和坐标和为偶数的点 ...

  4. linux shell ls -1 列显示文件

    /******************************************************************************* * linux shell ls -1 ...

  5. datatables 参数详解(转)

    //@translator codepiano //@blog codepiano //@email codepiano.li@gmail.com //尝试着翻译了一下,难免有错误的地方,欢迎发邮件告 ...

  6. 一天一个Java基础——对象和类

    1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...

  7. linux编程获取本机网络相关参数

    getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程   ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...

  8. C# 替换文本文件中的某一行

    C# 替换文本文件中的某一行 (要求此文件存在) /// <summary> /// LineIndex 表示新的内容所在的行位置 /// </summary> /// < ...

  9. HDU5780 gcd (BestCoder Round #85 E) 欧拉函数预处理——分块优化

    分析(官方题解): 一点感想: 首先上面那个等式成立,然后就是求枚举gcd算贡献就好了,枚举gcd当时赛场上写了一发O(nlogn)的反演,写完过了样例,想交发现结束了 吐槽自己手速慢,但是发了题解后 ...

  10. OpenGL超级宝典第5版&&GLSL法线变换

    在GLSL中,有一些情况需要把局部坐标系下的向量或点转换到视点坐标系下,如光照计算时,需要把法向转化到视点坐标系.如果是模型上一点p 转化到视点坐标系下,直接(model-view matrix )* ...