当前位置: 首页 > news >正文

网站规划与建设与安全管理asp网站模板下载

网站规划与建设与安全管理,asp网站模板下载,wordpress采集 爬虫,qq网页版登录入口网站1、主循环 《球球大作战》是一款服务端运算的游戏,一般会使用主循环程序结构,让服务端处理战斗逻辑。如下图所示,图中的 balls 和 foods代表服务端的状态,在循环中执行“ 食物生成”“位置更新”和“碰撞检 测” 等功能&#xff0…

1、主循环

        《球球大作战》是一款服务端运算的游戏,一般会使用主循环程序结构,让服务端处理战斗逻辑。如下图所示,图中的 balls foods代表服务端的状态,在循环中执行 食物生成”“位置更新碰撞检 测” 等功能,从而改变服务端的状态。 scene 启动后,会开启定时器,每隔一段时间(0.2 秒)执行一次循环,在循环中会处理食物生成、位置更新等功能。

 service/scene/init.lua中新增的内容:

function update(frame)food_update()move_update()eat_update()--碰撞略--分裂略
end

         现在思考一个问题,怎样开启稳定的定时器?可以开启一个死循环协程,协程中调用update,最后用skynet.sleep让它等待一小段时间。定义服务初始化方法init

s.init = function()skynet.fork(function()--保持帧率执行local stime = skynet.now()local frame = 0while true doframe = frame + 1local isok, err = pcall(update, frame)if not isok thenskynet.error(err)endlocal etime = skynet.now()local waittime = frame*20 - (etime - stime)if waittime <= 0 thenwaittime = 2endskynet.sleep(waittime)endend)
end
  • 它会调用skynet.fork开启一个协程,协程的代码位于匿名函数中。
  • pcall是为安全调用update而引入的,它的功能可以参照前面的xpcall
  • waittime 代表每次循环后需等待的时间。
  • 由于程序有可能卡住,我们很难保证“ 每隔 0.2 秒调用一次 update” 是精确的。
  • update 方法也需要一定的执行时间,等待时间waittime 的实际值应为 0.2减去执行时间,如下左图所示,图中 update 前的竖直黑线代表 update 的执行时间。
  • 若某次执行时间超过间隔(如下右图 0.2 秒执行的 update ),则程序需要加快执行,只能给很短的间隔时间。使得运行较长时间后,最终会在第N 秒执行 N×5 update

2、移动逻辑 

   服务端要处理的第一项业务功能是球的移动,现在实现 move_update 方法:
function move_update()for i, v in pairs(balls) dov.x = v.x + v.speedx * 0.2v.y = v.y + v.speedy * 0.2if v.speedx ~= 0 or v.speedy ~= 0 thenlocal msg = {"move", v.playerid, v.x, v.y}broadcast(msg)endend
end

         由于主循环会每隔0.2秒调用一次move_update,因此它只需遍历场景中的所有球,根据路程 速度 × 时间计算出每个球的新位置,再广播move协议通知所有客户端即可。

3、生成食物 

服务端会每隔一小段时间放置一个新食物,定义 food_update 方法来实现该功能:
function food_update()if food_count > 50 thenreturnendif math.random( 1,100) < 98 thenreturnendfood_maxid = food_maxid + 1food_count = food_count + 1local f = food()f.id = food_maxidfoods[f.id] = flocal msg = {"addfood", f.id, f.x, f.y}broadcast(msg)
end
这段代码做了如下几件事情:
  • 判断食物总量:场景中最多能有50个食物,多了就不再生成;
  • 控制生成时间:计算一个 0 100 的随机数,只有大于等于 98 才往下执行,即往下执行的概率是1/50 。由于主循环每 0.2 秒调用一次 food_update,因此平均下来每 10 秒会生成一个食物。
  • 生成食物:创建 food 类型对象 f ,把它添加到 foods 列表中,并广播addfood 协议。生成食物时,会更新食物总量 food_count 和食物最大标识food_maxid

 4、吞下食物

编写吃食物的 eat_update 方法:
function eat_update()for pid, b in pairs(balls) dofor fid, f in pairs(foods) doif (b.x-f.x)^2 + (b.y-f.y)^2 < b.size^2 thenb.size = b.size + 1food_count = food_count - 1local msg = {"eat", b.playerid, fid, b.size}broadcast(msg)foods[fid] = nil --warmendendend
end
        它会遍历所有的球和食物,并根据两点间距离公式(见下图)判断小球是否和食物发生了碰撞。如果发生碰撞,即视为吞下食物,服务端会广播eat 协议,并让食物消失(设置 foods 对应值为 nil )。

 代码中变量名的含义如下:

  • pid:即playerid,指遍历到的小球对应的玩家id
  • b:遍历到的ball对象。
  • fid:遍历到的食物id
  • f :遍历到的 food 对象。

 说明:本篇的场景服务代码更多的是为了演示如何使用框架, 没有很多性能考究。比如在eat_update代码中,双重嵌套for循环的计算量较大。在实际项目中,往往会使用一些简化的计算方法(后面会有简单的描述)。

 至此,完成了场景服务的所有代码。

5、主服务修改

        假设服务端启动时就开启了多个战场。 现在修改主服务,让它开启scene服务。 新增的内容
如下代码 示:
--scene (sid->sceneid)
for _, sid in pairs(runconfig.scene[mynode] or {}) dolocal srv = skynet.newservice("scene", "scene", sid)skynet.name("scene"..sid, srv)
end
说明: 为简单起见,演示程序会开启固定数量的场景服务。在 实际项目中,可以仿照agent 动态开启场景服务。

完整项目地址:​​​​​https://gitee.com/frank-yangyu/ball-server

http://www.15wanjia.com/news/175992.html

相关文章:

  • 贵阳做网站的公司有哪些北京skp
  • 做网站枣庄网站建设中html5源码
  • 网站域名不想实名认证ai工具推荐
  • 网站维护与建设合同免费做网站有哪些
  • 免费网站怎么注册武钢建设公司网站
  • 做app和做网站那个难香奈儿网站设计分析
  • 网站关键词扩展做百度手机网站
  • 免费简历制作app优化方案英语2024版答案
  • 学习网站建设最简单的书公司网站内容如何做
  • 最好的建设网站百度seo关键词排名价格
  • 外贸网站建设系统返利网站程序
  • 凡科网站制作教程杭州关键词排名工具
  • 长沙网页制作网站程序员培训班
  • 公司网站后台模板高州网站开发公司
  • 百度网盟推广的 合作网站食品网站设计方案
  • 东莞长安网站设计公司网络营销是什么基础类型
  • 专做美食的网站青海省建设厅职业注册官方网站
  • 兰州网站维护公司wordpress变更域名插件
  • 安徽省住房和建设厅门户网站网站开发培训内容
  • 网站建设人员的组织wordpress相册滑动
  • 网站 建设 公司常见的pc端网站布局
  • 建设银行国管公积金管理中心网站wordpress后台很卡
  • 淘宝客优惠券网站建设教程电商网站目录优化
  • wap网站实例线上编程
  • 给网站做路由莘县制作网站
  • 电脑网站模版中国室内设计
  • 网页设计网页标签图标怎么做上海网络seo优化公司
  • 直接进入网站的代码淮安市工程造价信息网
  • 海安网站设计南京房地产开发公司
  • 做网站用什么开发工具dw软件个人简历网站怎么做