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搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
python连接mongodb操作数据示例(mongodb数据库配置类)
Dec 31 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
在Python的列表中利用remove()方法删除元素的教程
May 21 Python
Python查询IP地址归属完整代码
Jun 21 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
python+opencv实现动态物体识别
Jan 09 Python
Python实现FM算法解析
Jun 18 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
Python list去重且保持原顺序不变的方法
Apr 03 Python
Python 中数组和数字相乘时的注意事项说明
May 10 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
Content-type 的说明
2006/10/09 PHP
PHP4与PHP5的时间格式问题
2008/02/17 PHP
在PHP中使用redis
2013/11/04 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
Javascript模板技术
2007/04/27 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python中的choice()方法使用详解
2015/05/15 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
解决Python对齐文本字符串问题
2019/08/28 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
公司行政经理岗位职责
2013/12/24 职场文书
教师年度考核自我鉴定
2014/01/19 职场文书
社区七一党员活动方案
2014/01/25 职场文书
2014升学宴答谢词
2014/01/26 职场文书
工作自我评价怎么写
2014/01/29 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js