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

一、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()

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

 import pygame
from pygame.locals import * white = 255,255,255
blue = 0,0,200 pygame.init()
screen = pygame.display.set_mode((600,500)) myfont = pygame.font.Font(None,60)
textImage = myfont.render("Hello Pygame", True, white) while True:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit() screen.fill(blue)
screen.blit(textImage, (100,100))
pygame.display.update()

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

2.绘制一个圆形。

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

 color = 255,255,0
position = 300,250
radius = 100
width = 10
pygame.draw.circle(screen, color, position, radius, width)

3.绘制一个矩形。

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

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

 import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("Drawing Rectangles") pos_x = 300
pos_y = 250
vel_x = 2
vel_y = 1 while True:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
pygame.quit()
sys.exit() screen.fill((0,0,200)) #移动矩形
pos_x += vel_x
pos_y += vel_y #使矩形保持在窗口内
if pos_x > 500 or pos_x < 0:
vel_x = -vel_x
if pos_y > 400 or pos_y < 0:
vel_y = -vel_y #绘制矩形
color = 255,255,0
width = 0 #solid fill
pos = pos_x, pos_y, 100, 100
pygame.draw.rect(screen, color, pos, width) 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库.

 import math
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("Drawing Arcs") while True:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
pygame.quit()
sys.exit() screen.fill((0,0,200)) #绘制弧形的代码
color = 255,0,255
position = 200,150,200,200
start_angle = math.radians(0)
end_angle = math.radians(180)
width = 8
pygame.draw.arc(screen, color, position, start_angle, end_angle, width) pygame.display.update()

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

三、画大饼游戏。

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

 import math
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("The Pie Game - Press 1,2,3,4")
myfont = pygame.font.Font(None, 60) color = 200, 80, 60
width = 4
x = 300
y = 250
radius = 200
position = x-radius, y-radius, radius*2, radius*2 piece1 = False
piece2 = False
piece3 = False
piece4 = False while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
elif event.type == KEYUP:
if event.key == pygame.K_ESCAPE:
sys.exit()
elif event.key == pygame.K_1:
piece1 = True
elif event.key == pygame.K_2:
piece2 = True
elif event.key == pygame.K_3:
piece3 = True
elif event.key == pygame.K_4:
piece4 = True #清屏
screen.fill((0,0,200)) #绘制4个数字
textImg1 = myfont.render("", True, color)
screen.blit(textImg1, (x+radius/2-20, y-radius/2))
textImg2 = myfont.render("", True, color)
screen.blit(textImg2, (x-radius/2, y-radius/2))
textImg3 = myfont.render("", True, color)
screen.blit(textImg3, (x-radius/2, y+radius/2-20))
textImg4 = myfont.render("", True, color)
screen.blit(textImg4, (x+radius/2-20, y+radius/2-20)) #判断是否绘制饼
if piece1:
start_angle = math.radians(0)
end_angle = math.radians(90)
pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
pygame.draw.line(screen, color, (x,y), (x,y-radius), width)
pygame.draw.line(screen, color, (x,y), (x+radius,y), width)
if piece2:
start_angle = math.radians(90)
end_angle = math.radians(180)
pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
pygame.draw.line(screen, color, (x,y), (x,y-radius), width)
pygame.draw.line(screen, color, (x,y), (x-radius,y), width)
if piece3:
start_angle = math.radians(180)
end_angle = math.radians(270)
pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
pygame.draw.line(screen, color, (x,y), (x-radius,y), width)
pygame.draw.line(screen, color, (x,y), (x,y+radius), width)
if piece4:
start_angle = math.radians(270)
end_angle = math.radians(360)
pygame.draw.arc(screen, color, position, start_angle, end_angle, width)
pygame.draw.line(screen, color, (x,y), (x,y+radius), width)
pygame.draw.line(screen, color, (x,y), (x+radius,y), width) #是否4个饼都被绘制完成
if piece1 and piece2 and piece3 and piece4:
color = 0,255,0 pygame.display.update()

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

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

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

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...

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

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...

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

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...

  4. 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...

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

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇中,我们介绍了pygame的入门操作http://www.cnblogs.com/msxh/p/49 ...

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

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷 ...

  7. 【python游戏编程之旅】第三篇---pygame事件与设备轮询

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame中的IO.数据http://www.cnblogs.com/msxh/ ...

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

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/ ...

  9. Mybatis之旅第一篇-初识Mybatis

    一.JDBC的问题 为什么我们要使用Mybatis,是因为JDBC存在以下问题 1. 数据库连接创建.释放频繁造成系统资源浪费,从而影响系统性能.如果使用数据库连接池可解决此问题. 2. Sql语句在 ...

随机推荐

  1. Linux瑞士军刀:密码管理Keeweb

    导读 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.我将在本文中介绍 Keeweb,它是一款 ...

  2. notepad正则表达式

    文件名称匹配 文件名称: boost_chrono-vc100-mt-1_49.dll 对应的notepad正则表达式: \w*_\w*-\w*-\w*-\w*-\w*.dll 移除空行 查找目标: ...

  3. 《第一行代码》(三: Android 百度地图 SDK v3.0.0)

    百度地图的SDK变化较大,第一行代码里的demo已经不能用了,一直以为是代码类错误,害我花了很多时间,可以参考这位博主的:http://blog.csdn.net/lmj623565791/artic ...

  4. 秀尔算法:破解RSA加密的“不灭神话”

    RSA加密 VS 秀尔算法 作为RSA加密技术的终结者——“太多运算,无法读取”的秀尔算法(Shor’s algorithm)不是通过暴力破解的方式找到最终密码的,而是利用量子计算的并行性,可以快速分 ...

  5. 8个开发必备的PHP功能

    做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握. 1.传 ...

  6. 【USACO】第一章总结

    做了大半个月,终于把第一章做完了 有的题遇到了不小的坎儿,看着网上一群高中生都做得那么好,心理还是有些小郁闷的.不禁感慨我过去的四年真是虚度啊.总结一下第一章学习到的知识吧. ①闰年判断 int is ...

  7. HDU2044 小蜜蜂斐波那契

    一只小蜜蜂... Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. dt.jar设计时rt.jar运行时

    很多人在初学Java的时候,都要配置环境变量.在配置CLASSPATH的时候,都会加上一个当前目录.,还有两个jar:dt.jar和tools.jar.其实好多人都不了解这两个jar的作用,尤其是dt ...

  9. 正则和xml解析

    一般来说是xml解析的开销比正则大些.使用正则搜索,只需搜索<second>就能定位到你要的内容,而xml解析要把节点树在内存中建立起来,所以消耗内存会多些,速度可能会受到一些影响.但对于 ...

  10. 【读书笔记】读《JavaScript设计模式》之门面模式

    一.前言 门面模式,也称Facade(外观)模式.核心的两点作用—— 1> 简化类的接口(让接口变得更加容易理解.容易应用.更加符合对应业务),来掩盖一个非常不同或者复杂的实现 2> 消除 ...