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代码
Apr 09 PHP
php中实现记住密码自动登录的代码
Mar 02 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
php 地区分类排序算法
Jul 01 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
php输入流php://input使用浅析
Sep 02 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
PHP实现统计在线人数功能示例
Oct 15 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 数组使用详解 推荐
2011/06/02 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
JS去除右边逗号的简单方法
2013/07/03 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
Python制作简单的网页爬虫
2015/11/22 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
python 中xpath爬虫实例详解
2019/08/26 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
详解python算法常用技巧与内置库
2020/10/17 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
selenium自动化测试入门实战
2020/12/21 Python
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
单位单身证明范本
2014/01/11 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
GO中sync包自由控制并发示例详解
2022/08/05 Golang