Pygame学习笔记10:鼠标

鼠标

当显示模式设置后,事件队列就会开始收到鼠标事件。当按下和释放鼠标的按键时,会产生 pygame.MOUSEBUTTONDOWN和pygame.MOUSEBUTTONUP事件。这些事件包含一个button属性表示哪些键被按下。滚动鼠标滚轮会产生pygame.MOUSEBUTTONDOWN事件。当向上滚动滚轮时button的值是4,向下滚动时button的值是5。除此外还有一个pos属性,表示按键按下或释放时鼠标指针的位置。当移动鼠标时,会产生pygame.MOUSEMOTION事件。鼠标移动事件会被分解成一组较小的精确的移动事件。当鼠标移动时,会有很多事件被放在队列中。鼠标移动事件没有被正确的清除,常常是事件队列被填满的主要原因。鼠标移动事件包括一个buttons属性,表示鼠标移动时,鼠标键的状态。还有一个pos属性,表示鼠标指针的位置。还有一个rel属性表示当前位置相对于上一次事件发生时指针位置的偏移量。

除了可以通过事件来接受鼠标输入外,还可以直接调用函数检查鼠标的状态。pygame.mouse.get_pressed可以获得当前所有鼠标按键的状态。pygame.mouse.get_pos获得当前鼠标的位置。pygame.mouse.get_rel获得当前鼠标位置相对于前一个位置的位移。

用pygame.mouse.set_visible可以隐藏鼠标的指针。如果鼠标指针被隐藏,输入被当前的display捕获,鼠标会进入虚拟输入模式,这种模式下鼠标的相对位移不会收到屏幕边界的影响。

通过pygame.mouse.set_cursor可以设置鼠标指针的形状。

pygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None

当鼠标指针可见时,它会显示为给定的位域数组指定的黑白色的位图。size是包含指针高度和宽度的列表。hotspot是表示指针的热点位置的列表。xormasks是序列包含指针异或数据位域的序列,andmask是一组包含指针位域数据的序列。宽度必须是8的倍数,位域数组必须是size给定的正确的大小。

pygame.cursors模块包括了几个内置的指针形状。可以这样使用

pygame.mouse.set_cursor(*pygame.cursors.arrow)

可以使用的指针形状有:

pygame.cursors.arrow
pygame.cursors.diamond
pygame.cursors.broken_x
pygame.cursors.tri_left
pygame.cursors.tri_right

偶自己写的一个扫雷小游戏,全鼠标操作的。下载地址:http://app.xefan.com/小游戏/扫雷/

Pygame学习笔记9:键盘

键盘

当键盘的按键被按下时,事件队列会得到pygame.KEYDOWN和pygame.KEYUP事件。这两个事件都有一个叫做key的整型属性表示键盘上的键。pygame.KEYDOWN事件还有一个额外的属性unicode,表示键盘输入的转后对应的字符。这个字符会考虑shift键和其它组合键的状态。

有很多键盘相关的常量,他们表示键盘上的键。下面是所有键盘常量的列表:

