pygame学习笔记(2):画点的三种方法和动画实例


Posted in Python onApril 15, 2015

1、单个像素(画点)

利用pygame画点主要有三种方法:
方法一:画长宽为1个像素的正方形

import pygame,sys

pygame.init()

screen=pygame.display.set_caption('hello world!')

screen=pygame.display.set_mode([640,480])

screen.fill([255,255,255])

pygame.draw.rect(screen,[0,0,0],[150,50,1,1],1) #画1*1的矩形,线宽为1,这里不能是0,因为1*1无空白区域。

pygame.display.flip()

while True:

for event in pygame.event.get():

if event.type==pygame.QUIT:

sys.exit()

方法二:画个直径为1的圆

import pygame,sys

pygame.init()

screen=pygame.display.set_caption('hello world!')

screen=pygame.display.set_mode([640,480])

screen.fill([255,255,255])

pygame.draw.circle(screen,[0,0,0],[150,200],1,1)

pygame.display.flip()

while True:

for event in pygame.event.get():

if event.type==pygame.QUIT:

sys.exit()

方法三:这种方法并不是画上去的,而是改变了surface上某个点的颜色,这样看上去像是画了一个点screen.set_at()。另外,如果要得到某个像素的颜色,可以使用screen.get_at()。
import pygame,sys

pygame.init()

screen=pygame.display.set_caption('hello world!')

screen=pygame.display.set_mode([640,480])

screen.fill([255,255,255])

screen.set_at([150,150],[255,0,0])#将150,150改为红色。

pygame.display.flip()

while True:

for event in pygame.event.get():

if event.type==pygame.QUIT:

sys.exit()

2、连接多个点形成线

pygame.draw.lines()方法可以将多个点连接成为线。该方法有5个参数:surface表面、颜色、闭合线或者非闭合线(如果闭合为True,否则为False),点的列表,线宽。pygame.draw.lines(surface,[color],False/True,plotpoints,1)。下面的例子画出了一条马路,具体如下:

import pygame,sys

def lineleft(): #画马路左边界

plotpoints=[]

for x in range(0,640):

y=-5*x+1000

plotpoints.append([x,y])

pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

pygame.display.flip()

def lineright():#画马路右边界

plotpoints=[]

for x in range(0,640):

y=5*x-2000

plotpoints.append([x,y])

pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

pygame.display.flip() 

def linemiddle():#画马路中间虚线

plotpoints=[]

x=300

for y in range(0,480,20):

plotpoints.append([x,y])

if len(plotpoints)==2:

pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

plotpoints=[]

pygame.display.flip()
pygame.init()

screen=pygame.display.set_caption('hello world!')

screen=pygame.display.set_mode([640,480])

screen.fill([255,255,255])

lineleft()

lineright()

linemiddle()

while True:

for event in pygame.event.get():

if event.type==pygame.QUIT:

sys.exit()

3、引用图像
在pygame中引用图像最简单的以夷伐夷是image函数。下面在马路的实例中,加入一辆汽车。首先pygame.image.load()函数从硬盘加载一个图像,并创建一个名为my_car的对象。这里,my_car是一个surface,不过是存在内存中,并未显示出来,然后用blit(块移)方法将my_car复制到screen表面上,从而显示出来。具体代码如下:

import pygame,sys

def lineleft():

plotpoints=[]

for x in range(0,640):

y=-5*x+1000

plotpoints.append([x,y])

pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

pygame.display.flip()

def lineright():

plotpoints=[]

for x in range(0,640):

y=5*x-2000

plotpoints.append([x,y])

pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

pygame.display.flip() 

def linemiddle():

plotpoints=[]

x=300

for y in range(0,480,20):

plotpoints.append([x,y])

if len(plotpoints)==2:

pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

plotpoints=[]

pygame.display.flip() 

def loadcar(): #载入car图像

my_car=pygame.image.load('ok1.jpg') #当前文件夹下的ok1.jpg文件

screen.blit(my_car,[320,320])

