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下使用无限生命期Session的方法
Mar 16 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
PHP 危险函数全解析
Sep 09 PHP
php垃圾代码优化操作代码
Aug 05 PHP
PHP高自定义性安全验证码代码
Nov 27 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
php简单统计中文个数的方法
Sep 30 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 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代码
2010/02/16 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
jquery实现加载等待效果示例
2013/09/25 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
JavaScript简介
2015/02/15 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
python批量生成本地ip地址的方法
2015/03/23 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
Python 忽略warning的输出方法
2018/10/18 Python
python实现朴素贝叶斯算法
2018/11/19 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
大学生毕业的自我鉴定
2013/11/13 职场文书
创业计划书如何吸引他人眼球
2014/01/10 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
环境建设实施方案
2014/03/14 职场文书
李强为自己工作观后感
2015/06/11 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书