燕之庐网站建设 - 优质网站设计公司

Archive for 2月 1st, 2010

网站建设

2010/02/01

MySQL创始人打造MariaDB

Tags:

尽管MySQL前途未卜,但是其联合创始人最近 也在全力忙于MariaDB方面的开发。相信这一MySQL分支的完善,会给数据库管理 人员带来福音。

MySQL联合创始人Monty Widenius提供了MySQL的分支MariaDB候选版本。据报道MariaDB 5.1完全兼容MySQL 5.1,这个版本早在2008年11月就发布了,增加了很多新的功 能和若干个新的补丁程序。开发者称这个候选版本非常稳定,将在不久的将来发布。

MariaDB Logo

MariaDB Logo

MariaDB基于事务的 Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX 存储引擎。

这个项目的更多的代 码都改编于MySQL 6.0,例如 “pool of threads”功能提供解决多数据连接问题。MariaDB 5.1.41 RC的32位和64位已编译Linux版 本,还包括源代码包。MariaDB基于GPL 2.0发布。

下载地址:http://askmonty.org/wiki /index.php/MariaDB:Download

网站建设

网站建设

开源网络安全工具Nmap 5.20发布

Tags:

Nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端,并能推断出对方运 行的操作系统。 现在Nmap正式发布了5.20版,包含了GUI前端Zenmap的一个更新版。

Nmap 5.20现在能识别出Snow Leopard,Android Linux智 能手机,以及Chumby、HW group、Icom、Lyngsoe和NEC等生产的打印机、宽带路由器和其它设备,共收集了1349个指纹。Nmap 5.20还新增了31个Nmap Scripting Engine脚本,预写好脚本总数达到了80个。脚本包括了X11访问检查,观察系统上的X.org是否允许远程访问;检索并打印SSL证书的脚本;设计 检查主机是否有恶意程序的脚本等等。

网站建设

网站建设

PHP中的CURL函数库

Tags:

目前为目最全的CURL中文说明了,学 PHP的要好好掌握.有很多的参数.大部份都很有用.真正掌握了它和正则,一定就是个采集高手了.

PHP中的CURL函数库(Client URL Library Function)

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be “selected”
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

