申请了一个国外的无限空间

准备了一个国外空间~购买时间是1年,先看看服务怎样吧。
访问速度比国内慢个5倍这样,可以接受啦,稳定的话,就专门放一些demo上去好了。
国内的空间管理起来太麻烦了,迁移也非常麻烦。每次更换空间提供商,就需要重新备案什么的。实在受不了这折腾。
等这个空间到期,而国外空间稳定的话,就搬去国外空间了。
到时候换个VPS吧!

国外空间的地址是 http://www.aoicon.in

啊啊~周一了《未来日记》的熟肉出了,果断去看之~

AS通过PHP后台调用用户[登录]和[注册]功能

今天给网游加上用户登录和注册的数据库验证机制

AS编译的swf是不允许直接访问或修改硬盘文件的(共享对象和上传下载功能例外,编译成AIR RUNTIME可以彻底解决此问题) 因此必须借用外部方法比如js,asp,php,asp.net等。

AS验证数据类: 使用类似amfphp的方式,建立一个控制类Command.php 然后由Command.php判断该调用哪些类(Login.php 或 Register.php)来解析数据

package com.client
{
    import com.Config;
   
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;

    public class DataBaseCheck extends EventDispatcher
    {
        public static const SUCCESS="success";
        public static const FAILURE="failure";
       
        private var _userName;
        private var _passWord;
        private var _login:Boolean;
       
        private var myLoader:URLLoader;
        private var myXML:XML;
       
        public function DataBaseCheck(userName:String,passWord:String,Login:Boolean=true)
        {
            _userName=userName;
            _passWord=passWord;
            _login=Login;
            init();
        }
       
        private function init()
        {
            myLoader=new URLLoader();
            myLoader.dataFormat=URLLoaderDataFormat.VARIABLES;
            myLoader.load(new URLRequest(Config.WWWROOT+"Command.php?userName="+_userName+"&passWord="+_passWord+"&isLogin="+_login));
            myLoader.addEventListener(Event.COMPLETE,onCom);
            myLoader.addEventListener(IOErrorEvent.IO_ERROR,onError);
        }
       
        private function onError(e:IOErrorEvent)
        {
            this.dispatchEvent(new Event(FAILURE));
        }
       
        private function onCom(e:Event)
        {
            var data:String=e.target.data["result"];
            myLoader.removeEventListener(Event.COMPLETE,onCom);
            myLoader.removeEventListener(IOErrorEvent.IO_ERROR,onError);
            myLoader=null;
           
            if(data=="true")
            {
                this.dispatchEvent(new Event(SUCCESS));
            }else{
                this.dispatchEvent(new Event(FAILURE));
            }
        }
    }
}

PHP命令中心
Command.php

<?php
include ("Login.php");
include ("Register.php");

$userName = $_GET["userName"];
$passWord = $_GET["passWord"];
$isLogin = $_GET["isLogin"];

if ($isLogin == "true") {
    $command = new Login($userName, $passWord);
} else {
    $command = new Register($userName, $passWord);
}
$command->check();
?>

继续阅读“AS通过PHP后台调用用户[登录]和[注册]功能”

堆栈上溢的问题

周末给数据包对象加了一个对战信息的字段后,有几率的出现【堆栈上溢】或者是 【RangeError: Error #2006: 提供的索引超出范围。】 的错误。

具体结果2种:

1.数据包该字段的数值实际为其他字段的字段名或其他字段的数值。

2.直接报错,程序退出。

这里以一个4字节长度的数值字段举例:发送的数据包中的某个字段中的数据本应是4个字节长度的,但是该字段由于某些原因没有被赋值,实际为null。既:数据包解析器要解析4个字节长度的数据,但是实际数据为null,长度不为4. 这时数据包解析器认为当前的数据没有解析完毕,开始等待新的数据流,而新的数据流实际又是另一个数据包中的数据。这时就会产生递归死循环。

实际上这其实是一个人为的可以避免的错误。首先给 Object对象的动态属性赋值是一个逃避编译器的错误校验的,因此编译程序的时候编译器无法检测到Object对象的某一属性值为null。解决方法就是给数据包也编译一个反射类,并判断个属性是否为null。

ps:突然觉得做一个ui管理器和event管理器很有必要啊。晚上搞定它吧。

某传说中的网游对战系统完成了耶

