最近一时心血来潮做了个挂机小游戏,现在总结一下主要技术

最核心的就是超大数字的计算,在挂机游戏中动不动就是亿亿级数字的计算,已经完全超出普通的类型的长度。但是c#提供BigInteger可以进行超大数字的计算,非常方便。但注意不能进行浮点数的运算。

使用时可以将string转化为BigInteger 进行加减乘除运算,计算完后转换回string方便序列化以及储存 。

using System.Numerics;
string s="1000000000000000000000000000000000";
BigInteger money= BigInteger.Parse(s)+BigInteger.Parse(s);
s=money.ToString();

转换回字符串后可以方便处理在游戏中的数值显示。如在我的游戏中的数值限定最多显示7位数,其余用10的次方表示。

public static string ConvertNum(BigInteger b)
    {
        int num = b.ToString().Length - 7;
        string s = "";
        if (num>1)//9位数开始
        {
            s = b.ToString().Substring(0, 6)+"*"+"10^"+num;
        }
        else
        {
            s = b.ToString();
        }
        return s;
    }
    //10000000000=10000000*10^2;

手机切换回游戏界面计算收益以及离线收益计算

在手机挂机游戏过程中,经常会切换到其他应用界面,回到游戏界面挂机数值也应该会增加。所以我们应该记录离开界面时的时间,回到界面时获得当前时间和之前记录时间的差值,用来计算游戏在后台时收益。
在安卓中我们可以使用OnApplicationPause函数进行应用暂停时的调用。

float gameHTtime = 0;
   float startHTtime = 0;
private void OnApplicationPause(bool pause)
    {
        if (pause)
        {
            //将玩家游戏切后台的运行时间检测到
            startHTtime = Time.realtimeSinceStartup;
            Debug.Log("离开游戏");  //  返回游戏的时候触发     执行顺序 1
        }
        else
        {
         
          //回到前台我们需要将后台的倒计时方法关闭掉
          //将游戏的运行总时间检测到   使用总的游戏时间-玩家的切入后台的时间  就是玩家在切后台的总时间
          gameHTtime = Time.realtimeSinceStartup - startHTtime;
          //BigInteger profit=10000000000000000000000000;
          //money += profit* (int)gameHTtime;
          Debug.Log("返回到游戏 刷新用户数据");  //  返回游戏的时候触发     执行顺序 2   
        }
    }

还有一种情况就是游戏在后台时被退出了,我们可以使用OnApplicationQuit函数进行退出时的调用,进行后台收益的计算,前提是在 OnApplicationPause中已经记录了离开界面时的时间。

private void OnApplicationQuit()
    {    
    gameHTtime = Time.realtimeSinceStartup - startHTtime;
     //BigInteger profit=10000000000000000000000000;
     //money += profit* (int)gameHTtime;
    //这里可以保存游戏
    }

离线收益计算是挂机游戏中非常重要的一环,我选用的方案是计算退出游戏的时间与再次打开游戏的时间的差值,进行离线收益计算

最后可以看看我做的小游戏是否是自己想要的效果
游戏页面