c语言编写的小游戏单机游戏都需要什么知识

Unity游戏开发(2)
做单机游戏的时候,制作人突然提了一个“体力系统”的需求。目前的很多游戏无论是网游还是单机,都有体力系统,我想可能是因为平衡玩家而限制游戏玩法或者是怕玩家无限制的玩游戏疲惫的原因吧。不管怎么说,让我们一起来研究一下体力系统应该怎么做。
本来我以为体力系统挺容易的,后来一做才发现并不是很简单。先在网上搜了一下有关体力的系统的设计思路,结果没有搜到相关信息,算了,自己设计吧。
对于单机游戏来说,因为没有联网的服务器验证,所以只能靠获取设备系统的时间来做体力恢复。这样的话,我在candycrash的小游戏中遇到过这种情况:当玩家体力耗尽时,把系统的时间向后调若干小时,那么再进游戏,游戏体力时满的,此时游戏再次用完后 ,仍可以继续往后调时间,体力继续恢复满了。但是,一旦用户把时间调回当前时间,那么倒计时显示的分钟数将计算为先前调时间最长的时间,也就是几百甚至上千上万分钟,要想继续玩只能向后大幅度调时间。这样做可能有些弊端,就是玩家一旦调整时间,会极大的限制玩家。所以经过商议,我确定将最大体力恢复上限设定一个固定值,当超过上限以后,按最大值倒计时,即使玩家向后调了时间,当改回系统时间的时候,仍然可以等待一点时间继续游戏。
体力系统的恢复时间需要涉及到存储,一旦退出游戏,再次进入游戏的时候仍然要显示体力恢复倒计时。我设计的体力恢复时间存储的最小单位是分钟(minute),当然,也可以以秒(second)为单位存储。存储的时间是体力不满时恢复到所有的体力时的时间点(忽略秒),而想到这个存储的内容,基本上也就解决了体力恢复系统的核心问题。
以下例子是以分钟为单位编写的。
1.首先是进入游戏时体力系统的初始化:
&/pre&&pre name=&code& class=&csharp&&&/pre&&pre name=&code& class=&csharp&&public void DealPower(){
//判断是不是第一次进游戏,如果是第一次进游戏那么体力给满格,记录数据
if(!PlayerPrefs.HasKey(&powerMonth&)){
//记录回复满的时间
NoteRecoverDate(DateTime.Now.Month,DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute);
Global.CRole.PowerValue = ConstPreference.MAX_NPC_POINT_COUNT;
RefreshPowerShow();
//如果不是第一次
//1.取出存储的时间(忽略秒)
DateTime dt = new DateTime(DateTime.Now.Year,PlayerPrefs.GetInt(&powerMonth&),PlayerPrefs.GetInt(&powerDay&),
PlayerPrefs.GetInt(&powerHour&),PlayerPrefs.GetInt(&powerMinute&),0);
//2.与当前时间比较
pare(DateTime.Now,dt)&=0){
//当前时间比记录的时间晚:那么此时应该获得满格体力值并且记录当前时间
NoteRecoverDate(DateTime.Now.Month,DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute);
Global.CRole.PowerValue = ConstPreference.PLAYER_MAX_POWER;
RefreshPowerShow();//刷新UI显示
//3.当前时间比记录的时间早:那么看早多长时间(此种情况适用于体力正在恢复,然后退出游戏再进入游戏,体力仍未恢复满时)
DateTime now = new DateTime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute,0);
bool isStop =//做while循环停止的标记
int minute = 1;//恢复满所有的体力需要的所有分钟数
int max = ConstPreference.PLAYER_MAX_POWER*ConstPreference.PLAYER_POWER_RECOVER;//max:设定恢复时间的上限点数乘以恢复一点体力需要的分钟数即最长分钟数
while(!isStop){
pare(now.AddMinutes(minute),dt)&=0){
minute += 1;
//4.当前的时间比记录的时间早minute分钟
if(minute == max){//如果超过了上限则停止。此种情况适用于玩家修改系统时间后改回原系统时间的情况
//4.当前的时间比记录的时间早minute分钟
if(minute == max){
//5.提前的时间超过的下限,此时为零体力零计时,应从最大时间开始计时(此种情况适用于玩家故意调时间引起的特殊情况)
Global.CRole.PowerValue = 0;//玩家体力为0
RefreshPowerShow(ConstPreference.PLAYER_POWER_RECOVER);
//从最大值开始倒计时
Global.CRole.PowerValue = (int)((ConstPreference.PLAYER_MAX_POWER*ConstPreference.PLAYER_POWER_RECOVER - minute)/ConstPreference.PLAYER_POWER_RECOVER);
RefreshPowerShow((ConstPreference.PLAYER_MAX_POWER*ConstPreference.PLAYER_POWER_RECOVER - minute)%ConstPreference.PLAYER_POWER_RECOVER);
以上方法是初始化方法。其中,NoteRecoverDate()方式为存储时间的方法,PlayerPrefs.GetInt(&powerMonth&)是取出保存的月份int值。使用系统的时间,需要添加using System。或者使用System.DateTime.Now来获取时间。在比较时间或者获取差值的时候还可以使用时间的减法来计算。
2.刷新UI显示
&/pre&&pre name=&code& class=&csharp&&&pre name=&code& class=&csharp&&
public void RefreshPowerShow(int minute = 0){
if(powerValue != null){
powerValue.text = Global.CRole.PowerValue.ToString();
if(minute == 0){
//可能是购买体力值,已加满,或者是刚进游戏满格体力
if(Global.CRole.PowerValue &= ConstPreference.PLAYER_MAX_POWER){
if(powerTime != null){
powerTime.text = &00:00&;
powerTimeInt = 0;//与powerTime同步的int值:为0时静止,否则就是119-0的倒计时
isTimeByTime =//暂停与继续的标记,开关
powerTimeInt = minute*60-1;
isTimeByTime =//开启计时器
&/pre&&p&&/p&&pre&
3.增加体力和减小体力都需要重新计算并存储恢复满体力的时间点:
&/pre&&pre name=&code& class=&csharp&&&pre name=&code& class=&csharp&&public bool CostPower(){//返回值为布尔值,用来判断是否还有体力进行游戏
if(Global.CRole.PowerValue &= 0)
//如果当前是满格体力
if(Global.CRole.PowerValue == ConstPreference.PLAYER_MAX_POWER){
Global.CRole.PowerValue -= 1;
//开始倒计时
powerTimeInt = ConstPreference.PLAYER_POWER_RECOVER * 60-1;
RefreshPowerShow();
isTimeByTime =
Global.CRole.PowerValue -= 1;
RefreshPowerShow();
DealSaveData();//重新计算并存储时间
&pre name=&code& class=&csharp&&public void AddPower(int val){
Global.CRole.PowerValue +=
if(Global.CRole.PowerValue & ConstPreference.PLAYER_MAX_POWER){
Global.TipsFormMgr.OpenForm(null,CConstString.Tips_FullPower,false);//公有提示窗口,提示体力超限
Global.CRole.PowerValue = ConstPreference.PLAYER_MAX_POWER;
DealSaveData();//重新计算并存储时间
RefreshPowerShow();
4.倒计时方法
&/pre&&pre name=&code& class=&csharp&&/// &summary&
/// 每秒执行一次.
/// &/summary&
public void RefreshTimeBySceond(){
if(!isTimeByTime){
//暂停游戏
powerTimeInt = 0;
if(powerTime != null){
powerTime.text = &00:00&;
//体力恢复进程
if(powerTime != null){
powerTime.text = SwitchIntToString(powerTimeInt);
if(powerTimeInt == 0){
//计时完成,体力值+1
Global.CRole.PowerValue += 1;
if(powerValue != null){
powerValue.text = Global.CRole.PowerValue.ToString();//把int转换成时间字符串即“00:00”
//如果体力值已满,那么暂停计时
if(Global.CRole.PowerValue &= ConstPreference.PLAYER_MAX_POWER){
isTimeByTime =
//如果体力值未满,那么继续计时
powerTimeInt = ConstPreference.PLAYER_POWER_RECOVER * 60-1;
powerTimeInt -= 1;
5.恢复体力的计算与存储
//存储体力恢复满的时间点:只有在消耗体力或者增加体力时才调用此方法
void DealSaveData(){
//计算剩余分钟数
int leftmin = (ConstPreference.PLAYER_MAX_POWER - Global.CRole.PowerValue)*ConstPreference.PLAYER_POWER_RECOVER
- (int)((ConstPreference.PLAYER_POWER_RECOVER*60 - powerTimeInt)/60);
if(leftmin&=0){
NoteRecoverDate(DateTime.Now.Month,DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute);
DateTime dt = DateTime.Now.AddMinutes(leftmin);
NoteRecoverDate(dt.Month,dt.Day,dt.Hour,dt.Minute);
以上就是我设计的简单的单机游戏的体力系统,欢迎大家提出意见和不足,谢谢!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3569次
排名:千里之外}

我要回帖

更多关于 易语言编写游戏辅助 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信