中午吃了烤肉,晚上果断有力量了有木有!!!

然后把网游对战系统部分完成了。由于手头没有攻击招数这部分的模型。所以以文字对战的形式来实现。

具体过程是:点击一个玩家发送对战请求,对方玩家弹出提示(是否接收对战),选择 是 ,发起对战者2次确认后,对战开始,同步对战信息,对战结束。

以下是同步对战信息的java服务端代码:

// 广播对战信息
        if(myHashMap.get("Event").equals(this.BATTLE_START)){
            Person p1=new Person();
            Person p2=new Person();
            p1.userName=selfUser.target;
            p2.userName=selfUser.initiator;
            nameFight myFight=new nameFight(p1, p2);
            String battleInfo=myFight.Fight();
           
            while (iterator.hasNext()) {
                MyThread thread = iterator.next();
                if (thread.getName().equals(selfUser.initiator) || thread.getName().equals(selfUser.target)) { //仅向对战的双方主动推送对战信息
                    HashMap<String,Object> myObj = new HashMap<String,Object>();
                    myObj.put("Event", this.BATTLE_START);
                    myObj.put("Target", selfUser.target);
                    myObj.put("Initiator", selfUser.initiator);
                    myObj.put("BattleInfo", battleInfo);

                    thread.sendObj(myObj, thread.client);
                }
            }
            return;
        }

战锤40k-星际战士通关啦

昨天终于吧战锤40k-星际战士通关了的说~ 话说手头还有好多游戏要通关啊。

神马《爱丽丝-疯狂回归》,《Dirt3》,《死亡空间3》 =。= 玩的都把手头的项目给暂停了。

貌似 苍穹之法芙娜 的中文字幕也出了!!! 啊啊,好多东西要玩想看啊。

好吧~这周末把闲置的项目都试着继续完善吧:

1.Unity3D 的赛车游戏demo

2.网游对战系统

3.一些莫名其妙的东西

只是个日记罢了~

先放个比较热血的PV

然后放一个目前的进度裁图 可以算是经过了 alpha 到达了milestone的阶段了啊
准备把人物模型换成英雄传说系列的。 毕竟大话西游的人物太多人认识了,会被人误解的,这样不好不好~

多人游戏的场景加载的思考

原本完全没想到这些,无意中在某博客中看到的demo.才突然顿悟。写下自己的思考,以后有机会来实现。

多人游戏场景加载的一般方式是:

打开游戏,出现一个进度条。表示当前游戏场景的加载进度,加载完毕后,进入游戏。

某博客中的场景加载方式是:

打开游戏,无需等待,直接进入游戏。游戏场景在游戏中分块加载完毕。即玩家可以看到地图区块慢慢填满屏幕的效果。

我思考的场景加载方式是:

以玩家所在位置做放射状地图加载,这种方式可以比较容易的实现卡马克卷轴算法。

要实现的方式并不复杂。首先,将地图场景进行切块。然后根据行列值存进xml的节点中。

进入游戏后,根据玩家所在的地图坐标,算出玩家所在的行列值。然后去xml列表中找到对应的地图区块,并以此为原点放射性的加载周围的地图。

实现卡马克卷轴算法的方式是:玩家与屏幕边距的差值/地图区块的大小。算出玩家到地图四周个需要几行,几列。 在放射性加载地图区块的函数中,用一个递归循环去加载区块到边沿。这样遍实现了,玩家所能看到的区域就是所需绘图的区域,玩家看不见的区域完全不进行绘图。这样能提高地图的加载速度和fps.

嘛~以上! 顺便再次哀悼下:乔帮主,您走好~

45度游戏地图编辑器0.1Beta

之一直在做的45度网游,客户端基本完成了。 但是地图一直都是写死的,编辑起来很麻烦。于是心血来潮的,花了1个晚上写了个简易的地图编辑器。

这是测试版第一版,先放出来给大家看看

使用方法:
点击网格,会弹出对话框,选择对应的颜色填充。之后 点击 右上角的“导出” 即可保存地图文件。

“导入” 可以将之前编辑过的文件进行复原并继续编辑。

这是一份自己乱画的一张地图: 点我下载???? (有兴趣的朋友可以下载下来后,导入地图编辑器查看效果)

下一版将添加不规则贴图地图编辑功能,敬请期待吧!