游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: samba

程序运行中暂停的函数?

[复制链接]

10

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2003-11-3 15:21:00 | 显示全部楼层

Re:程序运行中暂停的函数?

哇,太感谢了
又让我学了不少实际的东西

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20484
发表于 2003-11-4 01:17:00 | 显示全部楼层

Re:程序运行中暂停的函数?

暂停功能无非就是设置一个状态机,如果牵涉到多线程,感觉有些杀鸡用牛刀,而且牛刀未必合适于杀鸡。
我们游戏本身实际上就是由很多状态机组成,比如当前的游戏状态是开始菜单,还是游戏中,还是游戏结束,都是由状态来表示,只要多个暂停状态,我们将其处理就行了。
switch( 状态 )
{
    case 开始菜单:
        break;
    case 游戏进行:
        break;
    case 游戏暂停:
        break;
    case 游戏技术:
        break;
    default:
        break;
}


to sjinny:
你的想法不错,不过感觉有些危险,假设当前now指向的函式正在执行,同时又是由now的函式体修改自身函式的起始地址,如果函式不立即返回而继续通过now指针来进行代码访问,这时候会不会出现问题?


最后,想说说我对代码开发的看法,写了几年的游戏程式,感觉看起来最先进的技术未必是作为项目开发最好的选择,高技术往往带来更复杂的调试,同时Bug就更难调整,特别在将来游戏开发必定是多人协作的情况下,尽量避免Bug的出现则更为重要;很高兴能看到大家那么热烈的讨论,希望大家都能从中获益,共同提高!

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2003-11-5 18:08:00 | 显示全部楼层

Re:程序运行中暂停的函数?

sea_bug,我现在觉得使用那样的状态机来写游戏不是很好,似乎代码复用很困难,要调整游戏运行的过程也不好弄~~
我觉得可以使用多线程+队列通信。比如渲染一个线程,所有精灵由另一个线程管理,比如渲染时渲染线程会读取需要渲染的精灵的坐标等信息,而精灵管理线程只需要根据游戏的进度来处理精灵的坐标变动等就可以了。

关于暂停的办法,我那样的确有问题,因为改变now指针时原先它所指向的函数还没返回,不知道没有返回值的函数结束时会发生什么事。不过实在不行,可以这样,建立一个指针数组,比如now[],元素个数是两个,使用一个整数变量,比如i(默认值为0),然后:
int i=0;
一开始让now[0]指向game()
让now[1]指向暂停时运行的函数(见下文)
while(...){  //这个就是游戏循环的条件控制,具体我不写了
使用指针now调用函数
}

在game()中,如果用户按下了暂停键,那么就:
i=1
这样下次在while循环中调用的就是这个暂停时用的函数:
{
等待用户输入,当按下了取消暂停的键后:
i=0
}
这样下次while()循环中运行的就是now[0]指向的game()
如果除了game()和暂停,还有其他状态,那么只需要建立更大容量的now数组;
这样有个好处,如果是游戏引擎,别人在开发mod的时候,可以创建mod自己的游戏状态,只要告诉引擎这个mod的状态数、各状态运行时用的函数、各状态转换条件的检测函数,那么引擎就可以自己管理这些mod的不同的状态~
要是用switch-case的模式,每增加一个状态就要修改代码重新编译,而且要是用于游戏引擎,那些mod也没法增加状态~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-4-20 17:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表