我们一起来游戏 (八)——(AS3零基础做AIR卡牌网游)

jiumiao 发布于 2013/11/19 13:46
阅读 763
收藏 5
不知道大家最近有没有把前面的UI全部画完,有没有感觉到非常痛苦。哈哈~ 要淡定面对惨淡并苦逼画UI的人生。我们今天来点刺激的,来战斗吧!

准备战斗

1. 分析:

  1) 战斗肯定是双方的(除了左右互搏术外),肯定是要有两个对立方队的;
  2) 战斗是要有特效的,比如攻击时候来一个刀光血影什么的;
  3) 受击是要见红的,不管是肿了还是飘血,肯定是红了的。不过你硬说没有的话,我也没有办法;
  4) 战斗是要有顺序的,不可能都见红了,还没有攻击到,对不?有特殊功能,用意念攻击啥的我们就不考虑了。

大概就这4点,我们要考虑进去,那么我们来实现它吧~

2. 战斗个体:

就我们游戏而言,战斗个体就是一张又一张的卡牌了,有血条,有攻击动作,有受击动作,有声音等等的元素组成。所以可以这么玩:

public final class BattleItem extends Sprite
{
    // 首先定义必要的显示对象
    private var _icon:ICON; // ICON 是一个内部类,只是将border和body结合在一起的可视对象
    private var _blood:ProgressBar; // 血条了
    private var _inBlood:Label; // 这就是飘红了
    private var _attack:ImageLoader; // 攻击特效了
    // 我们暂时没有受击特效的图片,受击只是一个简单的颤抖动画就可以了

    // 有两个比较重要的getter和setter属性
    private var _index:int; // 个体在方阵中的位置
    private var _data:Object; // 数据
    // ...... 省略其它getter和setter

    // 三个重要的方法

    // 攻击动画的方法
    public function attack(callback:Function = null, type:String = "normal", id:Number = NaN):void
    {
        // callback 是一个方法的名称,意指如果攻击动画结束后,继续需要做什么,这个是实现,顺序播放的重要参数
        // type 和 id 是特指攻击的特效是什么的,如果type为"skill",id才会起作用

        // ... 省略具体的实现
    }

    // 受击动画的方法
    public function affected(lower:Number, blood:Number, callback:Function = null, type:String = "normal", id:Number = NaN):void
    {
        // lower 是本次受击减少的血量
        // blood 是现在的血条进度,值的范围在0~1之间
        // callback,type 和 id 跟attack(...); 方法中表达的意思一致

        // ... 省略具体的实现
    }

    // 抖动动画
    private function jitter(callback:Function):void
    {
        // 借助Starling的juggler和tween实现的一系列序列帧动画
    }
}
[code]

这样一个具体的个体就实现好了,下面我们看看如何让它归到方阵中。

3. 战斗方阵:

特别指出:需要一个标志位来确定方阵和如何根据位置来获取战斗个体。剩下的比较简单:

[code]
public final class BattlePart extends Sprite
{
    // 这个就是标志位了
    private var _camp:String = "our"; // 省略getter和setter方法

    public function getItem(index:uint):BattleItem
    {
        // 根据位置来获得具体的战斗个体
    }
}


实现的过程中,为了偷懒,一次性初始化了9个个体,并且visible掉了个体,在有位置说明的时,让个体的visible=true了。这种方法并不是推荐,更优方法是,根据位置实时创建个体,这样可以减少创建个体的个数,增加一点点效率。

4. 来战斗吧:

既然战斗了,肯定要有战斗的场地了,so~ 我们先来苦逼的构建这个场地(具体就是画UI的过程),来看看如何来战斗:

public final class BattleMediator extends Mediator
{
    // ... 实现具体情况详见源码

    private function step():void
    {
        // 使用递归的方式来完成每一步的动画:攻击动画(BattleItem.attack(...))->受击动画(BattleItem.affected(...))->判断是否有下一步操作,如果有就继续step,没有就showResult方法。基于这样的流程完成整个战斗动画实现
    }
}


5. 来个补偿:

话说,我挑战了你,你是不是要给我点奖励呢?游戏是一样的,也要一个奖励的。不过这个可是有两种情况的,胜利和失败~

在上面提到的step方法中,如果判断已经没有动画可以播放的时候,我们就要显示清算了:

private function showResult():void
{
    // 根据情况显示胜利或者失败UI(前提你要提前画好这两个UI)
}

6. 精细加工:

最后一步了,加工一下,播放个声音,当然声音是和背景音乐不能冲突的,需要小小的改造一下SoundController。然后在BattleMediator的step中添加播放声音的事件就可以了(前提是已经在AssetController中对这些音效做了加载)。

具体实现详见代码。