KeyASCII      ASCII   Common Name
K_BACKSPACE   \b      backspace
K_TAB         \t      tab
K_CLEAR               clear
K_RETURN      \r      return
K_PAUSE               pause
K_ESCAPE      ^[      escape
K_SPACE               space
K_EXCLAIM     !       exclaim
K_QUOTEDBL    "       quotedbl
K_HASH        #       hash
K_DOLLAR      $       dollar
K_AMPERSAND   &       ampersand
K_QUOTE               quote
K_LEFTPAREN   (       left parenthesis
K_RIGHTPAREN  )       right parenthesis
K_ASTERISK    *       asterisk
K_PLUS        +       plus sign
K_COMMA       ,       comma
K_MINUS       -       minus sign
K_PERIOD      .       period
K_SLASH       /       forward slash
K_0           0       0
K_1           1       1
K_2           2       2
K_3           3       3
K_4           4       4
K_5           5       5
K_6           6       6
K_7           7       7
K_8           8       8
K_9           9       9
K_COLON       :       colon
K_SEMICOLON   ;       semicolon
K_LESS        <       less-than sign
K_EQUALS      =       equals sign
K_GREATER     >       greater-than sign
K_QUESTION    ?       question mark
K_AT          @       at
K_LEFTBRACKET [       left bracket
K_BACKSLASH   \       backslash
K_RIGHTBRACKET ]      right bracket
K_CARET       ^       caret
K_UNDERSCORE  _       underscore
K_BACKQUOTE   `       grave
K_a           a       a
K_b           b       b
K_c           c       c
K_d           d       d
K_e           e       e
K_f           f       f
K_g           g       g
K_h           h       h
K_i           i       i
K_j           j       j
K_k           k       k
K_l           l       l
K_m           m       m
K_n           n       n
K_o           o       o
K_p           p       p
K_q           q       q
K_r           r       r
K_s           s       s
K_t           t       t
K_u           u       u
K_v           v       v
K_w           w       w
K_x           x       x
K_y           y       y
K_z           z       z
K_DELETE              delete
K_KP0                 keypad 0
K_KP1                 keypad 1
K_KP2                 keypad 2
K_KP3                 keypad 3
K_KP4                 keypad 4
K_KP5                 keypad 5
K_KP6                 keypad 6
K_KP7                 keypad 7
K_KP8                 keypad 8
K_KP9                 keypad 9
K_KP_PERIOD   .       keypad period
K_KP_DIVIDE   /       keypad divide
K_KP_MULTIPLY *       keypad multiply
K_KP_MINUS    -       keypad minus
K_KP_PLUS     +       keypad plus
K_KP_ENTER    \r      keypad enter
K_KP_EQUALS   =       keypad equals
K_UP                  up arrow
K_DOWN                down arrow
K_RIGHT               right arrow
K_LEFT                left arrow
K_INSERT              insert
K_HOME                home
K_END                 end
K_PAGEUP              page up
K_PAGEDOWN            page down
K_F1                  F1
K_F2                  F2
K_F3                  F3
K_F4                  F4
K_F5                  F5
K_F6                  F6
K_F7                  F7
K_F8                  F8
K_F9                  F9
K_F10                 F10
K_F11                 F11
K_F12                 F12
K_F13                 F13
K_F14                 F14
K_F15                 F15
K_NUMLOCK             numlock
K_CAPSLOCK            capslock
K_SCROLLOCK           scrollock
K_RSHIFT              right shift
K_LSHIFT              left shift
K_RCTRL               right ctrl
K_LCTRL               left ctrl
K_RALT                right alt
K_LALT                left alt
K_RMETA               right meta
K_LMETA               left meta
K_LSUPER              left windows key
K_RSUPER              right windows key
K_MODE                mode shift
K_HELP                help
K_PRINT               print screen
K_SYSREQ              sysrq
K_BREAK               break
K_MENU                menu
K_POWER               power
K_EURO                euro

还有一个mod属性表示一组修饰键的状态,可以通过位或把它们组合起来:

KMOD_NONE, KMOD_LSHIFT, KMOD_RSHIFT, KMOD_SHIFT, KMOD_CAPS,
KMOD_LCTRL, KMOD_RCTRL, KMOD_CTRL, KMOD_LALT, KMOD_RALT,
KMOD_ALT, KMOD_LMETA, KMOD_RMETA, KMOD_META, KMOD_NUM, KMOD_MODE

除了通过事件得到键盘输入以外,也可以直接访问键盘。通过pygame.key.get_pressed可以获得当前所有键的状态,pygame.key.get_mods可以获得所有修饰键的状态,比如:

1
2
3
4
keys = pygame.key.get_pressed()
mods = pygame.key.get_mods()
if keys[K_F8] and mods[KMOD_ALT]: #if Alt-F8 is pressed
pass

key模块下还有很多函数:

key.get_focused —— 当前激活的pygame窗口
key.get_pressed —— 获得当前所有键的状态
key.get_mods —— 按下的组合键(Alt, Ctrl, Shift)
key.set_mods —— 你也可以模拟按下组合键的效果(KMOD_ALT, KMOD_CTRL, KMOD_SHIFT)
key.set_repeat —— 设定允许pygame接受重复按键
key.name —— 接受键值返回键名

学完键盘模块后偶自己写了一个贪吃蛇的小游戏,下载地址:http://app.xefan.com/小游戏/贪吃蛇/

STC89C5XX单片机看门狗说明

下面是关于STC89C5XX-51 单片机看门狗的描述

WDT_CONTR 位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]

EN_WDT: 看门狗允许位,置 1 启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启动不能关闭(只能系统重新上电和看门狗复位可以关闭)

CLR_WDT: 看门狗计数器清零位,置1 清零看门狗计数器,当计数器开始重新计数,硬件清零该位。

IDLE_WDT: 单片机IDLE 模式看门狗允许位,当IDLE_WDT=1时,单片机在 IDLE 模式(空闲模式)依然启用看门狗

PS2~PS0: 看门狗定时器预分频器,下表中 Prescale 表示预分频数

PS2 PS1 PS0 Prescale
0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32
1 0 1 64
1 1 0 128
1 1 1 256

看门狗溢出时间:(NPrescale32768)/晶振频率,其中 N 表示指令周期数 N=12 表示 12 时钟周期模式;N=6 表示6时钟周期模式。如N=12,晶振频率为12MHz,PS2~PS0为100时,溢出时间=(123232768)/12=1048576us,差不多是1s。

例如:给WDT_CONTR写入0×34,即是激活看门狗,同时预分频数设为32。喂狗过程也是一样的。

顺便说一下ATMEL-51单片机的看门狗

下面是关于ATMEL-51单片机看门狗的描述

【看门狗计数器】(watchdog timer)是一个14位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0×3FFF)了就使单片机软复位;当启动了【看门狗计数器】之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个过程称作喂狗。

一般设置是给 WDTRST 先写入0×1E 再写入0xE1激活看门狗;喂狗过程也是一样的,给 WDTRST 先写入0×1E 再写入0xE1。

Pygame学习笔记8:视频

视频

要在游戏中播放片头动画、过场动画等视频画面,可以使用pygame.movie模块。

要播放视频中的音乐,pygame.movie模块需要对音频接口的完全控制,不能初始化mixer模块。因此要这样完成初始化

pygame.init()
pygame.mixer.quit()

或者只初始化

pygame.display.init()

用movie = pygame.movie.Movie(’filename’)指定文件名载入视频。视频的格式可以为mpeg1。视频文件不会马上全部载入内存,而是在播放的时候一点一点的载入内存。

用movie.set_display(pygame.display.set_mode((640,480)))指定播放的surface。

用movie.set_volume(value)指定播放的音量。音量的值value的取值范围为0.0到1.0。

用movie.play()播放视频。这个函数会立即返回,视频在后台播放。这个函数可以带一个参数loops,指定重复次数。

正在播放的视频可以用movie.stop()停止播放。还可以用movie.pause()暂停播放。可以使用movie.skip(seconds)使视频前进seconds秒钟。

如有不懂的可以参考Pygame的官方例子,在Python安装目录下的\lib\site-packages\pygame\examples\movieplayer.py文件。

不过偶用官方的这个例子在Linux下播放mpeg1文件一切正常,但是在Windows下却只有声音没有画面,偶也不知道是何故。

Pygame学习笔记7:音频

音乐

要在游戏中播放背景音乐,可以使用pygame.mixer.music模块。

使用pygame.init()进行全部模块的初始化,或者只初始化音频部分:pygame.mixer.init()

使用文件名作为参数载入音乐

pygame.mixer.music.load(‘music.ogg’)

音乐可以是ogg、mp3等格式。载入的音乐不会全部放到内容中,而是以流的形式播放的,即在播放的时候才会一点点从文件中读取。

使用pygame.mixer.music.play()播放载入的音乐。该函数立即返回,音乐播放在后台进行。play方法还可以使用两个参数

pygame.mixer.music.play(loops=0, start=0.0)

loops和start分别代表重复的次数和开始播放的位置。

播放到一半可以使用pygame.mixer.music.stop()停止播放,还可以用pygame.mixer.music.pause()暂停播放。暂停播放的音乐可以用pygame.mixer.music.unpause()

来继续播放。使用pygame.mixer.music.fadeout(time)来进行淡出,在time毫秒的时间内音量由初始值渐变为0,最后停止播放。

可以用pygame.mixer.music.set_volume(value)来设置播放的音量,音量value的范围为0.0到1.0。

要判断是否在播放音乐,可以使用pygame.mixer.music.get_busy(),返回1为正在播放。在音乐播放完成时,可以用事件的方式通知用户程序。使用pygame.mixer.music.set_endevent(pygame.USEREVENT + 1),来设置当音乐播放完成时发送pygame.USEREVENT+1事件给用户程序。

当前正有音乐在播放时,可以使用pygame.mixer.music.queue(filename)来指定下一个要播放的音乐文件,当前的音乐播放完成后自动开始播放指定的下一个。一次只能指定一个等待播放的音乐文件。

注意:同时只能播放一个音乐文件。音乐文件可以很大,系统以流的形式播放。

音效

要在游戏中播放碰撞、爆炸、语音等音效,需要使用pygame.mixer模块。这个模块支持同时播放多个音效文件,多个文件在多个不同的通道Channel中播放,一个通道一次只能播放一个音效文件。

使用pygame.init()进行全部模块初始化,或者只初始化音频部分pygame.mixer.init()可以这样查看总共有多少个通道pygame.mixer.get_num_channels()可以使用channel = pygame.mixer.Channel(i)取得第i个通道。或者使用channel = pygame.mixer.find_channel()

自动取得一个空闲的通道(没有音效正在播放的通道)。

使用sound = pygame.mixer.Sound(‘KDE_Startup_2.ogg)指定文件名载入一个音频文件,并创建一个Sound对象。音频文件可以是wav,ogg等格式。音频文件的内容会被全部载入到内存中。

使用channel.play(sound)在一个通道中播放一个音效。或者使用sound.play()自动找一个空闲的通道播放音效。

正在播放的音效可以使用sound.stop()停止音效sound的播放。或者用channel.stop()停止在通道channel中播放的音效。正在播放音效的通道还可以用channel.pause()暂停通道中的音效。暂停的音效还可以用channel.unpause()继续播放。使用channel.fadeout(time)来进行淡出,在time毫秒的时间内音量由初始值渐变为0,最后停止播放。对于一个通道可以用channel.get_busy()检查它是否正在播放音效。

当一个通道中的音效播放完成时,可以通过事件通知给用户程序。使用channel.set_endevent(pygame.USEREVENT + 1)来设置当音乐播放完成时发送pygame.USEREVENT+1事件给用户程序。

使用channel.queue(sound) 为正在播放音效的通道指定下一个要播放的音效。当前的音效播放完成后,下一个音效会自动播放。一个通道只能有一个等待播放的音效。

使用channel.set_volume(value)来设置通道中播放的音效的音量。使用sound.set_volume(value)来设置单个音效的音量。两者的取值范围都是0.0到1.0。音效播放的实际音量是通道音量和音效音量的乘积,比如通道音量0.5,音效音量0.6,则实际播放的音量为0.3。

注意:音效和音乐的区别是:音效要整个文件载入到Sound对象中才能播放,而音乐不用完全载入,而以流的方式播放。

Pygame学习笔记6:定时

定时

pygame中的时间是以毫秒(千分之一秒)表示的。

通过pygame.time.get_ticks函数可以获得pygame.init后经过的时间的毫秒数。

pygame.time.wait函数会暂停给定的时间。比如

pygame.time.wait(1000)

会暂停一秒钟。这个函数会休眠这个进程,使得其他程序可以共享处理器。一个程序即使只有休眠很少的毫秒数,就能够消耗非常少的处理器时间。pygame.time.delay函数也会使程序暂停给定的时间。这个函数会使用处理器(而不是休眠)以使这个等待比pygame.time.wait更加精确。这两个函数返回实际暂停的时间。

pygame.time.set_timer可以反复创建一个事件放在事件队列中。比如

pygame.time.set_timer(pygame.USEREVENT, 1000)

每隔1秒钟在事件队列中放一个pygame.USEREVENT事件。每一个事件类型可以有一个不同的定时器。要禁止一个事件的定时器,可以把对应的毫秒数设成0。

使用pygame.time.Clock可以更方便的控制游戏执行的速度。先使用

c = pygame.time.Clock()

创建一个Clock对象。然后可以调用

c.tick(30)

参数为游戏的帧速。这个函数会暂停一定的时间,保证两次tick调用之间间隔1/30秒。这可以帮助限制游戏运行的速度。通过每帧调用一次Clock.tick(30),这个程序就永远不会以超过每秒30帧的速度运行。通过调用tick_busy_loop方法也可以达到和tick相似的效果,区别是这个函数使用pygame.time.delay,会使用很多cpu来进行忙等,而定时也更精确一些。

通过

c.get_fps()

可以获得游戏运行的帧速。

Pygame学习笔记5:事件

事件系统

Pygame通过一个事件系统与用户进行交互,以及处理一些系统发生的事件。事件系统包括一个事件队列,其中每一项都是一个Event对象。所有的用户输入和一些系统事件,都会形成一个Event对象被添加到事件队列中。pygame.event模块提供了很多函数去访问和控制这个队列。
Event对象有各种不同的类型,比如KEYDOWN(键盘键按下)、MOUSEBUTTONDOWN(鼠标键按下)等,通过Event.type属性来区分。不同的类型的Event对象还有不同的其它属性。通过Event.dict属性来查看。常用的类型和对应的属性有:

事件 产生途径 参数

QUIT 用户按下关闭按钮 none

ATIVEEVENT Pygame被激活或者隐藏 gain, state

KEYDOWN 键盘被按下 unicode, key, mod

KEYUP 键盘被放开 key, mod

MOUSEMOTION 鼠标移动 pos, rel, buttons

MOUSEBUTTONDOWN 鼠标按下 pos, button

MOUSEBUTTONUP 鼠标放开 pos, button

JOYAXISMOTION 游戏手柄(Joystick or pad)移动 joy, axis, value

JOYBALLMOTION 游戏球(Joy ball)?移动 joy, axis, value

JOYHATMOTION 游戏手柄(Joystick)?移动 joy, axis, value

JOYBUTTONDOWN 游戏手柄按下 joy, button

JOYBUTTONUP 游戏手柄放开 joy, button

VIDEORESIZE Pygame窗口缩放 size, w, h

VIDEOEXPOSE Pygame窗口部分公开(expose)? none

USEREVENT 触发了一个用户事件 code

pygame.event.get函数可以从队列获取所有的消息,并把它们从队列中删除。

pygame.event.poll()提取并删除一个事件,如果队列是空的,这个函数会马上返回一个pygame.NOEVENT。

pygame.event.wait()提取一个事件,如果没有事件则会等待直到有事件发生。

pygame.event.clear()可以清空整个队列。

如果只关心某些类型的事件,可以用pygame.event.get(type),只取得队列中某种类型的事件。也可以用一个类型的列表,只取得某些类型的事件。pygame.event.peek(type)函数可以检查列表中是否有某种或者某些类型的事件,如果有就返回True。除此以外还可以用pygame.event.set_blocked阻止某些类型的事件进入事件队列,使用pygame.event.set_allowed来只允许某些类型的事件进入队列。

pygame.event.post函数可以往队列中添加一个事件。

用pygame.event.Event可以创建一个事件,比如:

e = pygame.event.Event(pygame.USEREVENT)

然后可以通过

pygame.event.post(e)

把这个事件添加到队列中,等待处理。在创建事件时可以添加自定义的属性。

在窗口方式下运行,通常只有活动的窗口才能获得用户键盘、鼠标的事件。如果希望在窗口方式下,不是活动状态也能获得事件,可以通过

pygame.event.set_grab(True)

来捕获所有输入。不过这样会阻止其它程序获得用户输入,使得除了这个游戏以外其它程序都不能正常运行。要解除这样的状态,可以执行

pygame.event.set_grab(False)

注意:这个慎用!!!

可以使用如下代码来测试事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python

import pygame

pygame.init()

screen = pygame.display.set_mode((640, 480), 0, 32)

pygame.display.update()

while True:

for event in pygame.event.get():

print str(event)

if event.type == pygame.QUIT:

exit()

Pygame学习笔记4:字体

写字

相对于在Surface上画图,在Surface上写文字要复杂得多。

首先需要导入pygame.font模块并初始化。

import pygame.font

pygame.font.init()

选择字体

然后用pygame.font.get_fonts获取可用的字体的列表。

pygame.font.get_fonts()

它返回一个字体名字的列表。

然后再用字体名字列表中的一个名字可以创建一个字体对象。

font = pygame.font.SysFont(“monospace”, 12)

第一个参数指定字体的名字,第二个参数指定字体的大小。可选的第三个参数bold指定是否粗体,默认不是粗题。可选的地四个参数italic指定是否斜体,默认不是斜体。

如果是要使用自己给的字体文件,可以这样创建字体对象

font = pygame.font.Font(“uming.ttf”, 12)

第一个参数指定要载入的字体文件的路径,第二个参数指定字体的大小。

创建文字Surface

使用字体对象的Font.render函数可以创建一个Surface,里面包含写出来的文字。比如

font_surface = font.render(“www.xefan.com”, False, (255,0,0))

第一个参数是要写的文字,文字只能包含一行,换行符不会被画出来。第二个参数指定是否使用抗锯齿效果,如果是True字符会有光滑的边缘。第三个参数是字体的颜色。可选的第四个参数background用来指定文字背景的颜色。如果没有指定background,背景是透明的。返回创建的Surface,它上面包含了画出来的文字,它的大小是能容纳这些字的最小的大小。

要在已有的Surface上写字,只能先创建一个只包含文字的Surface,然后把它blit到已有的Surface上。比如:

surface.blit(font_surface, (100, 100))

最后用pygame.display.update()来显示。

显示中文说明:

要显示中文相对来说又要麻烦一些,首先你得有个可以使用中文的字体,如宋体、黑体等,或者你直接用中文TTF文件,然后文字使用unicode,即u”中文的文字”这种,最后不要忘了源文件里加上一句关于文件编码的注释。

Pygame学习笔记3:绘图

绘图

除了可以把事先画好的图片blit到Surface上以外,还可以在Surface上自行在Surface上绘制一些简单的图形,比如点、线、方、圆等。这个功能主要由pygame.draw模块完成。

首先导入pygame.draw模块。

import pygame.draw

如果已经用了import pygame,则pygame.draw模块也被自动导入了。

然后准备好要在上面绘制图形的Surface,比如

surface = pygame.display.set_mode((640, 480))

pygame.draw中函数的第一个参数总是一个surface,然后是颜色,再后会是一系列的坐标等。稍有些计算机绘图经验的人就会知道,计算机里的坐标,(0,0)代表左上角。而返回值是一个Rect对象,包含了绘制的领域,这样你就可以很方便的更新那个部分了。

函数 作用

rect 绘制矩形

polygon 绘制多边形(三个及三个以上的边)

circle 绘制圆

ellipse 绘制椭圆

arc 绘制圆弧

line 绘制线

lines 绘制一系列的线

aaline 绘制一根平滑的线

aalines 绘制一系列平滑的线

pygame.draw.rect

用法:pygame.draw.rect(Surface, color, Rect, width=0)

pygame.draw.rect在surface上画一个矩形,除了surface和color,rect接受一个矩形的坐标和线宽参数,如果线宽是0或省略,则填充。我们有一个另外的方法来画矩形——fill方法

pygame.draw.polygon

用法:pygame.draw.polygon(Surface, color, pointlist, width=0)

polygon就是多边形,用法类似rect,第一、第二、第四的参数都是相同的,只不过polygon会接受一系列坐标的列表,代表了各个顶点。

pygame.draw.circle

用法:pygame.draw.circle(Surface, color, pos, radius, width=0)

很简单,画一个圆。与其他不同的是,它接收一个圆心坐标和半径参数。

pygame.draw.ellipse

用法:pygame.draw.ellipse(Surface, color, Rect, width=0)

你可以把一个ellipse想象成一个被压扁的圆,事实上,它是可以被一个矩形装起来的。pygame.draw.ellipse的第三个参数就是这个椭圆的外接矩形。

pygame.draw.arc

用法:pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1)

arc是椭圆的一部分,所以它的参数也就比椭圆多一点。但它是不封闭的,因此没有fill方法。start_angle和stop_angle为开始和结束的角度。

pygame.draw.line

用法:pygame.draw.line(Surface, color, start_pos, end_pos, width=1)

相信所有的人都能看明白。

pygame.draw.lines

用法:pygame.draw.lines(Surface, color, closed, pointlist, width=1)

closed是一个布尔变量,指明是否需要多画一条线来使这些线条闭合(感觉就和polygone一样了),pointlist是一个点的数组。

pygame.draw.aaline画抗锯齿的线段。

pygame.draw.aalines可以画多条连续的抗锯齿线段。

用法跟python.draw.line和pygame.draw.lines相似。

点操作

画点的方法和其它方法不太一样,用Surface.set_at方法完成画点的操作,比如:

surface.set_at((100, 100), (255,255,255))

第一个参数是点的坐标,第二个参数是颜色。

除了可以在Surface上画点,还可以用Surface.get_at读取Surface上像素的值。比如

color = surface.get_at((100, 100))

这个函数返回给定点的颜色值。

填充区域

Surface.fill方法可以用一种颜色填充一个矩形区域。比如

surface.fill((255,0,0), (100, 200, 100, 100))

第一个参数指定要填充的颜色,第二个参数指定填充的矩形区域。如果没有给定第二个参数,整个Surface会被填充。第二个参数会限制备填充的区域。这个函数会返回受影响的Surface区域。

Pygame学习笔记2:显示

首先使用了如下的语句创建一个窗口:

screen =pygame.display.set_mode((640, 480), 0, 32)

这里创建了一个640*480的黑窗口,现在可以往内面画内容。

读取和保存图片

使用pygame.image模块,可以对图像进行读取和保存。

使用pygame.image.load读取图像文件。

img = pygame.image.load(filename)

可以读取文件名为filename的图像文件,pygame会自动确定文件的类型(比如GIF或者BMP),一般来说支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一个包含图像的Surface,Surface的格式和原来的文件相同(包括颜色格式、透明色和alpha透明)。

使用pygame.image.save可以把图像保存到文件中。

pygame.image.save(img, filename)

这个函数可以把img这个Surface的内容保存为filename指定的图像文件,文件格式可以是BMP、TGA、PNG或者JPEG。如果文件扩展名不认识,默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

还有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函数可以把图像序列化,即把图像保存在字符串中或者从字符串中读取图像。

变换

使用pygame.transform模块中的函数,可以对图像进行简单的变换。所有的这些函数都需要一个Surface参数指明要处理的图像,并生成一个新的图像表示处理后的结果,原来的图像不会被改变。

使用pygame.transform.flip可以上下左右翻转图像

使用pygame.transform.scale可以对图像进行缩放

使用pygame.transform.rotate可以对图像进行旋转

使用pygame.transform.rotozoom可以对图像进行缩放并旋转

使用pygame.transform.scale2x可以对图像进行快速的两倍大小的放大

使用pygame.transform.chop可以对图像进行裁减

转换Surfaces

通常你不用在意surface里的具体内容,不过也许你需要吧这些surface转换一下以获得更高的性能,

img2 =pygame.image.load(image_filename).convert()

mouse_cursor =pygame.image.load(image_filename).convert_alpha()

第一句是普通的转换,相同于display;第二句是带alpha通道的转换。如果你给convert或者conver_alpha一个surface对象作为参数,那么这个会被作为目标来转换。

块复制

一个图像复制到另一个上面

现在要将读取的图片画在屏幕上,可由blit函数来实现

Surface.blit(source, dest, area=None, special_flags = 0): return Rect

画的位置可以由dest参数指定。dest可以是一对坐标值,表示源Surface的左上角在这个Surface上的坐标。dest也可以是一个矩形,矩形的左上角作为blit的位置,而矩形的大小不影响blit。

有一个可选的area矩形参数,可以用来指定只画源Surface的一部分。

一个可选的special_flags参数,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。将来也可能有其它特殊标记添加进来。

函数返回的矩形表示受影响的像素的区域,不包括目标Surface以外的像素,也不包括剪切区域以外的像素。

例如:

screen.blit(img,(0,0))

然后使用pygame.display.update()来更新显示。