<?php
$ch = curl_init(http://www.baidu.com/);
curl_exec($ch);
curl_close($ch);
?>

curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一个参数,不清楚是做什么的

<?php
print_r(curl_version())
?>

curl_getinfo()函数的作用是获取一个curl连接资源句柄的信息,curl_getinfo()函数有两个参数,第一个参数是 curl的资源句柄,第二个参数是下面一些常量:

<?php
$ch = curl_init(http://www.baidu.com/);
print_r(curl_getinfo($ch));
?>

可选的常量包括:

CURLINFO_EFFECTIVE_URL
最后一个有效的url地址

CURLINFO_HTTP_CODE
最后一个收到的HTTP代码

CURLINFO_FILETIME
远程获取文档的时间,如果无法获取,则返回值为“-1”

CURLINFO_TOTAL_TIME
最后一次传输所消耗的时间

CURLINFO_NAMELOOKUP_TIME
名称解析所消耗的时间

CURLINFO_CONNECT_TIME
建立连接所消耗的时间

CURLINFO_PRETRANSFER_TIME
从建立连接到准备传输所使用的时间

CURLINFO_STARTTRANSFER_TIME
从建立连接到传输开始所使用的时间

CURLINFO_REDIRECT_TIME
在事务传输开始前重定向所使用的时间

CURLINFO_SIZE_UPLOAD
上传数据量的总值

CURLINFO_SIZE_DOWNLOAD
下载数据量的总值

CURLINFO_SPEED_DOWNLOAD
平均下载速度

CURLINFO_SPEED_UPLOAD
平均上传速度

CURLINFO_HEADER_SIZE
header部分的大小

CURLINFO_HEADER_OUT
发送请求的字符串

CURLINFO_REQUEST_SIZE
在HTTP请求中有问题的请求的大小

CURLINFO_SSL_VERIFYRESULT
Result of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEER

CURLINFO_CONTENT_LENGTH_DOWNLOAD
从Content-Length: field中读取的下载内容长度

CURLINFO_CONTENT_LENGTH_UPLOAD
上传内容大小的说明

CURLINFO_CONTENT_TYPE
下载内容的“Content-type”值,NULL表示服务器没有发送有效的“Content-Type: header”

curl_setopt()函数的作用是为一个curl设置会话参数。curl_setopt_array()函数的作用是以数组的形式为一个 curl设置会话参数。

<?php
$ch = curl_init();
$fp = fopen(example_homepage.txt, w);
curl_setopt($ch, CURLOPT_FILE, $fp);
$options = array(
CURLOPT_URL => http://www.baidu.com/,
CURLOPT_HEADER => false
);
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>

可设置的参数有:

CURLOPT_AUTOREFERER
自动设置header中的referer信息

CURLOPT_BINARYTRANSFER
在启用CURLOPT_RETURNTRANSFER时候将获取数据返回

CURLOPT_COOKIESESSION
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下curl会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。

CURLOPT_CRLF
启用时将Unix的换行符转换成回车换行符。

CURLOPT_DNS_USE_GLOBAL_CACHE
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认为true。

CURLOPT_FAILONERROR
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息

CURLOPT_FILETIME
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。

CURLOPT_FOLLOWLOCATION
启用时会将服务器服务器返回的“Location:”放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的 数量。

CURLOPT_FORBID_REUSE
在完成交互以后强迫断开连接,不能重用。

CURLOPT_FRESH_CONNECT
强制获取一个新的连接,替代缓存中的连接。

CURLOPT_FTP_USE_EPRT
TRUE to use EPRT (and LPRT) when doing active FTP downloads. Use FALSE to disable EPRT and LPRT and use PORT only.
Added in PHP 5.0.0.

CURLOPT_FTP_USE_EPSV
TRUE to first try an EPSV command for FTP transfers before reverting back to PASV. Set to FALSE to disable EPSV.

CURLOPT_FTPAPPEND
TRUE to append to the remote file instead of overwriting it.

CURLOPT_FTPASCII
An alias of CURLOPT_TRANSFERTEXT. Use that instead.

CURLOPT_FTPLISTONLY
TRUE to only list the names of an FTP directory.

CURLOPT_HEADER
启用时会将头文件的信息作为数据流输出。

CURLOPT_HTTPGET
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。

CURLOPT_HTTPPROXYTUNNEL
启用时会通过HTTP代理来传输。

CURLOPT_MUTE
讲curl函数中所有修改过的参数恢复默认值。

CURLOPT_NETRC
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。

CURLOPT_NOBODY
启用时将不对HTML中的body部分进行输出。

CURLOPT_NOPROGRESS
启用时关闭curl传输的进度条,此项的默认设置为true

CURLOPT_NOSIGNAL
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认打开。

CURLOPT_POST
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

CURLOPT_PUT
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE

CURLOPT_RETURNTRANSFER
讲curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

CURLOPT_SSL_VERIFYPEER
FALSE to stop cURL from verifying the peer’s certificate. Alternate certificates to verify against can be specified with the CURLOPT_CAINFO option or a certificate directory can be specified with the CURLOPT_CAPATH option. CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE if CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2). TRUE by default as of cURL 7.10. Default bundle installed as of cURL 7.10.

CURLOPT_TRANSFERTEXT
TRUE to use ASCII mode for FTP transfers. For LDAP, it retrieves data in plain text instead of HTML. On Windows systems, it will not set STDOUT to binary mode.

CURLOPT_UNRESTRICTED_AUTH
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。

CURLOPT_UPLOAD
启用时允许文件传输

CURLOPT_VERBOSE
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中

CURLOPT_BUFFERSIZE
每次获取的数据中读入缓存的大小,这个值每次都会被填满。

CURLOPT_CLOSEPOLICY
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个,但是 curl暂时还不支持。.

CURLOPT_CONNECTTIMEOUT
在发起连接前等待的时间,如果设置为0,则不等待。

CURLOPT_DNS_CACHE_TIMEOUT
设置在内存中保存DNS信息的时间,默认为120秒。

CURLOPT_FTPSSLAUTH
The FTP authentication method (when is activated): CURLFTPAUTH_SSL (try SSL first), CURLFTPAUTH_TLS (try TLS first), or CURLFTPAUTH_DEFAULT (let cURL decide).

CURLOPT_HTTP_VERSION
设置curl使用的HTTP协议,CURL_HTTP_VERSION_NONE(让curl自己判 断),CURL_HTTP_VERSION_1_0(HTTP/1.0),CURL_HTTP_VERSION_1_1(HTTP/1.1)

CURLOPT_HTTPAUTH
使用的HTTP验证方法,可选的值 有:CURLAUTH_BASIC,CURLAUTH_DIGEST,CURLAUTH_GSSNEGOTIATE,CURLAUTH_NTLM,CURLAUTH_ANY,CURLAUTH_ANYSAFE, 可以使用“|”操作符分隔多个值,curl让服务器选择一个支持最好的值,CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM,CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM

CURLOPT_INFILESIZE
设定上传文件的大小

CURLOPT_LOW_SPEED_LIMIT
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传 输。

CURLOPT_LOW_SPEED_TIME
The number of seconds the transfer should be below CURLOPT_LOW_SPEED_LIMIT for PHP to consider the transfer too slow and abort.
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传 输。

CURLOPT_MAXCONNECTS
允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接

CURLOPT_MAXREDIRS
指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。

CURLOPT_PORT
一个可选的用来指定连接端口的量

网站建设

网站建设

什么是Go语言?Go可以干嘛?

Tags:

Go语言简介:
Go是谷歌2009发布的第二款编程语言.2009年7月份,谷歌曾发布了Simple语言,它是用来开发Android应用的一种BASIC语言.
北京时间2010年1月10日,Go语言摘得了TIOBE公布的2009年年度大奖。该奖项授予在2009年市场份额增长最多的编程语言。
谷歌资深软件工 程师罗布·派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率.”派克表示,和今天的C++或C一样,Go是一种系统语言.他解释道,“使用它可以进行快速开 发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大.”
2007年,谷歌把Go作为一个20%项目开始研发,即让员工抽出本职工作之外时间的20%,投入在该项目上.除了派克外,该项目的成员还其它一些谷 歌工程师.
派克表示,编译后Go代码的运行速度与C语言非常接近,而且编译速度非常快,就像在使用一个交互式语言.
现有编程语言均未专门对多核处理器进行优化.派克表示,Go就是谷歌工程师为这类程序编写的一种语言.它不是针对编程初学者设计的,但学习使用它也不 是非常困难.Go支持面向对象,而且具有真正的封装(closures)和反射(reflection)等功能.
在学习曲线方面,派克认为Go与Java类似,对于Java开发者来说,应该能够轻松学会Go.
之所以将Go作为一个开源项目发布,目的是让开源社区有机会创建更好的工具来使用该语言,例如Eclipse IDE中的插件.目前还没有支持Go的IDE.
在目前谷歌公开发布的所有网络应用中,均没有使用Go.但是谷歌已经使用该语言开发了几个内部项目.
派克表示,Go是否会对谷歌即将推出的Chrome OS产生影响,现在还言之尚早,不过Go的确可以和Native Client配合使用.他表示,“Go可以让应用完美的运行在浏览器内.”例如,使用Go可以更高效的实现Wave,无论是在前端还是后台.
Go 同时具有两种编译器,一种是建立在GCC基础上的Gccgo,另外一种是分别针对64位x86和32位x86计算机的一套编译器(6g和8g).谷歌目前 正在研发其对ARM芯片和Android设备的支持.派克表示,“Android手机存在的问题是,我们一直没有一个数字协处理器.”

Go团队成员:
Thompson,1983年图灵奖(Turing Award)和1998年美国国家技术奖(National Medal of Technology)得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出C语言的B程序语言。
Pike,曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8 字元编码。
Robert Griesemer,曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。
此外还有Plan 9开发者Russ Cox,和曾改善目前广泛使用之开原码编译器GCC的Ian Taylor。

Go可以干嘛?
Google对Go寄予厚望。其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决若干物件取向程序设计的麻烦。它具有现 代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎但重要的内存管理问题。Go的速度也非常快,几乎和C或C++程序一样快,且能够快速制作程序。
Go的网站就是用Go所建立,但Google有更大的野心。该软件是专为构建服务器软件所设计(如Google的Gmail)。Google认为Go 还可应用到其他领域,包括在浏览器内执行软件,取代目前JavaScript的角色。
Pike说:它至少在强度上比JavaScript高一级。Google自建Chrome浏览器,部分原因就是加速JavaScript和网页表现, 而Google已经融合了本身的技术,如Native Client和Gears。
Pike表示,Go另一项与网络相关的特色,是服务器和用户端设备,如PC或手机,可以分担工作。因此,使用Go的服务便可轻松适应不同的用户端处理 性能。Go也可解决目前的一大挑战:多核心处理器。一般电脑程序通常依序执行,一次进行一项工作,但多核心处理器更适合同步处理许多工作。Pike说:我 们自认有足够的支持,可改善这方面的问题。
Go团队正在寻求帮助。其中一个重要领域是改善Go能够使用的runtime library。这类library可提供许多工具和功能,加快程序设计的过程。而Go的library还包括许多重要的设计元素,并供应处理同作、垃圾 收集和其他低层杂务的资源。
Go团队也需要编译器方面的协助。Thompson曾为32位元和64位元x86处理器,及ARM处理器写过一些编译器,Taylor也为GCC编译 器写过一个Go前端。
尽管Google对Go有很大的野心,该公司也明白,这项计划无法完全取代现有的技术。Pike说:我不认为我们能取代任何东西。我们只是创造出这个 领域的另一个角色。
[编辑本段]Go语言的特色:
简洁 快速 安全 并行 有趣 开源 支持泛型编程,内存管理,数组安全,编译迅速

网站建设

网站建设

Facebook重写PHP runtime?

Tags:

传说上周Facebook开发团队邀请了核心PHP团队到公司讨论他们的新开源项目,这些核 心的PHP开发者还被迫签署了保密协议。但有匿名人士留 言说,Facebook是在开发一个PHP编译器,Facebook版本的PHP将从一个动态语言变成了一个预编译类型安全语言。这将能使PHP的速度提 升10倍。

网站建设

网站建设

比尔盖茨的新网站使用Linux系统和IIS

Tags:

谁还敢说微软不支持开源,不支持Linux,据netcraft的报告,Bill Gates的新网站盖茨笔记使用了Linux的操作系统,同时使用IIS/7.0 Web服务器软件,咋一听起来怎么这么别扭呢!Linux系统上哪来的IIS?但netcraft的报告确实是这么说的,难道探测错误了?或者有其他的蹊 跷,你想到了可能的原因吗?

Linux系统和IIS
Linux系统和IIS
Gates使用了Akamai给 网站内容做镜像,以防止在网站流量大或遭受DDos攻击时候出现无法访问的情况,流量会在这里过滤。Akamai使用Linux服务器,所以 Netcraft探测到的信息是Linux服务器。但同时令人感到诧异的是,Akamai服务器同时给Netcraft返回了包含“Microsoft- IIS/7.0”字样的网站头信息。

其实同样的事情在2003年时已经发生过了,当时是说microsoft.com运行在Linux上。实际上是这样的:微软的流量在同样使用 Linux boxes的Akamai上进行了路由,所以当时会有这个误会。之后微软更换了他们的服务器,自那以后就能正常探测到他们使用Windows Server 2003系统了,其实这就和盖茨笔记使用Microsoft-IIS/7.0是一个道理。

原文:http://3seconds.cn/2010/01/31/thegatesnote-linux-iis.html

网站建设

网站建设

微软网络业务年亏损近20亿美元

Tags:

图为微软网络业 务以往各季度运营利润统计

北 京时间1月30日早间消息,据国外媒体今日报道,尽管微软Windows 7的表现不错,但网络业务却在持续亏 损,一年的亏损总额将近20亿美元。

即使对微软这样的科技巨头而言,20亿美元也绝非小数。业内人士认 为,微软新款搜索引擎必应(Bing)发布以来,市场份额已经增加了3个百分点,也就是说,平均每个百分点的成本约为6.67亿美元。

微软 在分析师会议上证实,第二财季网络部门收入成本增加了1.71亿美元,约50%,主要原因在于流量获得成本增长。也就是说,微软多花了1.71亿美元用来 购买流量。假设其中大部分,即1.5亿美元用于购买必应的流量。

与此同时,微软网络业务广告收入下滑了2%,为5.16亿美元。搜索广告收 入就包含在其中。虽然搜索广告份额增加,显示广告份额减少,但业内人士认为,搜索广告收入增长不太可能超过1.5亿美元。因此,微软通过必应增加的收入低 于该公司为必应新增的投入。而且这1.5亿美元还不包括微软斥资1亿美元为必应打造的广告推广计划。

业内人士认为,即使经过多年的发展,微 软的网络业务依旧没有看到任何成功的迹象,今后也很难扭转这种局势。不仅如此,微软还在将Windows业务赚来的大量资金投入到网络业务中。

网站建设

网站建设

用脚本语言开发网游 – C整合Python

Tags:

像因特网的Web系统一样, 几乎所有的大规模软件系统, 都会使用脚本语言. 在网络游戏服务器的开发中, 也会应用脚本语言. 游戏开发常用的脚本语言主要有: Python, Lua. 本文介绍在C语言中嵌入Python支持, C语言和Python语言通过API进行交互.

任何两种语言要整合, 首先要解决通信问题. C要和Python进行通信, 要进行数据结构转换, 把C的数据结构转为Python的对象, 和把Python对象转换为C数据结构.

下面对代码实例进行讲解, 代码忽略和错误处理.

#include <python2.5/Python.h>

void test1();
void test2();

PyObject *globals

int main(int argc, char **argv){
	PyObject *m, *obj1, *pobj;
	PyObject *request, *response;
	int i;

	Py_Initialize();

变量声明, 以及调用初始化函数 Py_Initialize().

	m = PyImport_AddModule("__main__");
	globals = PyModule_GetDict(m);

获取全局变量的字典表(哈希表). 在 Python 脚本中, 该字典表的键名就是全局变量的的名字. 例如, 全局变量字典表中有一项记录 ‘a’ => ‘123′, 那么, 在 Python 脚本中, 变量 a 的值是 ‘123′. 该字典表就是 C 语言和 Python 语言进行通信的关键.

	request = PyDict_New();
	response = PyDict_New();

	PyDict_SetItemString(globals, "request", request);
	PyDict_SetItemString(globals, "response", response);

	obj1 = PyInt_FromLong(1);
	PyDict_SetItemString(request, "count", obj1);

在本代码例子中, 字典表 request 用于 C 向 Python 传递数据, response 用于 Python 脚本向 C 程序传递数据. 使用两个字典并不是必须的, 可以只用一个. request 中有一项键名为 ‘count’ 的记录, 相当于向 Python 传递了一个名为 ‘count’ 的参数.

	/* http://www.benegg.com */
	for(i = 0; i < 2; i++){
		test1();
		pobj = PyDict_GetItemString(response, "code");
		printf("code: %s\n", PyString_AsString(pobj));

		test2();
		pobj = PyDict_GetItemString(response, "code");
		printf("code: %s\n", PyString_AsString(pobj));

		printf("---\n");
	}

Python 脚本中返回名为 ‘code’ 的响应参数, 在 C 程序中将该参数的值打印出来.

	Py_DECREF(obj1);
	Py_DECREF(request);
	Py_DECREF(response);

out:
	Py_Finalize();
	return 0;
}

使用宏 Py_DECREF 减少对象的引用计数, 以便 Python 进行垃圾收集. 最后调用 Py_Finalize() 释放资源.

void test1(){
	FILE *fp;
	fp = fopen("benegg.com.py", "r");
	PyRun_SimpleFile(fp, filename);
	fclose(fp);
}

PyRun_SimpleFile() 函数执行一个 Python 脚本文件.

void test2(){
	FILE *fp;
	PyObject *co;
	char *buf;
	long size;

	fp = fopen("benegg.com.py", "r");
	fseek(fp, 0, SEEK_END);
	size = ftell(fp);
	rewind(fp);

	buf = malloc(size + 1);
	fread(buf, 1, size, fp);
	buf[size] = '\0';

	PyRun_SimpleString(buf);

因为 PyRun_SimpleFile() 每执行一次都要读取一次文件, 所以可以把文件内容读取到字符缓冲中, 然后多次执行 PyRun_SimpleString(), 避免磁盘 IO 造成性能消耗.

	co = Py_CompileString(buf, "benegg.com", Py_file_input);
	PyEval_EvalCode((PyCodeObject *)co, globals, globals);

不过, 虽然 PyRun_SimpleString() 避免了磁盘 IO, 然后还是会在每一次执行的时候解析文本代码. 这时, 可以把代码编译成一个 PyCodeObject 对象, 然后调用 PyEval_EvalCode() 执行, 避免了多次解析造成的性能消耗.

	Py_DECREF(co);
out:
	free(buf);
	fclose(fp);
}

Python 脚本代码如下:

print "test1 - %d" % request['count']
request['count'] += 1
response['code'] = "test" + str(request['count'])

编译 C 代码:

# http://www.benegg.com
gcc -g -Wall -o c test.c -L/usr/lib/python2.5/config -lpython2.5

注意, 将路径改为你机器上的实际路径. 执行 ./c, 可以看到, 执行的结果是:

test1 - 1
code: test2
test1 - 2
test1 - 3
code: test4
---
test1 - 4
code: test5
test1 - 5
test1 - 6
code: test7


网站建设

网站建设

python网络编程学习初步

Tags:

一、套接字

套接字是为特定网络协议(例如TCP/IP,ICMP /IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象。它们允许程序接受并进行连接,如发送和接受数据。为了建立通信通道,网 络通信的每个端点拥有一个套接字对象极为重要。

套接字为BSD UNIX系统核心的一部分,而且他们也被许多其他类似UNIX的操作系统包括Linux所采纳。许多非BSD UNIX系统(如ms-dos,windows,os/2,mac os及大部分主机环境)都以库形式提供对套接字的支持。

三种最流行的套接字类型 是:stream,datagram和raw。stream和datagram套接字可以直接与TCP协议进行接口,而raw套接字则接口到IP协议。但 套接字并不限于TCP/IP。

二、套接 字模块

套接字模块是一个非常简单的基于 对象的接口,它提供对低层BSD套接字样式网络的访问。使用该模块可以实现客户机和服务器套接字。要在python 中建立具有TCP和流套接字的简单服务器,需要使用socket模块。利用该模块包含的函数和类定义,可生成通过网络通信的程序。一般来说,建立服务器连 接需要六个步骤。

第1步是创建 socket对象。调用socket构造函数。

socket=socket.socket(familly,type)

family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是 AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字)。

第2步则是将socket绑定(指派)到指定地址上,socket.bind(address)

address必须是一个双元素元组, ((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异 常。

第3步,绑定后,必须准备好套接 字,以便接受连接请求。

socket.listen(backlog)

backlog指定了最多连接数,至少为1,接到连 接请求后,这些请求必须排队,如果队列已满,则拒绝请求。

第4步,服务器套接字通过socket的accept方法等待客户请求一个连接:

connection,address=socket.accept()

调用accept方法时,socket会进入 ‘waiting’(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回 一个含有俩个元素的元组,形如(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客 户通信;第二个元素(address)是客户的internet地址。

第5步是处理阶段,服务器和客户通过send和recv方法通信(传输数据)。服务器调用send,并采用 字符串形式向客户发送信息。send方法 返回已发送的字符个数。服务器使用recv方法从客户接受信息。调用recv时,必须指定一个整数来控制本次调用所接受的最大数据量。recv方法在接受 数据时会进入’blocket’状态,最后返回一个字符串,用它来表示收到的数据。如果发送的量超过recv所允许,数据会被截断。多余的数据将缓冲于接 受端。以后调用recv时,多余的数据会从缓冲区删除。

第6步,传输结束,服务器调用socket的close方法以关闭连接。

建立一个简单客户连接则需要4个步骤。

第1步,创建一个socket以连接服务器 socket=socket.socket(family,type)

第2步,使用socket的connect方法连接服务器 socket.connect((host,port))

第3步,客户和服务器通过send和recv方法通信。

第4步,结束后,客户通过调用socket的close方法来关闭连接。

三、一个简单的服务器和客户端通信的例子

服务器:

import socket
s
=socket.socket()
s.bind((
xxx.xxx.xxx.xxx,xxxx)) #ip地址和端口号
s.listen(5)
cs,address
= s.accept()
print got connected from,address
cs.send(
byebye)
ra
=cs.recv(512)
print ra
cs.close()


客户端:

import socket
s
=socket.socket()
s.connect((
xxx.xxx.xxx.xxx,xxxx)) #与服务器程序ip地址和端口号相同
data=s.recv(512)
s.send(
hihi)
s.close()
print the data received is,data


运行:

在本机测试(windows环境下,可以将ip地址 改为本机ip,端口号在1024以上,windows将1024以下的为保留),运行–CMD–进入命令行模式

先python 服务器程序,后python 客户端程序即可。

或者启动服务器程序 后,用telnet ip地址 端口号,也可以得到同样结果。


让server持续接受连接

server.py

import socket
s
=socket.socket()
s.bind((
192.168.43.137,2000))
s.listen(
5)

while 1:
cs,address
= s.accept()
print got connected from,address
cs.send(
hello I am server,welcome)
ra
=cs.recv(512)
print ra
cs.close()


测试两个一个程序中两个socket并存是否可行

client.py

import socket
s
=socket.socket()
s.connect((
192.168.43.137,2000))   
data
=s.recv(512)
print the data received is\n ,data
s.send(
hihi I am client)

sock2
= socket.socket()
sock2.connect((
192.168.43.137,2000))
data2
=sock2.recv(512)
print the data received from server is\n ,data2
sock2.send(
client send use sock2)
sock2.close()

s.close()
网站建设

网站建设

Python游戏:PyGame

Tags:

Pygame是脚本语言Python的一个扩展包就是SDL的封装包,是用Python C语言开发;开发人是Pete Shinners。专门用于开发各类游戏。SDL意思是Simple Directmedia Library即“简单媒体类库”,这是一个跨平台的控制多媒体的C语言类库,类似于 DirectX。这里说的媒体包括CDROM即光驱、键盘鼠标、音频视频、操纵杆等 输入输出设备,Pygame写了关于这些对象的类库可在官方网站上找到。因为是“面向对象”就是所谓Object-Oriented编程语言,所以我们可 以继承这些类的性质来编写我们自己的游戏。

Pygame的官方网站: Pygame.org PyGameLogoTiny.gif
可惜中文的Pygame文档还没有。因为Pygame是面向对象脚本编程语言 Python的一个扩展,所以在使用Pygame之前要求基本的Python的知识和技术。

不 管在什么平台上开发,所有游戏的代码通常会有的结构包含六个部分:

  1. (一)加载Pygame的或者其他工具软件的模块,在 Python是使用import语法完成;
  2. (二)资源处理类包括处理图象、声音、连接或断开网络等;
  3. (三)游戏本身 的对象类;
  4. (四)其他函数。包括不能归类的必要函数,它们可以归入游戏的逻辑代码块里但是这样处理会增加理解代 码的难度,所以把这类函数单独处理;
  5. (五)初始化。包括Pygame本身对象的初始化;游戏对象的初始化;背景、鼠标的初始化等;
  6. (六) 主循环就是def main()。处理用户输入、更新游戏对象和显示区等。

实 际上,游戏的结构是个风格问题,不同的人、从不同的侧重点出发会使用不同的方法组织自己的游戏代码。中国人学太极拳的时候有这样的一个讲究,刚刚开始学的 时候要有严格的“架式”就是动作规范,但是等到悟到用意不用力、用意念引导动作的阶段就可以随心所欲,不必太拘泥于一招一式细节了。

例如有从完全另外的角度的方法,把代码按照一下四个方面组织:(请查看这里的 资源作为参考)

  1. 模块和对象的初始化;
  2. 处理用户输入和事件循环;
  3. 动画和模拟;
  4. 提 交;

不管使用什么方式组织代码,上面例子中最主要的结构有两个:一个是主程 序即mail() loop;一个是游戏对象的类。主程序是游戏脚本开始时执行的,包括处理Pygame模块本身的初始化和游戏对象的初始化,还包括所谓事件循环就是处理游 戏玩家的输入如鼠标、键盘动作和其他事件的队列;而游戏类对象封装了游戏角色的数据和逻辑。对于初学者来说,先理解这两个结构可收提纲协领的效果。有些简 单的游戏只有一个游戏对象(没办法,我们总是要从最简单的例子开始),可能没有完全按照上面的格式写,但总是包含了这样的模式在里面。

这里有一个Pygame的代码库,各种游戏代码可供研究:Pygame代码库

第一个简单的例程hello.py:

#Find place where Python interpretor located 让游戏脚本找到Python解释器安装的地方
#!/usr/bin/python

#Import using modules 输入要用到的模块
import pygame
from pygame.locals import *

def main():
#Initialise screen 初始化。初始化软件模块、初始化屏幕
pygame.init()
screen = pygame.display.set_mode((150, 50))
pygame.display.set_caption(’Basic Pygame program’)

#Fill background 添入背景
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))

#Display some text 显示区里显示文本
font = pygame.font.Font(None, 36)
text = font.render(”Hello There”, 1, (10, 10, 10))
textpos = text.get_rect()
textpos.centerx = background.get_rect().centerx
background.blit(text, textpos)

#Blit everything to the screen 把所有东西画到屏幕上
screen.blit(background, (0, 0))
pygame.display.flip()

#Event loop事件循环
while 1:
for event in pygame.event.get():
if event.type == QUIT:
return

screen.blit(background, (0, 0))
pygame.display.flip()

#start main() 启动脚本时执行主循环
if __name__ == ‘__main__’: main()

把这段代码用自己的编辑器写入你 的一个名字叫py/的目录里,这个目录里只包含作为测试和学习用的代码样例(当然你也可以有其他的安排,你肯定有自己的打算 。注意你下载这个程序时不要使用中文注释,特别不要使用中文的#号,Python的解释器不能识别。请只下载代码。我这里加中文是为了解释代码的方便。注 意给这个脚本一个名字hello.py。

用这个简单的程序我们完成了一个框架,多数应用程序特别 是一个游戏就是写在这上面的,如下图:
图像  “http://www.pygame.org/docs/tut/tom/basic.png” 因其本身有错无法显示。

不算空格,加注释行,就是以#号开始的,以上总共31行代码。还有其他的语言能用同样的代码量来完成同样的工作 吗?也许你用可视化工具可以很容易地作出这了来,但那只是“依样画葫芦”!而你用Python写出这个简单的框架,你学会了一种功能强大的语言!也许你会 说Java的Applet能用更少的代码完成这些工作,实际上不是这样的,因为Java/Applet是在用户端的浏览器帮助下完成的,而这个是 stand alone。Python还是一种标准的黑客工具,世界上顶极黑客正在使用她!

是很 简单吗?但是你已经开始了!这个简单的程序里已经包含了游戏的主要结构。
首先你要在计算机监视器上创建一个游戏执行的框架区域,一般叫做 screen。

***********************************************
课 堂实验一
使用命令python进入命令行模式:

>>> import pygame
>>> from pygame.locals import *
>>> screen = pygame.display.set_mode((800,400))

这样 你创建了一块屏幕面积,宽800个像素,高400个像素,它的左上角的坐标为(0,0)这样你就完成了屏幕初始化的工作。

********************************************

学习一种语言最好的办法就是实验,通过观察软件的行为,输入输出的变化来理解代码的功能。跟随我的路线图保证你 能在最短时间内顺利掌握语言和技术精髓,不必从基本教程开始。牛顿说过:“在科学发展上实例比理论更重要!”,我相信在学习技术上也是这样。我们先仔细地 研究这个程序样例,深入剖析,彻底理解,举一反三,触类旁通。

  1. (1)pygame.init( ) ——实现模块初始化,就是把你要输入的模块进行初始化,准备工作;
  2. (2)screen. = pygame.display.set_mode((150,50)) ——初始化游戏屏幕,宽150高50个像素。
  3. (3)pygame.display.set_caption( ‘Basic Pygame Program’) ——在屏幕的页眉上写字;
  4. (4)background = pygame.Surface(screen.get_size() ) ——开始填满背景,.get_size()表示跟屏幕一样大。引用Surface创建的实例相当于在前面创建的screen上敷上一张画布,所以后面的 blit( )方法实际上是在这张画布上画,而不是直接在screen上画;
  5. (5)background.fill((255,255,255)) —— 把RGB格式的颜色写入背景;
  6. (6)font = pygame.font.Font( );text = font.render(”Hello There”,1,(10,10,10))以及上面的screen是模块的对象,区别于游戏本身的对象。font创建字体对象,text创建文本对象就是 框架中间的Hello There,(10,10,10)是文本字体的颜色,而中间的数字1是对字体性质的限定,这里我们先忽略;
  7. (7)textpos = text.get_rect( ) —— 是为font.render( )提交变量的text准备一个矩形框,让提交的文本放在这里;
  8. (8)background.blit ( text,textpos ) —— 可能blit ( )是最值得注意的方法,这不是一个常用词,本copy和past是同义词,就是拷贝和粘貼的意思,把什么什么拷贝/粘貼在什么什么上面,这里就是把 text粘貼在textpos上的意思;
  9. (9)screen.blit(background,(0,0)) —— 接着又一次出现blit( )方法,这次是把上一步粘貼好文本的background再拷贝在screen上,(0,0)表示从坐标原点开始就是从左上角开始;
  10. (10)pygame.display.flip( ) —— flip英文意思是轻拍、快速翻转,这个方法激活各个元素,以后我们还会碰到方法update( ),这二者的作用有些相似,从字面上可以看出这个意思;
  11. (11)While 1 : —— 下面就开始事件循环,把可能的用户输入和其他输入的动作队列循环测试,给出应有的反应;
  12. (12)最后又出现了blit()、 flip()方法,在每次检测之后更新画面;
  13. (13)if —— 语句告诉游戏脚本执行定义的主循环程序即def main()。

第 二个有动画的例程ball.py:(可在这里下载/拷贝/测试)

import sys, pygame
pygame.init()
size = width, height = 320, 240
speed = [2, 2]
black = 0, 0, 0

screen = pygame.display.set_mode(size)

ball = pygame.image.load(”ball.bmp”)
ballrect = ball.get_rect()
while 1:
for event in pygame.event.get():

if event.type == pygame.QUIT: sys.exit()

ballrect = ballrect.move(speed)

if ballrect.left < 0 or ballrect.right > width:

speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]

screen.fill(black)

screen.blit(ball, ballrect)
pygame.display.flip()

在这个例 程中有了一个游戏对象就是一个运动的球,有了处理资源的语句就是ball = pygame.image.load(”ball.bmp”)。资源包括图像文件、声音文件、互联网接入等。Pygame能接受几乎所有图像音频视频文件 格式如bmp、jpeg、mp3等。

第三个例程是更完整的chimp.py:(可在这里下载/拷贝/测 试)

#/usr/bin/env python
"""
This simple example is used for the line-by-line tutorial
that comes with pygame. It is based on a 'popular' web banner.
Note there are comments here, but for the full explanation, 
follow along in the tutorial.
"""

#Import Modules
import os, pygame
from pygame.locals import *

if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'

#functions to create our resources一下是处理资源的函数,如下载图像文件或者声音文件
def load_image(name, colorkey=None):
    fullname = os.path.join('data', name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'Cannot load image:', fullname
        raise SystemExit, message
    image = image.convert()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()

def load_sound(name):
    class NoneSound:
        def play(self): pass
    if not pygame.mixer or not pygame.mixer.get_init():
        return NoneSound()
    fullname = os.path.join('data', name)
    try:
        sound = pygame.mixer.Sound(fullname)
    except pygame.error, message:
        print 'Cannot load sound:', fullname
        raise SystemExit, message
    return sound

#classes for our game objects以下是本游戏仅有的两个对象的类Fist和Chimp,这是游戏中涉及模拟和动画的部分
class Fist(pygame.sprite.Sprite):
    """moves a clenched fist on the screen, following the mouse"""
    def __init__(self):
        pygame.sprite.Sprite.__init__(self) #call Sprite initializer
        self.image, self.rect = load_image('fist.bmp', -1)
        self.punching = 0

    def update(self):
        "move the fist based on the mouse position"
        pos = pygame.mouse.get_pos()
        self.rect.midtop = pos
        if self.punching:
            self.rect.move_ip(5, 10)

    def punch(self, target):
        "returns true if the fist collides with the target"
        if not self.punching:
            self.punching = 1
            hitbox = self.rect.inflate(-5, -5)
            return hitbox.colliderect(target.rect)

    def unpunch(self):
        "called to pull the fist back"
        self.punching = 0

class Chimp(pygame.sprite.Sprite):
    """moves a monkey critter across the screen. it can spin the
       monkey when it is punched."""
    def __init__(self):
        pygame.sprite.Sprite.__init__(self) #call Sprite intializer
        self.image, self.rect = load_image('chimp.bmp', -1)
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.rect.topleft = 10, 10
        self.move = 9
        self.di = 0

    def update(self):
        "walk or spin, depending on the monkeys state"
        if self.di:
            self._spin()
        else:
            self._walk()

    def _walk(self):
        "move the monkey across the screen, and turn at the ends"
        newpos = self.rect.move((self.move, 0))
        if self.rect.left < self.area.left or \
           self.rect.right > self.area.right:
            self.move = -self.move
            newpos = self.rect.move((self.move, 0))
            self.image = pygame.transform.flip(self.image, 1, 0)
        self.rect = newpos

    def _spin(self):
        "spin the monkey image"
        center = self.rect.center
        self.di = self.di + 12
        if self.di >= 360:
            self.di = 0
            self.image = self.original
        else:
            rotate = pygame.transform.rotate
            self.image = rotate(self.original, self.di)
        self.rect = self.image.get_rect(center=center)

    def punched(self):
        "this will cause the monkey to start spinning"
        if not self.di:
            self.di = 1
            self.original = self.image

#主循环开始。当游戏脚本开始这个函数即被调用,并初始化模块和游戏对象,执行事件循环直到返回
def main():
    """this function is called when the program starts.
       it initializes everything it needs, then runs in
       a loop until the function returns."""
#Initialize Everything初始化
    pygame.init()
    screen = pygame.display.set_mode((468, 60))
    pygame.display.set_caption('Monkey Fever')
    pygame.mouse.set_visible(0)

#Create The Backgound创建背景
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((250, 250, 250))

#Put Text On The Background, Centered把文本贴在或者拷贝在背景上。第一次出现blit( )函数
    if pygame.font:
        font = pygame.font.Font(None, 36)
        text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10))
        textpos = text.get_rect(centerx=background.get_width()/2)
        background.blit(text, textpos)

#Display The Background显示背景并更新。第二次出现blit( )函数
    screen.blit(background, (0, 0))
    pygame.display.flip()

#Prepare Game Objects准备好游戏对象包括时钟控制、模拟的对象、资源对象等
    clock = pygame.time.Clock()
    whiff_sound = load_sound('whiff.wav')
    punch_sound = load_sound('punch.wav')
    chimp = Chimp()
    fist = Fist()
    allsprites = pygame.sprite.RenderPlain((fist, chimp))

#Main Loop 事件循环,鼠标、键盘等的事件队列
    while 1:
        clock.tick(60)

    #Handle Input Events 处理用户输入事件
        for event in pygame.event.get():
            if event.type == QUIT:
                return
            elif event.type == KEYDOWN
	    and event.key == K_ESCAPE:
                return
            elif event.type == MOUSEBUTTONDOWN:
                if fist.punch(chimp):
                    punch_sound.play() #punch
                    chimp.punched()
                else:
                    whiff_sound.play() #miss
            elif event.type is MOUSEBUTTONUP:
                fist.unpunch()

        allsprites.update()

    #Draw Everything 第三次出现blit( )函数
        screen.blit(background, (0, 0))
        allsprites.draw(screen)
        pygame.display.flip()

#Game Over

#this calls the 'main' function when this script is executed 当本游戏脚本执行时调用main( )函数
if __name__ == '__main__': main()

首 先在代码开始的地方有三重的双括号”"” “”",括号内的叫docstring就是关于代码的文档说明,规范地说,每个程序代码都应该包含这部分内容,开发者自己或开发团队可以从这里获得关于代 码的功能、许可证等方面的信息。这是Python所特有的所谓“自省”功能,英语叫“Introspection”。这里有必要加以简单的介绍。在命令行 里使用dir(module/function),在实验中用 Python的模块、函数、方法os、sys、 pygame等等甚至是一个数字如2来代替括号里的斜体字,可以查看对象的性质。因为在Python里,一切都是对象,所以这些都可以使用dir()函数 查看对象的性质,这包括对象的结构、包含的函数和方法、类的继承关系、子类、可以接受的变量、返回的结果等详细信息。另外有同等功能的是在命令行的符 号>>>里使用help( )函数,用法与dir( )相同,但是得到的信息有所不同。这些都内嵌在Python的解释器里所以叫做内省的。非常形象。

***********************************************
课 堂实验二
>>> import pygame
>>> print dir(pygame)
>>> print dir(pygame.Rect)
>>> print help(pygame.Rect)

例 如:使用print dir(pygame.Rect)得到以下信息:
['__class__', '__cmp__', '__coerce__', '__copy__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__', '__len__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__safe_for_unpickling__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'bottom', 'bottomleft', 'bottomright', 'center', 'centerx', 'centery', 'clamp', 'clamp_ip', 'clip', 'collidedict', 'collidedictall', 'collidelist', 'collidelistall', 'collidepoint', 'colliderect', 'contains', 'fit', 'h', 'height', 'inflate', 'inflate_ip', 'left', 'midbottom', 'midleft', 'midright', 'midtop', 'move', 'move_ip', 'normalize', 'right', 'size', 'top', 'topleft', 'topright', 'union', 'union_ip', 'unionall', 'unionall_ip', 'w', 'width', 'x', 'y']

信息给出了Pygame的模块Rect包含的函数、需要 的变量和子类。这样你就知道怎样使用这个模块,例如由Rect创建的矩形面积有bottonleft、bottonright,就是左按钮、右按钮,那么 跟按钮绑定的动作就是可引用的。面向对象包含的封装就是把对象的性质和动作封装在一个类里面。

如果使用 help(pygame.Rect)得到信息如下:
Help on class Rect in module pygame:

class Rect(__builtin__.object)
| The rectangle object is a useful object
| representing a rectangle area. Rectangles are
| created from the pygame.Rect() function. This routine
| is also in the locals module, so importing the locals
| into your namespace allows you to just use Rect().
|
| Rect contains helpful methods, as well as a list of
| modifiable members:
| top, bottom, left, right, topleft, topright,
| bottomleft, bottomright, size, width, height,
| center, centerx, centery, midleft, midright, midtop,
| midbottom.
| When changing these members, the rectangle
| will be moved to the given assignment. (except when
| changing the size, width, or height member, which will
| resize the rectangle from the topleft corner)
|
| The rectstyle arguments used frequently with the
| Rect object (and elsewhere in pygame) is one of
| the following things.
… …
这 些信息告诉我们库类Rect能为我们作些什么工作,它创建一个矩形的面积把Sprite创建的对象就是图像放在里面等等。
********************************************

我 们在注释里强调了三次出现blit( )函数,所以这个函数对于理解游戏代码是个关键!第一个blit()的语法是background.blit(text,textpos),即把文本 text拷贝在text的位置textpos上,并把textpos拷贝在background上;第二个blit()的语法是 screen.blit(background,(0,0)),是把有了文本的background拷贝在screen上;第三个 screen.blit(background,(0,0))把上面刚创建、并拷贝在background上的游戏模拟对象fist和chimp再拷贝到 screen上;还有要注意的是,每个blit()后面都跟随一个flip(),上面在简单例子里我们已经介绍了英语flip的意义,这是要更新画面,动 画就是每一个循环给游戏对象一个新的位置,然后用flip()使得动画不断翻转,得到运动的感觉。而语句clock.tick(60)是由创建游戏对象的 部分里的clock = pagame.time.Clock()语句对象化得到的,这个对象告诉游戏脚本按照每秒60桢的速度更新屏幕。

PyGame的库类介绍

Pygame的类库:

Cdrom || Cursors || Display || Draw || Event || Font || Image || Joystick || Key || Mixer || Mouse || Movie || Music || Overlay || Pygame || Rect || Sndarray || Sprite || Surface || Surfarray || Time || Transform

这 些库类的功能可以望文生义,如Crom是处理光盘的类,Cursors是处理光标的类,Key是处理键盘的类,Joystick是处理游戏操纵杆的类, Mouse是处理鼠标的,而Music显然是处理音乐的。等大家有了一些基础之后就应该仔细地研究这些类库,熟练地掌握他们做起游戏来得心应手,左右逢 源。下面我们将就最常用的加以说明,在上面的样例涉及到的就是最重要的类库。

下面我们将以sprite、Display、Event、 Image等为例说明类库的使用。

网站建设公司