PHP网页游戏学习之Xnova(ogame)源码解读(二)


Posted in PHP onJune 23, 2014

三、 安装(install/index.php)

这个文件是安装页面,一开始就可以看到定义了两个常量:

define('INSIDE' , true);
define('INSTALL' , true);

因为这两个常量在接下来的代码中总是用到,所以在这里先说明下。INSIDE是用来防止攻击的;INSTALL是用来记录现在是否处于安装游戏的进程中。

接下来Include两个文件:extension.inc和common,这两个都是正宗的php文件。首先extension.inc里面加入了防止攻击的代码,并且把php文件的扩展名隐藏起来,就是这句$phpEx = “php”。那么'common.'.$phpEx其实就是common.php了。

includeLang('install/install');

这句是load语言文件,includeLang()函数声明在includes/unlocalised.php文件中,这个文件中还有很多的小函数。

function includeLang ($filename, $ext = '.mo') {
 global $xnova_root_path, $lang, $user;
 if ($user['lang'] != '') {
 $SelLanguage = $user['lang'];
 } else {
 $SelLanguage = DEFAULT_LANG;
 }
 include ($xnova_root_path . "language/". $SelLanguage ."/". $filename.$ext);
}

函数的功能是个根据用户的所用的语种 include 相应的代码,XnovaTC3版本里面是支持每个用户使用不同的语言的,我使用的版本无此功能。

继续往下,取得当前要显示的页面内容,就是到了安装步骤几了;然后进入一个大的switch。在这之前有一个这样的语句:

$MainTPL = gettemplate('install/ins_body');

Gettemplate()函数同样声明在includes/unlocalised.php文件中,

function gettemplate ($templatename) {
 global $xnova_root_path;
 $filename = $xnova_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl";
 return ReadFromFile($filename);
}

函数的功能是取得一个指定文件的内容,这个指定的文件是这样构成的:

$ugamela_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl";

TEMPLATE_DIR的值是'templates/',TEMPLATE_NAME的值是'OpenGame',那么前面的 gettemplate

('install/ins_body')就是取得templates/OpenGame/install/ins_body.tpl文件中的内容。这样的函数还有几个,大家都要记住,后面会经常用到。

case ‘intro':

一看就应该知道,是说明介绍的页面,不过里面有个我们首次见到的函数parsetemplate(),声明在includes/unlocalised.php文件中,

function parsetemplate ($template, $array) {
return preg_replace('#\{([a-z0-9\-_]*?)\}#Ssie', '( ( isset($array[\'\1\']) ) ? $array[\'\1\'] : \'\' );', $template);
}

函数的功能是利用正则表达式,对$template中的特定字符串(就是由 {} 括起来的内容),用$array的值进行替换,来实现多语言功能。

case ‘ins':

这个分枝是具体安装过程,分成4个步骤页面,由$page变量控制显示哪一个页面。

1. 当$page值为1时,先进行一些错误判断;如果没有错误,就读取 templates/install/ins_form.tpl模板,parse出并构成有服务器地址、数据库名、表名前缀、用户名和密码的页面。安装者输入数据后,点击install进入下一步的流程。

2. 当$page值为2时,取得第一步输入的数据,并尝试连接数据库;如果连接不上数据库则提示错误;连上数据库则继续后续的过程,包括:在config.php文件中写入数据库连接信息;根据includes/databaseinfos.php文件内容创建表结构。

3. 当$page值为3时,判断上一步是否发生错误,没有发生则显示一些信息并parse出创建管理员帐号的表单,进入下一个流程。

4. 当$page值为4时,取得上一步输入的数据,有帐号、密码、email等;一些判断之后创建这个管理员帐号,创建的过程以后注册的时候再详细说明。

至此,安装主要过程就结束了,主要步骤就是这些,代码也不难理解。最后还有一个函数要讲解下,就是display(),声明在includes/function.php文件中,

function display ($page, $title = '', $topnav = true, $metatags = '', $AdminPage = false) {
global $link, $game_config, $debug, $user, $planetrow;
if (!$AdminPage) {
$DisplayPage = StdUserHeader ($title, $metatags);
} else {
$DisplayPage = AdminUserHeader ($title, $metatags);
}
if ($topnav) {
$DisplayPage .= ShowTopNavigationBar( $user, $planetrow );
}
$DisplayPage .= "<center>\n". $page ."\n</center>\n";
// Affichage du Debug si necessaire
if ($user['authlevel'] == 1 || $user['authlevel'] == 3) {
if ($game_config['debug'] == 1) $debug->echo_log();
}
$DisplayPage .= StdFooter();
if (isset($link)) {
@mysql_close($link);
}
echo $DisplayPage;
die();
}

函数的功能是显示普通用户页眉和管理员页眉的区分,是否显示顶部的信息栏等,此函数中还调用了其他函数,如:StdUserHeader()、AdminUserHeader()、ShowTopNavigationBar()和 StdFooter()都不复杂,其实现都是前面介绍过的 parsetempalte()和gettemplate(),这里就不详细说明了。

PHP 相关文章推荐
PHP 常见郁闷问题答解
Nov 25 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
php检测useragent版本示例
Mar 24 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
PHP获取文件相对路径的方法
Feb 26 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
php排序算法实例分析
Oct 17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 #PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 #PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 #PHP
ThinkPHP实现事务回滚示例代码
Jun 23 #PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 #PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 #PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 #PHP
You might like
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
JavaScript链式调用实例浅析
2018/12/19 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
Python与Redis的连接教程
2015/04/22 Python
如何通过python实现人脸识别验证
2020/01/17 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
初中家长评语和期望
2014/12/26 职场文书
小学端午节活动总结
2015/02/11 职场文书
同意落户证明
2015/06/19 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
python 安全地删除列表元素的方法
2022/03/16 Python