美高梅4688.com仿照《雷霆战机》飞行射击手游开发–防破解

转载请注明:http://www.cnblogs.com/thorqq/p/5645170.html 

正文将介绍一个简单的防破解版的方法,希望能同大家并谈论学习。

项目首页:https://www.oschina.net/p/raiden

 

需分析

   
既然我们开的是打飞机玩,那得来安游戏对象呢?观察一下底这玩被之图纸。首先,主角当然是飞机,有玩家飞机、两侧的僚机、敌机。飞机上装有各式各样的兵器:普通子弹、导弹、激光等。如果仅仅是雷打不动的飞机于飞机,子弹没有转,飞机也不曾生成,那也最为干燥了。所以我们尚增了道具,当敌机被击落时,会起早晚之几引领爆出宝石和其余各种奖励道具,比如武器升级、战机暴走、修复护甲、超级必杀、量子护盾。

美高梅4688.com 1

咱来总一下:

  • 飞机来什么样基本功能?    飞行、射击、爆炸;
  • 飞机有怎么样基本性能也? 生命、攻击、碰撞体、外观;
  • 飞机出哪路也?    
    • 玩家飞机:具有独特的操纵方式、具体左飞、右飞、暴走变形等新鲜的外观;
    • 僚机:玩家飞机的附属,生命:无敌,与玩家飞机共存亡;
    • 必然杀僚机:无敌,飞行动作一定:从下方飞出去,射击n秒,往下飞活动;
    • 敌机:从屏幕的某处自动飞起,不开要机关开;
    • 高档敌机:从屏幕的某处自动飞出,飞至定点位置后,变形,然后放;
    • boss:初始动作和高档敌机一样,不过boss支持多次变形,当血量少于某几乎只稳定的值后,会触发boss的变形,每变形一涂鸦,攻击力增强。当boss击落后,会起巨大的爆炸。
  • 兵来怎样基本功能?    射击、爆炸;
  • 枪杆子来什么基本性也? 攻击、碰撞体、外观;
  • 武器来安项目也?    
    • 散弹:各类平行、开花子弹;
    • 自从定义子弹:以后详述;
    • 跟踪导弹:始终会跟最近底敌机飞行,直至击落敌机;
    • 激光:矩形形状,伤害值按点的流年计算;
  • 志有何等基本功能?    飞行;
  • 道有什么样基本性?    道具类型、不同的道具对飞机有不同之意;
  • 道有哪些路也?
    • 宝石:相当给钱,可以用来解锁、购买外装备
    • 兵升级:使玩家飞机的兵提高一个号;
    • 战机暴走:使玩家飞机的刀兵提高到嵩等级;
    • 修复护甲:恢复玩家飞机必定的生命值;
    • 顶尖必杀:从屏幕底边飞起一个英雄的僚机,发出超级激光,秒杀屏幕被的备敌机(如下图);
    • 量子护盾:给玩家飞机增加一个护盾,该护盾能抵挡一不善子弹的抨击,同时,护盾被击中时能够自由出不同寻常的能,能用屏幕中具有的枪弹还转发为宝石;

美高梅4688.com 2

“超级必很”的清屏效果是休是觉得特别爽!!

右侧下比赛金黄色飞机的以外是匪是出同等绕半晶莹剔透底蓝色到环?这虽是量子护盾。

   
目前极其广泛也是极简便易行的单机游戏破解方法就是直倒编译apk,然后搜索三杀运营商的计费函数调用代码,然后粗暴的用开结果强制改变吧成功,然后据此破解者自己之keystore打包发布。下面我们而介绍的防范破解方法,就是反省keystore是否给转移,一旦发觉更换,就一直退出游戏。

类设计

哼了,需求分析的差不多了,我们现来抽象一下这些游戏对象,如下图:

美高梅4688.com 3

  •    
    首先,我们本着所有的游乐对象开展解析,总结发生GameObject这个派生自Sprite的类,其中饱含了几只常因此的章程:pause()/resume()/getBody()/setBody(),

    • pause()/resume():使打对象暂停、继续运动。这半个函数和Node中之pause()/resume()不同,这有限单函数在如打对象自我暂停/恢复的还要,会使所有的子节点都调用一通pause()和resume();
    • getBody()/setBody():为简易起见,我们无行使物理引擎,而是我们定义碰撞体。每一个游玩对象都起一个碰撞体,当不同游戏对象的碰撞体发生碰撞时,会起不同的效力,例如炸、产生奖励等等。这里的body是一个简短矩形,我们和好定义矩形的轻重以及对立于Sprite的岗位。
  •    
     接着,飞机(Aircraft)、武器(BulletGroup/Bullet)、道具(Reward)都延续自GameObject。

 

 

   
这里用重点关注一下BulletGroup和Bullet。我们好将BulletGroup理解成含蓄弹匣的一把枪,把Bullet理解成单单颗子弹。枪(BulletGroup)内包含了n发子弹(Bullet)。枪(BulletGroup)的例外,决定了子弹(Bullet)的外观、子弹的开始位置以及飞行轨道不同、子弹发射的频率和以射来的多少不等。 所以,我们于BulletGroup中加大了vector<Bullet>这个成员变量,这是一个简化的“子弹池”,当需要发出子弹时,从池子中获子弹,当子弹爆炸或者意料之外起屏幕时,子弹需要回收,放回池中。

 

转载请注明:http://www.cnblogs.com/thorqq/p/5645170.html 

产一致首,我们拿结合代码讲述各种游乐对象。

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

将执行结果中MD5后面的一样增长串字符串去丢冒号并转吧小写后保存下去(在此间是:3f8e70eea5bedb593525623c0c47822f)。

美高梅4688.com 4

2、在android工程中初建MyApplication.java,增加如下代码获取apk包签名的md5价。

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();
    }

3、在cpp工程中加进检查指纹的函数,比较起java中获之md5值与我们团结一心之md5是否相同,如果不相同,则以为指纹错误,返回false

    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、在上层业务逻辑中调用checkFingerprint(),如果回去false,则提醒用户并直退出娱。

 

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

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

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

发表评论

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