pygame.display.flip()
pygame.init()

screen=pygame.display.set_caption('hello world!')

screen=pygame.display.set_mode([640,480])

screen.fill([255,255,255])

lineleft()

lineright()

linemiddle()

loadcar()

while True:

for event in pygame.event.get():

if event.type==pygame.QUIT:

sys.exit()

pygame学习笔记(2):画点的三种方法和动画实例

素材:ok1.jpg

pygame学习笔记(2):画点的三种方法和动画实例

4、动画

计算机动画实际上就是把图像从一个地方移动到另一个地方,同时几个连接动作交待显示就会产生逼真的效果。因此,在做动画中,最基本要考虑的因素主要是三个,一是时间,什么时间移动,多长时间变下一个动作,二是位置,从什么位置到什么位置,三是动作,前后两个动作的连续性。在这个例子中,因为车是俯视的,所以车轮转动实际是看不到的,所以不用考虑连续动作的变化,而是只考虑车的位置和多长时间移动即可。第一步pygame.time.delay()来实现时间延迟;第二步利用pygame.draw.rect()把原来位置的图像覆盖掉;第三步screen.blit()在新位置引入图像。下面的例子实现了汽车从驶入到驶出的过程。

import pygame,sys

def lineleft():

    plotpoints=[]

    for x in range(0,640):

        y=-5*x+1000

        plotpoints.append([x,y])

    pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

    pygame.display.flip()

def lineright():

    plotpoints=[]

    for x in range(0,640):

        y=5*x-2000

        plotpoints.append([x,y])

    pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

    pygame.display.flip()    

def linemiddle():

    plotpoints=[]

    x=300

    for y in range(0,480,20):

        plotpoints.append([x,y])

        if len(plotpoints)==2:

            pygame.draw.lines(screen,[0,0,0],False,plotpoints,5)

            plotpoints=[]

    pygame.display.flip() 

def loadcar(yloc):

    my_car=pygame.image.load('ok1.jpg')

    locationxy=[310,yloc]

    screen.blit(my_car,locationxy)

    pygame.display.flip()
    

if __name__=='__main__':

    pygame.init()

    screen=pygame.display.set_caption('hello world!')

    screen=pygame.display.set_mode([640,480])

    screen.fill([255,255,255])

    lineleft()

    lineright()

    linemiddle()
    while True:

        for event in pygame.event.get():

            if event.type==pygame.QUIT:

                sys.exit()

        for looper in range(480,-140,-50):

            pygame.time.delay(200)

            pygame.draw.rect(screen,[255,255,255],[310,(looper+132),83,132],0)

            loadcar(looper)
Python 相关文章推荐
python正则表达式中的括号匹配问题
Dec 14 Python
Python中优化NumPy包使用性能的教程
Apr 23 Python
python动态参数用法实例分析
May 25 Python
详解Python编程中time模块的使用
Nov 20 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
flask开启多线程的具体方法
Aug 02 Python
python实现梯度下降算法的实例详解
Aug 17 Python
七个非常实用的Python工具包总结
Jun 15 Python
python实现telnet客户端的方法
Apr 15 #Python
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 #Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 #Python
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 #Python
使用Python构建Hopfield网络的教程
Apr 14 #Python
使用C语言扩展Python程序的简单入门指引
Apr 14 #Python
在Python中封装GObject模块进行图形化程序编程的教程
Apr 14 #Python
You might like
MySQL授权问题总结
2007/05/06 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
简单的自定义php模板引擎
2016/08/26 PHP
php Session无效分析资料整理
2016/11/29 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
使用nodejs开发cli项目实例
2015/06/03 NodeJs
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
初步剖析C语言编程中的结构体
2016/01/16 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python获取当前路径实现代码
2017/05/08 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
双十佳事迹材料
2014/01/29 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
2015大学生求职信范文
2015/03/20 职场文书
施工安全员岗位职责
2015/04/11 职场文书
2019新员工心得体会
2019/06/25 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
python实现会员管理系统
2022/03/18 Python