仿《雷霆战机》飞行射击掌游开发–游戏对象

须求分析

   
既然大家做的是手淫游戏,那须要有怎么着游戏对象啊?观望一下底下这么些游戏中的图片。首先,主演当然是飞机,有玩家飞机、两侧的僚机、敌机。飞机上有所各式各类的枪杆子:普通子弹、导弹、激光等。借使只是稳步的飞行器手淫,子弹没有变化,飞机也绝非转变,那也太单调了。所以大家还扩展了道具,当敌机被击落时,会有一定的概率爆出宝石和其余种种奖励道具,比如武器升级、战机暴走、修复护甲、超级必杀、量子护盾。

图片 1

咱俩来计算一下:

  • 飞机有怎样基本效能?    飞行、射击、爆炸;
  • 飞机有何样基本属性呢? 生命、攻击、碰撞体、外观;
  • 飞机有啥类型呢?    
    • 玩家飞机:具有独特的支配方法、具体左飞、右飞、暴走变形等特殊的外观;
    • 僚机:玩家飞机的专属,生命:无敌,与玩家飞机共存亡;
    • 必杀僚机:无敌,飞行动作一定:从人间飞出来,射击n秒,往下飞走;
    • 敌机:从显示器的某处自动飞出,不射击大概电动射击;
    • 高等敌机:从显示器的某处自动飞出,飞到固定地点后,变形,然后射击;
    • boss:开端动作与高档敌机一样,可是boss辅助数次变形,当血量少于某多少个定位的值后,会触发boss的变形,每变形1回,攻击力增强。当boss击落后,会生出巨大的爆裂。
  • 武器有啥基本效能?    射击、爆炸;
  • 枪杆子有怎样基本天性呢? 攻击、碰撞体、外观;
  • 枪杆子有哪些项目呢?    
    • 散弹:各样平行、开花子弹;
    • 自定义子弹:以往详述;
    • 跟踪导弹:始终会跟踪近年来的敌机飞行,直至击落敌机;
    • 激光:矩形形状,加害值按接触的岁月测算;
  • 道具有何样基本成效?    飞行;
  • 道具有哪些基本性子?    道具类型、分歧的道具对飞机产生分化的效益;
  • 道具有哪些类型呢?
    • 宝石:相当于钱,能够用来解锁、购买任何武装
    • 武器升级:使玩家飞机的枪炮升高二个品级;
    • 战机暴走:使玩家飞机的火器进步到最高阶段;
    • 修复护甲:恢复生机玩家飞机必定的生命值;
    • 极品必杀:从荧屏底边飞出一个了不起的僚机,发出超级激光,秒杀显示屏中的全数敌机(如下图);
    • 量子护盾:给玩家飞机扩充2个护盾,该护盾能抵挡二次子弹的抨击,同时,护盾被打中时能释放出特殊的能量,能将显示器中保有的子弹都转载为宝石;

图片 2

“一流必杀”的清屏效果是否觉得很爽!!

右下角铜绿色飞机的外侧是否有一圈半透明的青白圆环?这正是量子护盾。

③ 、在cpp工程中加进检查指纹的函数,比较从java中拿到的md5值与大家团结的md5是不是同样,尽管差别等,则觉得指纹错误,再次回到false

 

   
这里要求重点关注一下BulletGroup和Bullet。大家得以把BulletGroup理解成饱含弹匣的一把枪,把Bullet理解成单颗子弹。枪(BulletGroup)内包含了n发子弹(Bullet)。枪(BulletGroup)的两样,决定了子弹(Bullet)的外观、子弹的开头地点和航空轨道分歧、子弹发射的作用和同时射出的数量不等。 所以,我们在BulletGroup中放了vector<Bullet>那几个成员变量,这是3个简化的“子弹池”,当必要发出子弹时,从池中赢得子弹,当子弹爆炸或许飞出显示屏时,子弹要求回收,放回池中。

 

转发请注解:http://www.cnblogs.com/thorqq/p/5645170.html 

下一篇,大家将整合代码讲述种种游乐对象。

本游戏正式开放源代码啦~~

转发请表明:http://www.cnblogs.com/thorqq/p/5645170.html 

 

品类首页:https://www.oschina.net/p/raiden

 

类设计

好了,供给分析的差不离了,我们今后来抽象一下这么些游戏对象,如下图:

图片 3

  •    
    首先,大家对具备的游乐对象开始展览剖析,总括出GameObject这么些派生自Pepsi-Cola的类,当中饱含了多少个常用的主意:pause()/resume()/getBody()/setBody(),

    • pause()/resume():使游戏对象暂停、继续运动。这四个函数与Node中的pause()/resume()不一样,那四个函数在使游戏对象自作者暂停/苏醒的同时,会使拥有的子节点都调用一次pause()和resume();
    • getBody()/setBody():为简单起见,大家从未选择物理引擎,而是大家定义碰撞体。每五个娱乐对象都有3个碰撞体,当差别游戏对象的碰撞体爆发相撞时,会爆发分裂的效率,例如爆炸、爆发奖励等等。那里的body是二个简练矩形,大家协调定义矩形的分寸和周旋于百事可乐的地点。
  •    
     接着,飞机(Aircraft)、武器(BulletGroup/Bullet)、道具(Reward)都一而再自GameObject。

本文将介绍3个简练的防破解版的点子,希望能跟大家一起商讨学习。

    bool checkFingerprint()
    {    
        //check fingerprint
        JniMethodInfo minfo;
        bool isHave = JniHelper::getStaticMethodInfo(minfo,
            "org/cocos2dx/cpp/MyApplication", "getFingerprintMd5", "()Ljava/lang/String;");
        //没有在java中找到getFingerprintMd5这个函数
        if (!isHave)
        {
            return false;
        }
        else
        {
            //调用getFingerprintMd5  
            jstring jstr = (jstring)minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
            std::string ret = JniHelper::jstring2string(jstr);

            Analytics::getInstance()->event(AnalyticsEvent::FingerPrint, ret.c_str());
            GameData::getInstance()->setValue(GAMEDATA::FINGER_PRINT, ret);

            //这里就是上面我们在keytool命令后保存的md5指纹。为增加破解难度,这里最好要对字符串进行加密处理
            std::string a = "3f8e70eea5bedb593525623c0c47822f";
            //判断指纹是否一致
            if (a != ret)
            {
                return false;
            }
        }

        return true;
    }

图片 4

② 、在android工程中新建MyApplication.java,增添如下代码获取apk包签名的md5值。

将执行结果中MD5后边的一长串字符串去掉冒号并改为小写后保存下来(在那里是:3f8e70eea5bedb593525623c0c47822f)。

private static String FingerprintMd5 = "";

    public static String getFingerprintMd5()
    {
        return FingerprintMd5;
    }

    public Signature[] getRawSignature(Context context) {

        PackageManager pkgMgr = context.getPackageManager();
        PackageInfo info = null;
        try {
            info = pkgMgr.getPackageInfo(getPackageName(),
                    PackageManager.GET_SIGNATURES);
        } catch (PackageManager.NameNotFoundException e) {
            return null;
        }
        if (info == null) {
            return null;
        }
        return info.signatures;
    }

    private static String FingerprintMd5 = "";

    public String stringToMD5(byte[] string) {  
        byte[] hash;  

        try {  
            hash = MessageDigest.getInstance("MD5").digest(string);  
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();  
            return "";  
        } catch (Exception e) {  
            e.printStackTrace();  
            return "";  
        }  

        StringBuilder hex = new StringBuilder(hash.length * 2);  
        for (byte b : hash) {  
            if ((b & 0xFF) < 0x10)  
                hex.append("0");  
            hex.append(Integer.toHexString(b & 0xFF));  
        }  

        return FingerprintMd5 = hex.toString();  
    }  

   @Override
    public void onCreate() {

        //MD5 fingerprint
        stringToMD5(getRawSignature(this)[0].toByteArray());

        super.onCreate();
    }

代码库https://git.oschina.net/thorqq/RaidenFree

   
近期最广泛也是最简易的单机游戏破解方法正是一贯反编写翻译apk,然后搜索三流年营商的计费函数调用代码,然后狠毒的将支付结果强制改为成功,然后用破解者自身的keystore打包宣布。上面大家要介绍的防破解方法,就是检查keystore是不是被撤换,一旦发现更换,就径直退出行戏。

④ 、在上层业务逻辑中调用checkFingerprint(),假设回到false,则提醒用户并直接退出游戏。

一 、执行命令keytool -list -v -keystore thorqq.keystore ,
其中thorqq.keystore改成你的秘钥库文件名。

 

Win版试玩http://pan.baidu.com/s/1hsbrUug

发表评论

电子邮件地址不会被公开。 必填项已用*标注