【python游戏编程之旅】第一篇---初识pygame

本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

参考书籍:《python游戏编程入门》

一、pygame简介

Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发。允许你在 Python 程序中创建功能丰富的游戏和多媒体程序,Pygame 是一个高可移植性的模块可以支持多个操作系统。用它来开发小游戏非常适合。

可以去http://www.pygame.org/hifi.html 下载并安装使用pygame。

二、pygame使用

使用pygame的第一步是将pygame库导入到python程序中,以便来使用它

import pygame

然后需要引入pygame中的所有常量。

from pygame.locals import *

再经过初始化以后我们就可以尽情地使用pygame了。初始化pygame:

pygame.init()

通常来说我们需要先创建一个窗口,方便我们与程序的交互。下面创建了一个600 x 500的窗口

screen = pygame.display.set_mode((600,500))

1.打印字体

pygame支持使用pygame.font将文打印到窗口。要打印文本的话首先需要创建一个文字对象

myfont = pygame.font.Font(None,60)

这个文本绘制进程是一个重量级的进程,比较耗费时间,常用的做法是先在内存中创建文本图像,然后将文本当作一个图像来渲染。

white = 255,255,255
blue = 0,0,200
textImage = myfont.render("Hello Pygame", True, white)

textImage 对象可以使用screen.blit()来绘制。上面代码中的render函数第一个参数是文本,第二个参数是抗锯齿字体,第三个参数是一个颜色值(RGB值)。

要绘制本文,通常的过程是清屏,绘制,然后刷新。

screen.fill(blue)
screen.blit(textImage, (100,100))
pygame.display.update()

如果此时运行程序的话,会出现一个窗口一闪而过。为了让它长时间的显示,我们需要将它放在一个循环中。

 1 import pygame
 2 from pygame.locals import *
 3
 4 white = 255,255,255
 5 blue = 0,0,200
 6
 7 pygame.init()
 8 screen = pygame.display.set_mode((600,500))
 9
10 myfont = pygame.font.Font(None,60)
11 textImage = myfont.render("Hello Pygame", True, white)
12
13 while True:
14     for event in pygame.event.get():
15         if event.type in (QUIT, KEYDOWN):
16             sys.exit()
17
18     screen.fill(blue)
19     screen.blit(textImage, (100,100))
20     pygame.display.update()

pygame除了打印字体,还有绘制各种常见图形的常见功能。(使用pygame.draw())

2.绘制一个圆形。

使用pygame.draw.circle()方法,该方法需要传递圆的大小,颜色和位置参数。

1 color = 255,255,0
2 position = 300,250
3 radius = 100
4 width = 10
5 pygame.draw.circle(screen, color, position, radius, width)

3.绘制一个矩形。

为了增添一些乐趣,咱们这次绘制一个可以移动的矩形,而不只是单单的在屏幕中间绘制。

首先,需要设置pos_x, pos_y 两个变量来记录矩形的位置信息,然后在创建一对速度变量(vel_x,vel_y),在while循环内不断的更新矩形的位置。当矩形到达屏幕边缘的时候,将速度变量取反,这样就可以产生碰撞的效果了。

 1 import pygame
 2 from pygame.locals import *
 3 pygame.init()
 4 screen = pygame.display.set_mode((600,500))
 5 pygame.display.set_caption("Drawing Rectangles")
 6
 7 pos_x = 300
 8 pos_y = 250
 9 vel_x = 2
10 vel_y = 1
11
12 while True:
13     for event in pygame.event.get():
14         if event.type in (QUIT, KEYDOWN):
15             pygame.quit()
16             sys.exit()
17
18     screen.fill((0,0,200))
19
20     #移动矩形
21     pos_x += vel_x
22     pos_y += vel_y
23
24     #使矩形保持在窗口内
25     if pos_x > 500 or pos_x < 0:
26         vel_x = -vel_x
27     if pos_y > 400 or pos_y < 0:
28         vel_y = -vel_y
29
30     #绘制矩形
31     color = 255,255,0
32     width = 0 #solid fill
33     pos = pos_x, pos_y, 100, 100
34     pygame.draw.rect(screen, color, pos, width)
35
36     pygame.display.update()    