现在我们已经可以听见美妙的揍人声了~~ 我的生涯一片无悔,我想起那天下午夕阳下的奔跑,那是我逝去的青春……(后面省略5W字)

Fire

1. 向怪物Fire

先完成TaskMediator的UI部分,在战斗按钮点击后进行:

private function fireClick_handler(event:TouchEvent):void
{
    // 向服务器发送3个请求,第一个:战斗,第二个:更新状态栏;第三个:更新地图
}

2. 向玩家Fire

回到竞技场AthleticMediator中:

[EventHandler(event = "DeployEvent.DEPLOY_ATHLETIC", properties = "data")]
public function deploy(data:Object):void
{
    // 向服务器发送1个请求,战斗
}

至此我们的《暗黑》桌面版就已经编码完成了。

发布

我们来发布我们的游戏,首先修改编译参数,如图:



如果不添加,好吧~发布后会无法玩的,就为了这个问题我纠结了快3个小时的。具体见StarlingMVC官网这段描述:



再来准备几个图标,大小见Main-app.xml中的<icon/>节点,并修改内容,如图所示:



然后点这个:



弹出这个窗口:



修改一下Base filename,修改一下路径,然后Next,出现这个:



这个是要添加一个证书,如果有,请选择,并填入证书密码,如果没有,请选择Create...,出现:



创建好了,点击OK。这里使用的密码是:123qwe,你可以随便改,返回到上一个界面,选择刚建好的证书,填入密码,在选择Package Contents,如图:



这里注意,要有locales的目录,如果没有,手动将locales目录,复制到Flash Builder自动创建的bin-release-temp对应目录里,最重要的是一定要结束流程,重新点击发布,再次检查,就会有locales。

确定好后点击Finish,再看到有一个***.air文件生成时就成功了,双击安装(AIR文件需要Adobe AIR运行时)即可。

蛋疼的BUG

   AS的桌面版肯定也会有BUG,只不过本人暂时没有测出来(没有经过系统的详细测试),如果您测试出来了,请立马提出指正。谢谢~~

这里需要提醒几个BUG,程序员们都是苦逼的,正所谓BUG虐你千百遍,我待BUG如初恋:

精力的BUG,我们可以无限的打关啊。而且这个BUG有两种情况:
    1 精力虽然有30的上限,没战斗一次,消耗1,但是只要重新登录就又变成30了,我不知道这个是不是服务器故意设置的~~
    2 在尝试刷完30的战斗,预想肯定有个提示框的出现,but奇迹出现了,竟然变成了负数,好神奇啊,而且能继续战斗。顿时让我感觉不会再爱了。
分析产生来源:服务器

道具的BUG,联调过程中,战斗胜利和配置文件中都找到了有关的道具,静态数据也有。但在玩demo时,一直都是“无道具掉落”。后来使劲的研究了一下cocos2dx版的源码,战斗时,有关道具的东西全部注释了。看到这里心里一阵郁闷,纠结,恐慌啊~~
所以AIR版中也没有实现相关部分。
分析产生来源:cocos2dx客户端+服务器

地图的BUG,在解析地图的静态数据的时候,cocos2dx版的地图关卡少了2个。检查了好多遍,可以确定不是静态数据的问题。
分析产生来源:cocos2dx客户端

  这3个BUG算是比较严重的了,其它小的不伤大雅。这里指出并不是说要指责大鸡蛋他们(他们很辛苦的为大家弄出来了很多好东西了),只是引起要换皮的童鞋们的注意。请不要误解原意,也不要曲解原意,谢谢合作。



  至此,我们桌面版的游戏到此就已经完成一个段落了,就看大鸡蛋他们有没有后续版本的更新了。后面大概还有两章,来完成(一)中的承诺,将改变游戏类型。

PS:对大家非常抱歉,最近要练车,马上要考科目二,耽误好长时间。顺便求祝福~~~ 一次性过吧~ 祝福的童鞋们,在考试成功后,如果是女生并在1986年到1989年之间,在你男朋友不介意的情况下,可以请你吃饭,没有男朋友就更好了,嘿嘿~   ;如果是男生,要搞基请 一定不要 找我,但我可以帮你介绍给大鸡蛋,如果不搞基,可以一起喝个小酒啥的~是没有问题的。

下面是完整代码,资源和安装包下载:
代码:    diabloworld-starling-desktop-air.zip   (39.77 MB, 下载次数: 10)  
资源:    资源.zip   (27.93 MB, 下载次数: 120)  

安装包:  DiabloWorld 1.4.air.zip (16.33 MB, 下载次数: 9)


汇总贴链接:http://www.9miao.com/thread-44288-1-1.html


加载中
0
干死it
干死it
顶个,以前也做游戏的,页游,java后端
0
程序员的寂寞
程序员的寂寞
顶个,我也考试
返回顶部
顶部