4.绘制线条

使用pygame.draw.line()方法,该方法,需要传递起始点和终点,还有线条的颜色和宽度

#绘制线条
color = 255,255,0
width = 8
pygame.draw.line(screen, color, (100,100), (500,400), width)

5.绘制弧形。

弧形是圆的一部分,可以使用pygame.draw.arc方法来绘制它,由于这个形状比较复杂,所以它比前几个函数需要跟更多的参数。

首先,需要一个矩形来表示弧形的边界。(需提供矩形左上角的位置,宽度和高度。)弧形就绘制在这个矩形当中。

然后需要提供弧形的起始角度和结束角度。平时在生活中我们一般都是用度为单位来衡量一个角度,但是在几何三角学中,通常使用的是弧度单位。

将角度转化为弧度需要的是math.radians()方法,它包含在math库中,因此使用之前一定不要忘了先引入math库.

 1 import math
 2 import pygame
 3 from pygame.locals import *
 4 pygame.init()
 5 screen = pygame.display.set_mode((600,500))
 6 pygame.display.set_caption("Drawing Arcs")
 7
 8 while True:
 9     for event in pygame.event.get():
10         if event.type in (QUIT, KEYDOWN):
11             pygame.quit()
12             sys.exit()
13
14     screen.fill((0,0,200))
15
16     #绘制弧形的代码
17     color = 255,0,255
18     position = 200,150,200,200
19     start_angle = math.radians(0)
20     end_angle = math.radians(180)
21     width = 8
22     pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
23
24     pygame.display.update()
25             

最后我们通过一个非常简单的小实例来巩固和复习一下上面所学到的知识。

三、画大饼游戏。

当玩家按下1、2、3、4相应的按键时,就会在程序中绘制相应的饼块,当整个饼块都被绘制完成的时候,颜色会变为亮绿色。

 1 import math
 2 import pygame
 3 from pygame.locals import *
 4 pygame.init()
 5 screen = pygame.display.set_mode((600,500))
 6 pygame.display.set_caption("The Pie Game - Press 1,2,3,4")
 7 myfont = pygame.font.Font(None, 60)
 8
 9 color = 200, 80, 60
10 width = 4
11 x = 300
12 y = 250
13 radius = 200
14 position = x-radius, y-radius, radius*2, radius*2
15
16 piece1 = False
17 piece2 = False
18 piece3 = False
19 piece4 = False
20
21 while True:
22     for event in pygame.event.get():
23         if event.type == QUIT:
24             exit()
25         elif event.type == KEYUP:
26             if event.key == pygame.K_ESCAPE:
27                 sys.exit()
28             elif event.key == pygame.K_1:
29                 piece1 = True
30             elif event.key == pygame.K_2:
31                 piece2 = True
32             elif event.key == pygame.K_3:
33                 piece3 = True
34             elif event.key == pygame.K_4:
35                 piece4 = True
36
37     #清屏
38     screen.fill((0,0,200))
39
40     #绘制4个数字
41     textImg1 = myfont.render("1", True, color)
42     screen.blit(textImg1, (x+radius/2-20, y-radius/2))
43     textImg2 = myfont.render("2", True, color)
44     screen.blit(textImg2, (x-radius/2, y-radius/2))
45     textImg3 = myfont.render("3", True, color)
46     screen.blit(textImg3, (x-radius/2, y+radius/2-20))
47     textImg4 = myfont.render("4", True, color)
48     screen.blit(textImg4, (x+radius/2-20, y+radius/2-20))
49
50
51     #判断是否绘制饼
52     if piece1:
53         start_angle = math.radians(0)
54         end_angle = math.radians(90)
55         pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
56         pygame.draw.line(screen, color, (x,y), (x,y-radius), width)
57         pygame.draw.line(screen, color, (x,y), (x+radius,y), width)
58     if piece2:
59         start_angle = math.radians(90)
60         end_angle = math.radians(180)
61         pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
62         pygame.draw.line(screen, color, (x,y), (x,y-radius), width)
63         pygame.draw.line(screen, color, (x,y), (x-radius,y), width)
64     if piece3:
65         start_angle = math.radians(180)
66         end_angle = math.radians(270)
67         pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
68         pygame.draw.line(screen, color, (x,y), (x-radius,y), width)
69         pygame.draw.line(screen, color, (x,y), (x,y+radius), width)
70     if piece4:
71         start_angle = math.radians(270)
72         end_angle = math.radians(360)
73         pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
74         pygame.draw.line(screen, color, (x,y), (x,y+radius), width)
75         pygame.draw.line(screen, color, (x,y), (x+radius,y), width)
76
77     #是否4个饼都被绘制完成
78     if piece1 and piece2 and piece3 and piece4:
79         color = 0,255,0
80
81     pygame.display.update()

现在我们已经了解了一些pygame的基本操作,下个博客我们将会一起学习pygame中的IO、数据相关知识。

时间: 2024-11-08 18:14:21

【python游戏编程之旅】第一篇---初识pygame的相关文章

【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接: 第一篇:初识pygame  http://www.cnblogs.com/msxh/p/4966899.html 第二篇:pygame中的IO.数据  http://www.cnblogs.com/msxh/p/4973003.html 第三篇:pygame事件与设备轮询  http://www

【python游戏编程之旅】第二篇--pygame中的IO、数据

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇中,我们介绍了pygame的入门操作http://www.cnblogs.com/msxh/p/4966899.html 这次我们将一起学习pygame中的IO.数据和更多关于字体打印的知识. 一.python输入输出 1.输出 python一次可以打印多个变量,只要用一个逗号将每个变量隔开就可以了.比如: A = 123 B = "ABC" C = 456 D = "DEF&

【python游戏编程之旅】第七篇---pygame中的冲突检测技术

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs.com/msxh/p/5013555.html 这次我们来一起学习pygame中的冲突检测技术. pygame支持非常多的冲突检测技术,我们来一一的看一下他们是如何使用的: 一.精灵与精灵之间的冲突检测 1.两个精灵之间的矩形检测 在只有两个精灵的时候我们可以使用pygame.sprite.col

【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵模块,冲突检测相关的知识. 一.Sprite模块.sprite对象 在pygame.sprite模块里面包含了一个名为Sprite类,他是pygame本身自带的一个精灵.但是这个类的功能比较少,因此我们新建一个类对其继承,在sprite类的基础上丰富,以方便我们的使用. 首先来了解一下如何使用spr

【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷跑类游戏综合运用以前学到的知识. 程序下载地址:http://yunpan.cn/cLIcJgTvq4tZS 访问密码 901f 源代码网盘地址:http://yunpan.cn/cLIc67S4nNRFY 访问密码 c139 github地址:https://github.com/XINCGer/

【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/p/5027688.html 这次我们来一起学习在pygame游戏里面常用的一些数据结构: 数据,列表,元组,队列,栈. 一.数组与列表 数组可以理解为简化的列表.像我们之前使用的pygame.sprite.Group这样的精灵组,也是一个列表.列表的元素是可变的,它具有添加.删除.搜索.排序等多种

mybatis之旅第一篇-初识mybatis

一.JDBC的问题 为什么我们要使用mybatis,是因为JDBC存在以下问题 1. 数据库连接创建.释放频繁造成系统资源浪费,从而影响系统性能.如果使用数据库连接池可解决此问题. 2. Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码. 3. 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护. 4. 对结果集解析存在硬编码(查询

spring之旅第一篇-初识spring

一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核心是控制反转(IOC)和面向切面编程(AOP).spring有如下特点: 轻量级:应用大小和应用开支,包括应用方式 DI/IoC:提供松耦合的一种实现技术 AOP:切面编程将业务逻辑从应用服务中分离 容器:包含并管理应用对象的生命周期和配置 框架:使用组件配置组合成复杂的应用,并提供很多基础功能 由于spring是一个容器型的框架,所以它

Python全栈开发【第一篇】:初识Python

Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与while循环练习题 基本数据类型前引 Python 的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jyhton Python的Java实现,Jython会将Pyth