开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

LuoYing RPG教程-JME3游戏创建、场景编辑、载入完整示例教程

这篇文章主要介绍: 如何创建一个3D游戏项目; 如何整合LuoYing RPG游戏框架到JMonkeyEngine游戏中; 如何使用落樱编辑器创建一个3D游戏场景,并将游戏场景载入到JME3游戏中。 文章会从创建项目、创建场景到导入场景作一个完整的说明过程。
huliqing 发布于 2周前 阅读 185 评论 1 点赞 1

Pomelo游戏服务器端开发系列(1)-介绍

官方Github上的WiKi的知识点总结到一块,筛选了一些有价值的知识点
nextzeus 发布于 3周前 阅读 85

您想参观体验IBM的创新中心,切身体会技术给时代带来的改变么?”

本次活动还特别设有实机操作环节,由IBM的技术大咖带领开发者在短时间内迅速上线人工智能应用。另外在最后,大家还可以参观体验IBM的创新中心,切身体会技术给时代带来的改变。
IBM技术沙龙

JMonkeyEngine中是如何使用AppState来管理和实现游戏场景切换的

本文要讲解的是关于JMonkeyEngine游戏引擎中如何使用AppState来实现游戏场景的管理和切换.
huliqing 发布于 1个月前 阅读 231 评论 2

3D游戏中角色的换装原理-落樱之剑实例图文详细剖析(JMonkeyEngine游戏开发)

在整个讲解过程中需要以下一些东西来进行说明,我们将通过各种工具一步一步来完成以下物件,并最终使用这些物件在游戏中演示如何进行换装。 1.一个标准的人物骨骼 - 用于控制角色基本身形、装备以及角色动画 2.一套基本身形 - 用于模拟人物角色的皮肤,即脱光装备后的样子,这里以内衣装示例,后面我称为“身形”或“身体” 3.一套角色装备 - 用于换装示例,后面我统称为“装备” ...
huliqing 发布于 1个月前 阅读 303 点赞 1

有趣的二进制—高效位运算

位运算是一种比较特别的数学运算。一般情况下,位运算的运算效率比加减乘除等常规数学运算要高得多。此外,位运算具备一些常规数学运算所没有的特点和规律,我们可以利用位运算的相关特性来完成一些非常巧妙的程序设计。
wier 发布于 2个月前 阅读 2661 评论 29 点赞 6

有趣的二进制

优秀应用算法都大量用到位运算,而位运算在工作中很少用到,所以借助其算法,我们看一下位运算的优势以及应用,但是大多数教材只会教大家二进制和十进制如何互换,都是死记硬背式的,并没有去讲解真正含义,换一个进制之后,依然不会,我们回到最根本的一些计数方法上,从10进制来推算,希望用一种更简单的方式介绍其原理
wier 发布于 2个月前 阅读 4750 评论 22 点赞 11

微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)

网上火热的“微软.NET年芳15”文章,我也得写点什么嘛,毕竟我还是现任的微软MVP。   摘录网上的“.NET 15周年”信息如下: 微软的 .NET 框架本周迎来了 15 岁生日。.NET 的第一个版本在 2002 年 2 月 13 日作为的 Visual Studio.NET 的一部分首次公开亮相。过去 15 年,.NET 框架从一个流行的闭源软件开发平台,变成了一个开源的跨平台开发工具,微软是在 2014 年 11 月 12 日宣布开源 .NET,支持竞争对手 Linux 和 OS X 的平台。微软称,Visual Studio 2017 将于 2017 年 3 月 7 日发布,而 Visual Studio 也迎来了 20 岁生日,开源的 .NET Core 也将发布 2.0版本。         我梳理了一下目前的.NET技术栈: 业务是基于Unity3D(跨平台游戏开发引擎),开发AR、VR 应用; 绝大部分项目采用单机版,使用的编程语言是C#(Mono.NET),不过最近交流的AR几个业务,明显用户已经不太满足单机版,有更多的需求需要用到联网的服务器功能,故技术选型就势在必行了:也算是未雨绸缪吧。   技术栈选型 我的技术选型有2点原则 成熟,有助于提高开发效率 人多,有坑大家一起填 这2点原则是基于第一次创业失败的经验总结。约在3年前吧,刚开始创业的时候,特别排斥C#.NET技术(互联...
王文刚_AR_VR 发布于 3个月前 阅读 537 评论 9 点赞 3

仿《雷霆战机》飞行射击手游开发--新手引导

本文以某款仿雷霆战机的手机游戏为例,说说其中关于新手引导的程序设计
雁惊寒 发布于 3个月前 阅读 807 点赞 2

仿《雷霆战机》飞行射击手游开发--资源预加载

项目源码库:https://git.oschina.net/thorqq/RaidenFree       绝大多数游戏在启动后首先出现的是一个“载入中”的场景,此场景的用处是将游戏所需的图片、音乐、数据等资源从存储卡(或磁盘、闪存)读入内存,这样,后面需要用到这些资源时,可以直接从内存读取,以加快游戏的运行,提高流畅性。下面,就对资源的预加载机制做一个介绍。 资源的类型 预加载的目的是为了后续读取的快捷,所以,一般会预加载那些较大较复杂的文件,例如以下这些: 单张大图:背景大图 合成图:可多幅图片合成的大图,这里我们使用TexturePacker合成plist+png文件 骨骼动画:使用Cocos Skeletal Animation Editor创建的骨骼动画文件,ExportJson+plist+png文件 场景:使用Cocos Studio创建的csd文件 声音:ogg音乐文件 本地数据:游戏存档数据(格式为json文件)、游戏配置数据(例如关卡、飞机属性、子弹属性等固定的数据,格式为sqlite数据库文件) 远程数据:由于本游戏是弱联网游戏,所以保存在服务器上的数据不多。这里仅仅实现了用户登录、获取时间的功能 下面,我们将逐一介绍不同资源载入的方法。 加载方法 单张大图 定义std::vector<std::string> m_imageArray,将需要加载的图片...
雁惊寒 发布于 4个月前 阅读 808 评论 1 点赞 1

采用 GLM 从代码层面理解 OpenGL 坐标系统

# 概要 关于 OpengGL 坐标系统,我很喜欢[这篇](https://learnopengl.com/#!Getting-started/Coordinate-Systems)博客,这篇博客有中文版本的。博客英文版讲诉更让人容易理解。接下来要写的这篇博客是以上篇博客为参考,进一步从代码的层面来理解 OpengGL 坐标系统。 下面博客中的代码都可以在 [blogsnippet](http://git.oschina.net/iirecord/blogsnippet)/opengl/lefthand-or-righthand 目录下获取。上篇参考博客中有下面的流程图。这里假设你已经知道了整个流程。图中我标出的红色 glm 函数分别表示,通常用 `glm::lookAt` 函数创建 view matrix 而透视投影矩阵则用 glm::perspective 创建。下面将会测试这两个函数。让我们开始吧。 ![coodinate](https://static.oschina.net/uploads/img/201701/12221155_dlh4.png "coodinate") # 默认情况下,NDC 是基于左手坐标系 首先要知道当不调用 `glDepthRange` 修改映射时, OpenGL NDC 是基于左手坐标系的。这就意味着默认时,物体的 z 轴越大,则物体的坐标越远。继续往下看,你将会发现它的用处。下面就写程序来验证一下。先程序运行结果。 ![ndc](https://static.oschina.net/uploads/img/201701/11204740_c7rG.png "ndc"...
iiRecord 发布于 4个月前 阅读 260

关于Canvas Rect Transform 设置问题

Render Mode: Screen Space - Overlay:将UI放置在场景的上面,调节场景大小或调整分辨率,则Canvas也会随之调整。 Screen Space - Camera:Canvas由一个特定的相机渲染,相机的设置会影响UI。 World Space:使Canvas像场景中的其他对象一样渲染。   默认情况为Screen Space - Overlay 模式, 即不能更改 Rect Transform  更换成  World Space 即可设置Rect Transform   知识扩展: Rect Transform Rect Transform在2D的UI中,对应于3D的Transform。用于显示调整2DUI中的缩放比例、位置、尺寸、角度等。   Position 坐标位置 Width/Height   高宽尺寸 Anchors 锚点 Pivot 中心点 Rotation 角度 Scale             缩放比例     Rect Transform中增加了Anchors属性,其中包括Anchor Min和Anchor Max。Anchors用于指定在父UI元素调整时,子UI元素如何调整。具体行为由Anchor Min(左下)和Anchor Max(右上)两个锚点决定。坐标以矩形左下为(0, 0),右上为(1, 1)。 但实际上,Unity已经提供了预定义的模式。在Rect Transform的左上角点击,出现如下的常用Anchor模式。     以top-left模式为例,此时锚点位于父元素的左上角。如果拉动父元素矩形的左边框和上...
gametodoN 发布于 4个月前 阅读 135

小程序上线,5 款的移动应用开发工具拯救你的 App

小程序来了,大伙都忙着卸载一大波App, App 真的会死掉吗?用这 5 款最实用的移动应用开发工具来拯救你的 App 吧!
两味真火 发布于 4个月前 阅读 7143 评论 17 点赞 1

C#与Java通过protobuf进行网络通信过程中遇到的问题

  上周体验了一把protobuf,google大佬搞的东西据说很多人用,优点自然不用多说,随便搜搜结果一大堆。为了测试这个玩意,随便弄了一个客户端,拿C#写了一个简单的控制台程序请求服务端,服务端拿java的HttpServer做了一个简单的响应客户端请求。 Protobuf用的2.6.1版本。 客户端下载地址:https://github.com/andyqingliu/TestHttpClient.git 服务端下载地址:https://github.com/andyqingliu/TestHttpServer.git (Note: 写了很多测试代码,为了测试方便,所以代码比较混乱。) 记录一些重要的信息备忘,顺便梳理一下当时的思路和遇到的几个重要的问题及解决方案。 1.客户端数据准备 a.用C#自带的WebClient类异步发送数据 WebClient wc = new WebClient(); wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); wc.Encoding = Encoding.UTF8; wc.UploadDataCompleted += new UploadDataCompletedEventHandler(OnUploadDataCompleted); wc.UploadDataAsync(uri, "POST", buff); b.利用MemoryStream类来存放要发送给服务端的字节流。     原来MemoryStream有ToArray的方法直接把字节流转换为字节数组。刚开始自己写读取流方法一直有问题,写不了数据...
andyqingliu 发布于 5个月前 阅读 717 点赞 1

unity中实现FSM有限状态机

FSM在游戏中的运用非常广泛, 本文为大家推荐一个Unity中易用的FSM框架, 它的原地址在https://github.com/thefuntastic/Unity3d-Finite-State-Machine
mOnsoOn1360 发布于 6个月前 阅读 424 评论 2

用Erlang实现的简易名字搜索

游戏中一般都会提供根据输入的字符搜索家族,玩家出来。以往的项目要么只能全匹配,要么是通过mysql的模糊搜索来查询的。新项目中全匹配明显不符合要求,而项目设计又不想为了这个功能而加入mysql来增加复杂度,那么剩下的就只有用erlang来实现搜索了。 想当然的就会想到用mnesia来实现,但mnesia只是个KV,功能并不足以实现需求。自己实现一个完整模糊搜索工作量也不小,还好策划的需求并不复杂。 1. 搜索出来的结果只需几十条用于显示 2. 不需要分页显示 为了快速的完成,因此决定搜索只支持从前往后的匹配。因为名字本来就有限制输入特殊符号,以及长度限制,所以对于玩家来说也不会有太大的影响。结合需求以及这些限制,整体设计方案就变得简单许多了。接下来就是构建索引,首先将名字`abc`,拆成`a`,`ab`,`abc`,然后将它们都指向`abc`这个ID。搜索时根据玩家的输入如`ab`,那么就可以很快的直接找出`ab`,`abc`,`abd`,`abcd`的对应ID了。删除索引也是如此,生成名字索引列表,然后直接删除表项即可。搜索的目的就是想找到自己查询的信息,但根据前面的设计,当玩家完整输入一个完整名字时,有可能因为该索引值对应的ID列表长度已超出显示上限,而没能返回给玩家。...
rongtou 发布于 7个月前 阅读 241

循环遍历二叉树

前序遍历 struct Node { Node*left; Node*right; int data; Node(){ func; } }; Node* create(Node*p, int depth) { if (p && depth) { p->left = new Node; p->right = new Node; p->data = depth; create(p->left, depth - 1); create(p->right, depth - 1); } if (!depth) { p->left = nullptr; p->right = nullptr; p->data = depth; } return p; } void print1(Node*p) { if (p) { cout << p->data << " "; print1(p->left); print1(p->right); } } void print2(Node*head)//利用stack 模拟函数调用过程 来遍历 { stack<Node* > s; Node*p = head; { while (p) { s.push(p); cout << p->data << " "; p = p->left; } while (!s.empty()) { Node*pp = s.top(); if (pp->right && pp != head) { cout << pp->right->data << " "; } s.pop(); } } { p = head->right; while (p) { s.push(p); cout << p->data << " "; p = p->left; } while (!s.empty()) { Node*pp = s.top(); if (pp->right && pp != head) { cout ...
梦想游戏人 发布于 8个月前 阅读 331

VisualUIEditor项目讲解之撤消反撤消详解

#VisualUIEditor项目讲解之撤消反撤消详解 撤消反撤消在UI编辑器里面必备的功能,它可以帮助我们在编辑过程中,无需害怕误操作,助您更好的使用编辑器 #在项目中使用 当您在项目中错误的移动位置,或者设置了错误的属性,这时候您可以用CTRL+Z来撤消刚才您进行的修改 当您在项目中撤消了刚才的操作,又想快速的回到刚才的状态,这时候您可以使用CTRL+R反撤消功能,来进行反撤消 #源码讲解 ##源码路径 项目的实现源码,可参考[renderUndo](https://github.com/tickbh/VisualUIEditor/blob/master/js/renderUndo.js "renderUndo") ##源码详解 每个Scene实例化的时候都会创建一个UndoObj,UndoObj里面是一层UndoList的浅封装,差别是在Undo和Redo的时候通常编辑器有节点发生变更 ```js "ui:scene_change"(event, message) { let runScene = this.$.scene.getRunScene(); if(!runScene._undo) runScene._undo = new UndoObj(); } ``` UndoList维持着场景变更的记录,UndoList的构造函数如下 ```js class UndoList extends EventEmitter { constructor (type) { super() //是否变化时发送事件的变化 this._silent = false //分为local和global类型, local类型事件变化只会通知本...
tickbh 发布于 8个月前 阅读 681 评论 3

WinformGDI+入门级实例——扫雷游戏(附源码)

本文将作为一个入门级的、结合源码的文章,旨在为刚刚接触GDI+编程或对相关知识感兴趣的读者做一个入门讲解。游戏尚且未完善,但基本功能都有,完整源码在文章结尾中。
穆翔 发布于 8个月前 阅读 1374 评论 4 点赞 1

OpenGL2D小游戏——是男人就下100层

用Opengl最简单的函数来构造碰撞检测,以及一些最简单的基本理论,新手如果有一些编程经验但又不知道做什么,这篇文章可以抛砖引玉。
dada0526 发布于 10个月前 阅读 523 评论 1 点赞 4

一个高性能无锁非阻塞链表队列

这个是一个用c++ 11标准实现的无锁非阻塞链表队列,通过增加一个dummy节点,解偶合链表头指针和尾指针。使得当只有一个生产者和一个消费者时,进队和出队都无需加锁,进队操作的是尾指针,出队操作的是头指针,互不干涉。对于多个生产者且单个消费者时,只需要对尾指针加锁保护,而头指针不需要加锁。反之,对于单生产者且多消费者时,只需要对头指针加锁保护而尾指针不需要加锁。如果是多生产者和多消费者,那么头尾指针各自加锁保护。同时,队列内部会对节点进行缓存,避免重复的内存分配以提高性能。
做个有思想的程序员 发布于 1年前 阅读 2282 评论 2 点赞 4

Cocos2d-x3.2 Menu菜单的创建

//MenuItemLabel::create(label, CC_CALLBACK_1(GameScene::menuCallback, this)) //Menu::create(item1, item2, item3, item4, NULL)
_子墨 发布于 3年前 阅读 2101

Linux基金会执行董事 Jim Zemlin 将在 LinuxCon 做主题演讲,你来不来?

这场活动将三场会议的内容整合为一体,是一场面向开发人员、运营专家(架构师、系统管理员和开发运营人员)、以及商业、合规和法律领袖与其他专业人员的技术大会。
Linux

lua的table资源释放

function release(resource) if type(resource) == “table” then       for k,v in pairs do            if type(v) == “table” then                   release(v)            else                  resource[k] == nil            end       end else      resource == nil      end end
WillyLiu 发布于 3年前 阅读 15

Vuforia 在Unity 中失焦的问题

网上有很多代码说加上这句 Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO); 但有时能对焦,有时还是会失焦。 正确解决方法: using Vuforia; public class Test: MonoBehaviour {      void Start ()      {         VuforiaBehaviour.Instance.RegisterVuforiaStartedCallback(OnVuforiaStarted);         VuforiaBehaviour.Instance.RegisterOnPauseCallback(OnPaused);     }            private void OnVuforiaStarted()     {         CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);     }            private void OnPaused(bool paused)     {         if (!paused)          {             CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);         }     } }...
紫外線 发布于 1年前 阅读 77 点赞 1

boost 对称协程symmetric_coroutine

对称协程 symmetric_coroutine  非对称协程 asymmetric_coroutine   #include "boost_1_60_0/boost/coroutine/coroutine.hpp" int main() { using Coroutine_t = boost::coroutines::symmetric_coroutine<int>; Coroutine_t::call_type coro_recv( [&](Coroutine_t::yield_type& yield) { //loop for recv for (;;) { std::cout << yield.get() << " recv" << endl; yield(); //give up time slice and jump back to starting context } }); Coroutine_t::call_type coro_send( [&](Coroutine_t::yield_type& yield) { //loop for send for (;;) { yield.get(); std::cout << yield.get() << " send" << endl; yield(); } }); while (true) { coro_recv(1); //recv coro_send(1); // send } system("pause"); return 0; } 此外可以用ASIO 的 定时器 和协程 来完成 定时任务 #include "boost_1_60_0/boost/asio/steady_timer.hpp" #include "boost_1_60_0/boost/asio/spawn.hpp" int main() { boost::asio::io_service io; boost::asio::steady_timer timer(io); using namespace boost::asio...
梦想游戏人 发布于 4个月前 阅读 37

从零开始写一个武侠冒险游戏-3-地图生成

# 从零开始写一个武侠冒险游戏-3-地图生成 ## 概述 前面两章我们设计了角色的状态, 绘制出了角色, 并且赋予角色动作, 现在是时候为我们的角色创造一个舞台了, 那就是游戏地图(我们目前做的是一个`2D` 游戏, 因此叫`地图`, 如果是 `3D`, 则叫`地形`). 地图生成也是游戏开发的一项基本技术, 涉及到方方面面的技能, 而且地图的数据结构要考虑到游戏里的其他景物跟角色的显示和交互, 对于整个游戏程序的效率起着决定性的影响, 不过我们这里先解决有没有的问题, 目标不太高, 能流畅运行就可以了. ## 最简原型 跟我们一向提倡的大思路一致, 一切从简出发, 先弄个原型跑起来再说. > 经验之谈: 很多开发过程中的难题都是因为我们一开始就引入了过于复杂的问题, 制定了太大的目标, 试图一开始就把方方面面都考虑到, 结果无形中就增加了难度, 不得不承认, 这种顶层设计的思路是不太符合事物发展的规律的, 也不符合生物的进化规律, 所以实现起来就比较困难, 如果我们遵循从简单到复杂, 从原型到成品的开发思路, 就会发现开发过程变得顺利很多. ### 游戏地图原理 简单说来, 游戏地图有两个层面, 一个是显示到屏幕上的图形图像, 一个是隐藏在图像后面的数据结构, 前者是游戏跟玩家交互的...
FreeBlues 发布于 11个月前 阅读 87

如何用 svn 管理 unity3d 项目

因为svn用惯了, asset server还是收费的,所以这个版本还是使用svn来管理unity3d的工程
初心勿忘 发布于 2年前 阅读 3804

C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例
大学霸 发布于 2年前 阅读 609

安装Warzone 2100记

记录一下这个过程,遇到的问题,解决的办法,以便以后借鉴。
临峰不畏 发布于 3年前 阅读 752 评论 10

unity 3d 异步加载场景--异步预加载场景

网上很多异步加载场景实际上没有做到异步的功能,大部分是显示一个进度条,然后同时在执行异步加载代码,这实际上并未异步加载,这只是后台加载,并且性能上比同步加载慢,原因如下:
asdtiang 发布于 3周前 阅读 73

Cocos2d-x设计模式--二段构建模式

设计模式在程序设计中会经常用到,也许你从来没有留意过设计模式,其实你却一直在使用设计模式!cocos2dx中有不少的设计模式,所以从本篇博客开始探讨一下cocos2dx中的设计模式,看看引擎都使用了哪些设计模式,我们今后写代码要怎样使用某种设计模式。 大家最熟悉的是单例设计模式了吧,在cocos2dx中单例真是不少啊,我们的大导演不就是单例吗,单例设计模式我之前写过一篇博客,这里就不多说了。第二个设计模式是观察者模式,什么是观察者模式,如何实现观察者模式。就是被观察者含有一个数组,里边存放了所有观察者的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者,实现了信息的传递。之前也有一篇博客写了cocos2dx中用来实现观察者模式的事件监听器NotificationCenter,大家可以看看。本篇博客探讨一下二段构建模式,首先第一个问题是什么是二段构建模式。 大家都知道在c++中我们一般在构造函数中为对象分配内存空间然后初始化成员变量,比如我们调用了new某个东西,那么在堆上会先为对象分配内存空间,然后调用构造函数,在构造函数中完成一些初始化的工作。而二段构建模式就是将内存空间的分配和初始化分开来完成,然后调用一个静态方法来...
_子墨 发布于 3年前 阅读 215

animateWithDuration:animations:completion:

animateWithDuration:animations:completion: 函数中的 completion什么用?
itfanr 发布于 2年前 阅读 801 点赞 1

arpg游戏灭妖记,在火舞游戏平台发布了。游戏地址及源码地址。

我的arpg游戏,发布在了火舞游戏平台上。下面是预览地址。 http://i1.51h5.com/open/game/395976/395976035635/index.html 游戏源代码地址:(暂时不是最新的) http://git.oschina.net/eternal_rider/xian   下面2张截图。
青青小树 发布于 10个月前 阅读 129 评论 3

leetcode-DP-   303. Range Sum Query - Immutable

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3   Note: You may assume that the array does not change. There are many calls to sumRange function. DP解法,先计算0-第i项的和,最终结果就是0-j的和减去0-i-1的和 class NumArray { public: vector<int> sums; int s; NumArray( vector<int> nums) { s = nums.size(); if (s <= 0)return ; sums.reserve(100); sums.push_back(nums[0]); for (int i = 1; i < nums.size(); i++) { int a = sums[i - 1] + nums[i]; sums.push_back(a); } } int sumRange(int i, int j) { if (s <= 0)return 0; if (i == 0)return sums[j]; return sums[j]-sums[i-1]; } };    ...
梦想游戏人 发布于 8个月前 阅读 4

江苏手机移动电玩城开发之徐州捕鱼时代华软领航

马云说得对,穷人真难伺候: 免费的吧,说是骗人的……投资小吧,说赚不到钱……投资大吧,又说没钱投……新行业吧,又说不会……老行业吧,又说难做……好的模式吧,又说像传销……守店吧说不自由……做业务吧,又说没能力…… 总爱问百度 ……习惯听朋友……想的比教授多……做的比文盲少……请你告诉我,你能做什么?总结一下:心动不如行动,想到不如做到!多少人都败给两个字:考虑!
手机移动电玩城开发 发布于 5个月前 阅读 8

最长回文子串与Manacher算法

The-Art-Of-Programming-By-July 学习笔记
yejq8 发布于 2年前 阅读 330

Unity3d + UGUI 的多分辨率适配

原文地址:http://blog.csdn.net/dingkun520wy/article/details/49471789 1、Canvas的属性配置 2、Canvas Scaler的属性配置 3、根据不同的屏幕的比例动态修改缩放基准 void Start ()      {         float standard_width = 960f;        //初始宽度         float standard_height = 640f;       //初始高度         float device_width = 0f;                //当前设备宽度         float device_height = 0f;               //当前设备高度         float adjustor = 0f;         //屏幕矫正比例         //获取设备宽高         device_width = Screen.width;         device_height = Screen.height;         //计算宽高比例         float standard_aspect = standard_width / standard_height;         float device_aspect = device_width / device_height;         //计算矫正比例         if (device_aspect < standard_aspect)         {...
乐逍遥jun 发布于 1年前 阅读 71 点赞 1

Tiled瓦片地图在真机运行时有缝隙的解决方法

游戏引擎Cocos-2dx-Lua 3.10版本,地图Tiled 0.10.2制作。
坐着游戏的火箭 发布于 5个月前 阅读 56

Cocos2d-x3.2 获取系统语言环境

//Application::getInstance()->getCurrentLanguage()
_子墨 发布于 3年前 阅读 365

Cocos2d-x3.2 屏幕适配

1、AppDelegate.cpp 文件中 bool AppDelegate::applicationDidFinishLaunching() {     // initialize director     auto director = Director::getInstance();     auto glview = director->getOpenGLView();     if(!glview) {         glview = GLView::create("My Game");         director->setOpenGLView(glview);     }     glview->setDesignResolutionSize(640, 960, ResolutionPolicy::SHOW_ALL);     …………………… }        不能把setDesignResolutionSize放在if条件里,因为在Android端的时候是不进入if条件的,有另外的地方做了初始化。 参数说明: ResolutionShowAll 等比例拉伸,直到宽度或高度达到屏幕的尺寸,但是:如果游戏的设计分辨率和设备的屏幕分辨率比率不同,最后会出现黑边。如果打算在黑边出填放别的精灵是无效的,因为等比缩放后,黑边的部分不会进行绘制。假如设计分辨率低于大部分设备分辨率,在忽略黑边的情况下,这种适配方式可以满足大部分设备,而我们后面改进的适配方案就是把留出来的黑边利用上。结论:无法使用,黑边出现不符合很多渠道和应用商店的规范。这...
_子墨 发布于 2年前 阅读 798

屏幕适配

. //想了半天 还是自己解决好,资料全是没用的理论 屁话 class HeightFix :public Layer//屏幕适配 层 { public: HeightFix() { Layer::init(); auto up = Sprite::create("bg_bottom_all.png"); auto down = Sprite::create("bg_bottom_all.png"); this->addChild(down); this->addChild(up); up->setPosition(540/ 2, HEIGHT_MAX/2+810/2+197/2 ); down->setPosition(540 / 2,HEIGHT_MAX / 2 - 810 / 2 - 197 / 2); } }; ///// bool AppDelegate::applicationDidFinishLaunching() {     // initialize director     auto director = Director::getInstance();     auto glview = director->getOpenGLView();     if(!glview) {         glview = GLViewImpl::create("SGZonline");         director->setOpenGLView(glview); glview->setFrameSize(640, 1136);// 5S //glview->setFrameSize(640, 960);// 4S glview->setFrameZoomFactor(0.5);     }     director->getOpenGLView()->setDesignResolutionSize(540, 1204, ResolutionPolic...
梦想游戏人 发布于 2年前 阅读 238

有趣的二进制—高效位运算

位运算是一种比较特别的数学运算。一般情况下,位运算的运算效率比加减乘除等常规数学运算要高得多。此外,位运算具备一些常规数学运算所没有的特点和规律,我们可以利用位运算的相关特性来完成一些非常巧妙的程序设计。
wier 发布于 2个月前 阅读 2661 评论 29 点赞 6

Linux基金会执行董事 Jim Zemlin 将在 LinuxCon 做主题演讲,你来不来?

这场活动将三场会议的内容整合为一体,是一场面向开发人员、运营专家(架构师、系统管理员和开发运营人员)、以及商业、合规和法律领袖与其他专业人员的技术大会。
Linux

有趣的二进制-浮点数

关于浮点数很多人都知道计算机会丢失精度的问题,那么是精度如何丢失的,为何要引入IEEE 754规范,以及非规范化浮点数有何用途?深究这些问题你会发现很难回答上来,这篇做个回顾,方便你更快的梳理这些关键知识点
wier 发布于 3天前 阅读 22

有趣的二进制

优秀应用算法都大量用到位运算,而位运算在工作中很少用到,所以借助其算法,我们看一下位运算的优势以及应用,但是大多数教材只会教大家二进制和十进制如何互换,都是死记硬背式的,并没有去讲解真正含义,换一个进制之后,依然不会,我们回到最根本的一些计数方法上,从10进制来推算,希望用一种更简单的方式介绍其原理
wier 发布于 2个月前 阅读 4750 评论 22 点赞 11

LuoYing RPG教程-JME3游戏创建、场景编辑、载入完整示例教程

这篇文章主要介绍: 如何创建一个3D游戏项目; 如何整合LuoYing RPG游戏框架到JMonkeyEngine游戏中; 如何使用落樱编辑器创建一个3D游戏场景,并将游戏场景载入到JME3游戏中。 文章会从创建项目、创建场景到导入场景作一个完整的说明过程。
huliqing 发布于 2周前 阅读 185 评论 1 点赞 1

仿《雷霆战机》飞行射击手游开发--新手引导

本文以某款仿雷霆战机的手机游戏为例,说说其中关于新手引导的程序设计
雁惊寒 发布于 3个月前 阅读 807 点赞 2

Pomelo游戏服务器端开发系列(1)-介绍

官方Github上的WiKi的知识点总结到一块,筛选了一些有价值的知识点
nextzeus 发布于 3周前 阅读 85

u3d_插件DoTween:(14)DoTweenPath路径编辑器的使用

#####一、步骤 ``` 路径编辑器的使用 : 用于场景漫游 1.新建一个场景(命名为:008_doTweenPath) 2.创建一个游戏物体cube 3.给cube添加一个DoTweenPath组件 添加一个点 : shift + command 移除一个点 : shift + alt 4.通过脚本执行移动 给按钮添加点击事件(指向cube游戏物体,执行cube里面的DoTweenPath.DoPlayForward()) 如果想点击按钮(运动时暂停、暂停时运动)那么就要调用(DoTweenPath.DoTogglePause) DoKill: 杀死动画 DoReStart:重新播放 ``` DoTweenPath的属性 ``` >>> 属性 设置ease : Linear(平均的) 默认是:先快后慢 Loops : -1 是无数循环 0是一次播放 [当Loops为-1的时候, 可以设置Loop Type(默认是:ReStart、Yoyo悠悠球:起点开始终点返回、incremental跟ReStart没什么区别)] path Type : 路径的类型(默认是 Linear 、Catmull Rom圆滑的路径) Close Path : 把终点 和 起点 链接起来 Local mOvement : 按照局部坐标开始移动 orientation: 朝向 (默认是: none 、to Path : 按照path的朝向进行行走、Look At Transform :望向一个游戏物体、Look At Position : 望向一个点) Relative: 相对的,说明一个游戏物体和路径形成一个整体,移动游戏物体的时候 路径也会跟...
宇鸿165 发布于 1个月前 阅读 27

3D游戏中角色的换装原理-落樱之剑实例图文详细剖析(JMonkeyEngine游戏开发)

在整个讲解过程中需要以下一些东西来进行说明,我们将通过各种工具一步一步来完成以下物件,并最终使用这些物件在游戏中演示如何进行换装。 1.一个标准的人物骨骼 - 用于控制角色基本身形、装备以及角色动画 2.一套基本身形 - 用于模拟人物角色的皮肤,即脱光装备后的样子,这里以内衣装示例,后面我称为“身形”或“身体” 3.一套角色装备 - 用于换装示例,后面我统称为“装备” ...
huliqing 发布于 1个月前 阅读 303 点赞 1

大型在线游戏服务器架构分享

如何才能让游戏服务架构做到 高可用,高扩展,高伸缩,高并发,可重构 ?         游戏服务器首先必须是安全的,大型在线游戏理论上支持在线用户是无限的。我们无法一次性做到无限,但我们可以通过负载均衡做到高扩展性,高伸缩性,高可用以及支持高并发的游戏服务器。无论是游戏服务器架构还是web 服务器架构,如果前期设计不好,后边将面临着重构的风险。当然我们也要考虑以重构的方案。
一一叶 发布于 2周前 阅读 80

Unity -batchmode运行模式

xxx.exe -batchmode 模式下只有基本逻辑,没有画面显示,没有输入等,可用于ClientServer
梦想游戏人 发布于 2个月前 阅读 41

使用ZeroBrane Studio进行LUA远程调试

最近发现一款老外做的luaIDE支持C/S远程调试功能,搭建测试环境非常简单。ZeroBrane Studio官方地址:https://studio.zerobrane.com/doc-remote-debugging 1、下载IDE,我现在的是ZeroBraneStudioEduPack-1.50-win32这个解压版本,我直接解压到我的F盘 2、我用lua源码编译的lua解析器作为测试环境,就一个lua.exe和lua51.dll,然后在同目录新建个test.lua 3、打开zbstudio.exe,然后直接把新建的test.lua拖入IDE,编辑如下内容: 首先需要设置调试需要的lua路径和dll路径,就是zbstudio目录下的lualibs和bin/clibs,在第1步中我把IDE解压在F盘,所以路径就这样这样的 package.path = package.path .. ";F:/ZeroBraneStudioEduPack-1.50-win32/lualibs/?.lua" package.path = package.path .. ";F:/ZeroBraneStudioEduPack-1.50-win32/lualibs/?/?.lua" package.cpath = package.cpath .. ";F:/ZeroBraneStudioEduPack-1.50-win32/bin/?.dll" package.cpath = package.cpath .. ";F:/ZeroBraneStudioEduPack-1.50-win32/bin/clibs/?.dll" ---> require('mobdebug').start("127.0.0.1") 表示要连接IDE机器的IP地址,如果的都在本机,写127.0.0.1就行了 ---> 我在第14行下了断点...
alexChan 发布于 2个月前 阅读 82

u3d_插件DoTween:(06)From+Tweens

#####一、步骤 ``` 1.新建一个场景(命名为:003_fromTween) 2.创建一个cube 3.添加一个脚本(Add Component) 4.编写脚本(移动X: ) 5.from方法 方式1 比如游戏物体的相对坐标(也就是开始的位置) (x:1,y:0,z:0) transform.DOMoveX(5,1).From(); // 5 到 1 方式2 transform.DOMoveX(5,3).From(true); // 6 到 1 //true 目标计算方式 目标坐标是相对坐标(0) + (5) 如果相对坐标是 0 就没有什么影响了 //true 目标计算方式 目标坐标是相对坐标(1) + (5) 如果相对坐标是 其他 就有影响了 ``` #####二、code ``` using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class MyCube : MonoBehaviour { // Use this for initialization void Start () { // x : 1 // transform.DOMoveX(5,1); // 移动到X为5的位置 时间为1秒 // from // transform.DOMoveX(5,1).From(); // 5 到 1 // 默认是从当前位置 运行到目标位置, 加上from()方法以后,表示从目标位置移动到当前位置 // true 目标计算方式 目标坐标是相对坐标(0) + (5) 如果相对坐标是 0 就没有什么影响了 // true 目标计算方式 目标坐标是相对坐标(1) + (5) 如果相对坐标是...
宇鸿165 发布于 1个月前 阅读 10

u3d_插件DoTween:(07)动画的属性设置(动画曲线和事件函数)

#####一、步骤 ``` 1.新建一个场景(命名为:004_specificSettings) 2.创建image控件 3.创建脚本(MyPanel) 4.编辑脚本 5.设置动画的方式(默认是先块后慢) 6.修改动画的方式 通过tweener去设置SetEase属性(查看Ease的属性可以通过快捷键 command+D) 7. tweener.SetEase (Ease.OutBounce); // inBack 先后退一点再进来 // InBounce 一进一出一进一出 // OutBounce 一进后退一进后退 // 循环次数 tweener.SetLoops(2); ``` #####二、code ``` using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class MyPanel : MonoBehaviour { // Use this for initialization void Start () { Tweener tweener = transform.DOLocalMoveX (0, 5); // 1.动画曲线 tweener.SetEase (Ease.OutBounce); // inBack 先后退一点再进来 // InBounce 一进一出一进一出 // OutBounce 一进后退一进后退 // 循环次数 // tweener.SetLoops(0); // 只会执行1次 // 2.动画结束事件 tweener.OnComplete (onTweenComplete); } // Update is called once per frame void Update () { } void onTweenComplete(){ Debug.Log ("动画播放完成了"); } } ```...
宇鸿165 发布于 1个月前 阅读 20

u3d_插件DoTween:(10)屏幕震动效果

#####一、步骤 ``` 震动屏幕的效果(用于游戏中的主角受伤、放大招) 1.新建一个场景(006_shakeSceen) 2.对Main Camera(摄像机)做一个动画,对周围做一个动画。其实整个操作在震动就是摄像机在震动 3.添加几个游戏物体(cube)在game查看 4.在Main Camera中新建一个脚本 5.编写代码()屏幕震动 使用DOShakePosition 参数1:是一个动画时间 默认是1米距离 参数2:是一个震动的方式(平面震动(只震动x,y)),默认是随机震动。 ``` #####二、code ``` using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class myShakeCamera : MonoBehaviour { // Use this for initialization void Start () { // 随机震动一个位置 /* 第一个参数 : 震动的时间 第二个参数 : 震动的距离 (默认是1米的距离) */ // transform.DOShakePosition (1); transform.DOShakePosition (1,new Vector3(3,3,0)); // 平面进行一个震动 只改变x,y没有改变z (值是一个震动的强度) } // Update is called once per frame void Update () { } } ``` --- ![摄像机下布局游戏物体.png](http://upload-images.jianshu.io/upload_images/1090284-e1518646d774dc60....
宇鸿165 发布于 1个月前 阅读 18

XYGame-AI设计3-行为树-第1版本

第一版本AI: 简单的查找目标 移动向目标 攻击目标 1.行为树: 行为树和决策树区别主要有,行为树本身除了有决策功能 还有控制行为(逻辑)功能,一种简单粗暴的方法是 通过决策树去找出解决方案,然后通过状态机去执行, 单纯的行为树除了决策功能,还要执行逻辑,也就是动作节点的执行状态 比如Running Complete 等 达到快速定位当前执行的节点在帧结束后 下一帧继续执行下去,而不用从头遍历,这涉及到 树的节点状态保存,恢复 跳转,这在设计上存在一定的难点,状态机这种有向图结构很好理解,但是变为树形结构,就比较难设计了,一种简单粗暴的方法是 通过决策树去复杂的逻辑中找出解决方案,然后通过状态机去执行,这样决策树本身就不会考虑行为之间的跳转和保留等,这样适合于行为(或者状态)本身不复杂,只是他们之间的跳转关系很复杂, 比如FPS游戏的机器人,行为很简单 就是前后左右移动  开枪,但是决策层,什么时候开枪,什么时候前走 这种就很复杂了,这种简单操作委托给状态或者目标的函数,去做,会简化设计,从而把设计本身放在设计决策层, 行为树游戏的逻辑本身主要是叶子节点(条件 行为)其余可固定至框架部分。   2.行为树代码实现分为3个部分, ...
梦想游戏人 发布于 3周前 阅读 13

[Unity3D]游戏在播放声音发生卡顿

Unity3D音频卡顿
diguo2046 发布于 2个月前 阅读 32

玩北京赛车pk10必需了解的杀号公式

     玩北京赛车pk10必需了解的杀号公式 源自:www.beijingpk10kj.com   什么是杀号,顾明思意就是将下期开奖中几乎不会出现的数字忽略,这样就可以大大缩小了选号范围,但是100%必杀公式是不可能有的,但是可以根据当前的走势及规律,来预测出下期的开奖数字,并非是毫无根据的。玩彩本身搏的就是勇气,搏的就是智慧,是在看似无规律的数字中寻找规律的游戏。北京赛车pk10的杀号技巧中主流分为三大类,即冷热杀、奖号杀和不定位杀。广大民间高手在实战中总结出了一些经典杀号公式,本章小编摘录以下公式,加上自己多年的经验来供大家参考。   1、和值乘百位+1除3的余数再—3,杀以余数为尾的和值(80%)   2、和值乘百位+1除3的余数,杀余数路的和值(80%)   3、相邻开奖号的各位数的差的和杀和值及和尾(89%)   4、上期跨杀和值及和尾(93%)   5、相邻开奖号的差的各位和杀和值及和尾(86%)   6、两相邻同和尾的上期奖号的下期奖号和值杀和尾(92%)   7、上期和值杀本期跨度(88%)   8、和值尾+4,绝杀个位(91%)   9、上期跨度,绝杀个位(92%)   10、上期十位杀本期个位(90%)   11、和值尾与跨度的和的个位数绝杀十位(98%)   12、当期期数尾+4,绝杀...
北京赛车-PK10技巧 发布于 1个月前 阅读 27

Python游戏编程,外星人入侵项目(完整版)

准备工作:下载python,比如Anaconda3(64 bit),导入pygame游戏包 1.外星人设置,alien.py,代码: import pygame from pygame.sprite import Sprite class Alien(Sprite): """表示单个外星人的类""" def __init__(self,ai_settings,screen): """初始化外星人并设置其他位置""" super(Alien,self).__init__() self.screen = screen self.ai_settings = ai_settings #加载外星人图像,并设置其rect属性 self.image = pygame.image.load('images/alien.bmp') self.rect = self.image.get_rect() #每个外星人最初都在屏幕左上角附近 self.rect.x = self.rect.width self.rect.y = self.rect.height #存储外星人的准确位置 self.x = float(self.rect.x) def blitme(self): """在指定位置绘制外星人""" self.screen.blit(self.image,self.rect) def check_edges(self): """如果外星人位于屏幕边缘,就返回True""" screen_rect = self.screen.get_r...
网络优伶 发布于 1个月前 阅读 54

JMonkeyEngine中是如何使用AppState来管理和实现游戏场景切换的

本文要讲解的是关于JMonkeyEngine游戏引擎中如何使用AppState来实现游戏场景的管理和切换.
huliqing 发布于 1个月前 阅读 231 评论 2

浪人棋牌游戏开发教程

  浪人棋牌游戏开发教程 www.langren.net   简单的程序框架。 webgame程序构成:   三大部分。   第一是数据流程。第二是程序。第三是美术。   其中,数据流程包括了功能。也只有在功能中才能体现数据流程。   数据流程相当的麻烦,后面再讨论。 比如最简单的卖买产品。 要实现这个功能。   那么需要有产品基础表、产品详细表、商店表、背包表。如果扩展性更强,相应的双表是少不不了的。   表的问题都简单了。关键是这个物品有什么用。这样物品的来源,一大堆数据,物品的走向,又是一大堆数据。 最后,这些数据得绕成一个圈。 绕圈是一件困难的事情。特别是功能和道具多了起来的时候。难度是2的n次方。   在绕圈之前,如果你比较熟练设计模式。那么这个过程可以简化。难度由2的n次方变为1。   只需要有控制器、事件工厂、抽象道具工厂这三个虚类;再加上定时器,任务编辑器,这两个通用类。即可以构建一个健壮、高扩展的webgame。   在webgame里控制器几乎可以等同于页面。随便采用一种模板技术即能很方便的处理。   事件工厂是一个抽象类,所有的事件,如打工、战斗、移动等都由事件工厂的生产。并且接口相同,方便控制器控制。工厂模式。   抽...
棋牌游戏开发浪人 发布于 1个月前 阅读 8

在Mac新建cocos2dx-lua工程

避免忘记命令,做个笔记。
尹enjoy 发布于 19小时前 阅读 1

Android Studio 中 Android Monitor 连接设备后 No Debuggable Applications 的解决

No Debuggable Applications问题解决。
坐着游戏的火箭 发布于 1天前 阅读 4

实机操作,由IBM的技术大咖带领如何在短时间内迅速上线人工智能应用,名额有限快来报名!”

本次活动还特别设有实机操作环节,由IBM的技术大咖带领开发者在短时间内迅速上线人工智能应用。另外在最后,大家还可以参观体验IBM的创新中心,切身体会技术给时代带来的改变。
IBM技术沙龙

有趣的二进制-浮点数

关于浮点数很多人都知道计算机会丢失精度的问题,那么是精度如何丢失的,为何要引入IEEE 754规范,以及非规范化浮点数有何用途?深究这些问题你会发现很难回答上来,这篇做个回顾,方便你更快的梳理这些关键知识点
wier 发布于 3天前 阅读 22

简易 Unity3D UI 框架

看见一篇介绍 Unity3D UI 框架编写的[文章](www.jianshu.com/p/1d54e2f35004),并且给出了[示例代码](https://github.com/tinyantstudio/UIFrameWork)。然后去了解了一下。讲道理,示例代码蛮乱的,不知道有一些是不是直接从项目代码拷贝然后简单修改,对于一个简单的框架来说,有很多不必要的混乱逻辑。而且我又喜欢粉色,所以就重新编写了,话不多说先上运行图示。具体代码点[这里](http://git.oschina.net/iirecord/tinywnd)。 ![运行图示](http://git.oschina.net/iirecord/tinywnd/raw/master/Run/Run.gif) 想了解更多信息具体查看代码。这篇博客主要谈一谈 UI 框架基本的需求。UI 框架有很多实现方式,比如多个界面共用一个摄像机渲染还是单个界面单个摄像机渲染,但是基本的需求是一致的。掌握了基本的需求,才能适应不同项目策划百变的需求。**最后需求分析基于手游,界面基于 NGUI** 。 ## 基本情景 ![UIOper](http://git.oschina.net/iirecord/images/raw/master/RunScreenshot/UIOper.png) 游戏玩法一般分为 UI 玩法和核心玩法。假设核心玩法是战斗。UI 玩法与核心相互交织连接,比如打开装备界面锻炼装备,这样战斗时就更厉害,还比如打开聊天界面与好友聊天,...
iiRecord 发布于 6天前 阅读 5

搭建gitlab lfs管理unity 源码

unity 3d模型数量和视频文件上来后,一个工程文件很随意的就上好几G,十几G也有,如果版本管理这些文件是一个坑的事情。 目前免费或者收费的git服务器基本达不到要求,只能自己搭建gitlab来实现源码管理。 gitlab 和 lfs 是首先解决方案。 gilab安装 gitlab 可以使用docker安装 : https://docs.gitlab.com/omnibus/docker/ docker 好处就不用多说,方便。 docker 示例: docker run --detach \ --hostname gitlab.example.com \ --publish 4430:443 --publish 8000:80 --publish 2200:22 \ --name gitlab \ --restart always \ --volume /gitlab/config:/etc/gitlab \ --volume /gitlab/logs:/var/log/gitlab \ --volume /gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:9.1.4-ce.0 域名自己更改一下,由于主机443 80 22端口都被占用,也得根据实际情况更改一下。 这里的配置最后得用  gitlab.example.com:8000  访问,需要主机上面做ngix反向代理: server { listen 80; server_name gitlab.example.com; location / { proxy_pass http://localhost:8000; proxy_connect_timeout 60; proxy...
asdtiang 发布于 1周前 阅读 16

pygame写的多食物面向对象贪吃蛇

pygame的贪吃蛇,一次投递多个食物,默认画布15*15,一次投递20个食物,食物之间、食物与蛇之间不会重叠。当方块总数 - 蛇身长度 - 食物个数 < 20时,判断玩家胜利。有生之年终于可以看到贪吃蛇的结局了! 本版本的贪吃蛇Snake、Food和World均独立于具体库,稍作修改可成为命令行版本的贪吃蛇,也可迁移到其他引擎中。 # -*- coding: utf-8 -*- """ Created on Tue May 16 07:24:28 2017 @author: zbg """ import pygame from pygame.locals import * from random import randint, choice, shuffle class Map(dict): def __init__(self, w, h): dict.__init__(self) self.w = w self.h = h self.clear() def __str__(self): s = '' for j in range(self.h): for i in range(self.w): s += self[(i, j)] s += '\n' return s def clear(self): for i in range(self.w): for j in range(self.h): self[(i, j)] ='.' class Food(object): def __init__(self, world, n = 1): s...
zbaigao 发布于 1周前 阅读 7

LiteOS-内核C代码-屏幕输出

终于可以开始用C来写代码了 内核启动代码, #include "src/main.h" const char *VGA_BUFFER = (const char*)0x000b8000;// vga 显存开始地址 int kernel_entry() { while (1) { main(); } return 0; } main.c #include "stdio.h" #include "def.h" void print_logo() { printf("LiteOS 1.0 (c) 2013-2017 dreamyouxi.com\n\n"); printf("* * ***** ***** \n"); printf("* * * \n"); printf("* * * ***** \n"); printf("* * * * \n"); printf("**** * * ***** OS 1.0 \n"); } int main() { print_logo(); flush(); while (1) { } return 0; } 由于没有标准库,因此printf等这些标准库函数都要自己实现 VGA 13h显示模式下的显存首地址为0x0b8000 因此在这里面写数据即可 该模式下的屏幕是80(长度x)*25(高度y)*2字节,2字节为 char + 颜色(16色) 下面是颜色代码:(如 color fc 为亮白色产生亮红色,第一个背景,第二个前景)     0 = 黑色       8 = 灰色     1 = 蓝色       9 = 淡蓝色     2 = 绿色       A = 淡绿色     3 = 湖蓝色     B = 淡浅...
梦想游戏人 发布于 2周前 阅读 13

LiteOS-grup引导

上篇降到自己实现MBR的引导,但是要进入系统入口还需要做很多事情,利用grup来帮助我们引导系统, grup 能引导多系统 http://blog.csdn.net/xiaoyi23000/article/details/50504527 MBOOT_MAGIC equ 0x1BADB002; MBOOT_FLAGS equ 0x00; MBOOT_CHECKSUM equ -(MBOOT_MAGIC + MBOOT_FLAGS); [BITS 32] section .text dd MBOOT_MAGIC dd MBOOT_FLAGS dd MBOOT_CHECKSUM dd start [GLOBAL start] [EXTERN kernel_entry] start: cli;禁止中断,保护模式下不能用bios提供的中断功能 call kernel_entry; 调用内核入口函数 jmp $ 从这里开始就可以开始用C语言来写内核代码了。 由于windows 下的gcc还不支持elf_i386,只支持i386pe格式,因此要链接的话,只有在linux下的gcc来链接了。 kernel.c const char *VGA_BUFFER = (const char*)0x000b8000;// vga 显存开始地址 int kernel_entry() { while (1); return 0; } 编译引导:nasm -f elf boot.asm -o boot.o 编译内核代码:gcc -masm=intel -c -nostdlib kernel.c -o boot.o 链接引导和内核代码:ld  -T link.ld -m elf_i386 -nostdlib boot.o kernel.o -o kernel mnt挂载后,然后把kernel放在g...
梦想游戏人 发布于 2周前 阅读 10

LiteOS-从bios到MBR引导代码

  启动步骤 1.BIOS 加电启动后,开始进入计算机启动流程 2.自检,该过程主要用于检查基本硬件故障,如内存,CPU等,该过程可以再BIOS设置里面关闭,自检通过后许多旧年代的主板会蜂鸣器 表示通过。 3.从BIOS配置的启动设备启动,可以是HDD 光驱,也可以是软盘。找到后开始读取MBR(主引导记录),这里就是关键了, 扇区开始的 第一段为:引导程序占用446个字节,并且引导程序第一段指令为org 7c00h,bios吧程序加载到0000:7c00处开始执行,为什么是这个值 http://blog.csdn.net/mirage1993/article/details/29908929  解释地清楚 第二段为分区表:16*4个字节 第三段为结束标示值为0xaa55 ,2字节 一共512字节。 4.加载引导程序 前面446字节记录着引导程序代码, 编写引导代码boot.asm   org 7c00h mov ax, cs mov es, ax mov ax, logo mov bp, ax mov cx, len mov ax, 1301h mov bx, 000fh mov dl, 0 int 10h logo: db "LiteOS 0.1 (c) 2013-2017 dreamyouxi.com" len: equ $ - logo times 510 - ($ - $$) db 0 dw 0aa55h 用masm工具 生成二进制代码  start nasm boot.asm -o boot.bin,生成的文件就是我们需要的512字节的MBR。 新建一个vm虚拟机 ,把设备文件设置...
梦想游戏人 发布于 2周前 阅读 8

大型在线游戏服务器架构分享

如何才能让游戏服务架构做到 高可用,高扩展,高伸缩,高并发,可重构 ?         游戏服务器首先必须是安全的,大型在线游戏理论上支持在线用户是无限的。我们无法一次性做到无限,但我们可以通过负载均衡做到高扩展性,高伸缩性,高可用以及支持高并发的游戏服务器。无论是游戏服务器架构还是web 服务器架构,如果前期设计不好,后边将面临着重构的风险。当然我们也要考虑以重构的方案。
一一叶 发布于 2周前 阅读 80

sigbus内存错误

编写跨平台代码时,ARM不支持非对齐的内存访问,x86支持,跨平台C++代码容易出现以下问题 sigbus意思是该地址有效,但是总线不能读取,具体错误信息有以下三种 BUS_ADRALN 未对齐的内存 BUS_ADRERR 不存在的物理地址 BUS_OBJERR 硬件错误   BUS_ADRALN 一般是类型转换导致的,比如 由于对齐,多出来的3个字节并没有初始化为0,ptr1按照int来解析内存,能顺利读取到后面3个字节,因为内存是合法的,虽然数据不对,但是对于没有对齐的话,那么按照ptr1的地址解析int 就会出错,因为虽然ptr1指针的地址是合法的,但是只有一个字节,并没有多出3个字节。如果CPU支持非对齐内存的访问的话,把3个字节当做0处理即可,但是部分ARM系列并不支持。这类代码编写跨平台就很容易BUG。 这种问题的解决方案之一是,用sizeof 和 char*最小的 基本数据内存块来对内存解析, 简单粗暴就是memcpy(..,..,sizeof(...));这样一个字节一个字节地拷贝到副本里面   又比如      
梦想游戏人 发布于 2周前 阅读 3

UI系统-版本1

cocos2dx 3.10版本提供了 cocos studio 界面导出到lua,还提供了一套基本的MVC框架。 再次基础上改进代码,实现以下功能 1.无需手动填写 RESOURCE_BINDING 的内容, 2.Button 自动根据ui名字绑定到 函数名,比如 btnClose,的单击会被绑定到函数 ui_btnCloseClicked,这样,只需要在cocostudio重命名,然后lua在脚本添加函数ui_btnCloseClicked 即可。 3.ui的元素自动绑定到table成员,比如有个txtTips,lua脚本,里面使用直接self.ui.txtTips:setString("11");,方便快速开发   eg:添加一个新按钮流程 cocostudio 添加一个按钮名字为btnNew,导出资源为lua格式 MainScene.lua添加函数 ui_btnNewClicked ,即为点击事件回调   重构后的代码 MainScene.lua local t = class("MainScene", cc.load("mvc").ViewBase) t.RESOURCE_FILENAME = "res/MainScene.lua" t.RESOURCE_BINDING = { -- ["Button_1"]={["varname"]="Button_1",["events"]={{["event"]="touch",["method"]="onBtnTouch"}}}, -- ["Text_1"] = {["varname"] = "txt_info"}, -- ["Panel"] = {["varname"] = "Panel"}, }; function t:onCreate() printf("resource node = %s", tostring...
梦想游戏人 发布于 2周前 阅读 5

用workerman搭建在线小游戏服务器端测试

游戏是在app上运行,项目预期是实现用户登录注册、选择房间号、进入房间、在房间里发生的一切互动 数据通过 workerman 提供的webscoket服务器,保持和app客户端的长链接互动;
kubei 发布于 2周前 阅读 8

three.js docs翻译

水平有限,个人翻译,仅供参考。
ClassLibry 发布于 2周前 阅读 8

LuoYing RPG教程-JME3游戏创建、场景编辑、载入完整示例教程

这篇文章主要介绍: 如何创建一个3D游戏项目; 如何整合LuoYing RPG游戏框架到JMonkeyEngine游戏中; 如何使用落樱编辑器创建一个3D游戏场景,并将游戏场景载入到JME3游戏中。 文章会从创建项目、创建场景到导入场景作一个完整的说明过程。
huliqing 发布于 2周前 阅读 185 评论 1 点赞 1

Unity和Unreal在电影行业的应用

# 需求 由于游戏制作火爆,游戏引擎渲染效率和效果的提高。并且由于传统电影制作人力资源消耗大,渲染周期长等特点,需要寻找更加优秀的制作解决方案。当前绝大部分动画剧集的制作均转向了游戏引擎。 由于会议参与了一半,无法明确了解游戏引擎将要应用在电影制作当中的何种领域。 当前国内的特效主要以Nuke为主的二维特效为主要因素。 # 效果 游戏引擎无法解决的问题:半透明排序,多点光源,多阴影 ## 重要问题光照 如果在游戏引擎中采用 静态光照技术 , 由于为了游戏体验的流畅性,会预先计算光照结果,保存到光照贴图。可以达到逼真的光照效果,而计算光照贴图所花费的时间,不亚于传统渲染软件的渲染时间。动画分公司使用游戏引擎进行预览,有助于导演的快速调整,而进行渲染时,则依旧使用电影引擎进行最终渲染。 Unreal的Enlgihten全局光照,独立收费。 http://v.youku.com/v_show/id_XODE3MzIzOTI0.html # 游戏引擎调研 主要对游戏行业的三大制作软件进行调研,分别为两个商用级别的Unity、Unreal,和开源的Blender ## 官网 [Unity官网](https://unity3d.com/) [Unity中文官网](https://unity3d.com/cn) [Unreal官网](https://www.unrealengine.com/) [Unreal中文...
抢小孩糖吃 发布于 2周前 阅读 24

解决PHP无法通过file_get_contents或curl采集页面内容

在php中经常用到的采集函数就是file_get_contents和curl函数。php在用file_get_contents函数采集网站时会返回false,但是在浏览器里打开连接地址就可以看到网页内容。 这是因为服务器上做了设置,通过php $_SERVER["HTTP_USER_AGENT"]获取 User_agent判断是否为正常的浏览器请求 ,因为默认php的file_get_contents函数是不发送User_agent的。 User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。 我通过测试,在要抓取的页面输出变量$_SERVER["HTTP_USER_AGENT"]为空。这样在被抓取的服务器通过php来获取$_SERVER["HTTP_USER_AGENT"]的值,如果为空的话,就跳转到404错误页面,这样就无法抓取到页面信息。 解决这个问题有2种方法 1、设置php.ini配置文件,找到user_agent这个开启,把前面的分号去掉; 2、通过php的ini_set()方法设置用户代理。 实例如下 ini_set(‘user_agent’,'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)’); echo file_get_contents(‘你想要采集的页面url’); 通过上面2种方法就可以让$...
FeanLau 发布于 2周前 阅读 35

关于坐标变换的数学表达

约定本文的向量均以行向量来表达,就记向量为V吧。 我们直截了当学习构造一个代表运动的矩阵吧。构造的结果是一个矩阵M,这个矩阵代表一个运动。求得M之后,用V*M就代表对向量V执行M代表的运动,即算出向量V在执行M代表的运动之后,具备的新坐标V'。这个所谓的新坐标V',与旧坐标V处于同一坐标系。因此,准确的说,我这儿所说的运动,是指在一个坐标空间中,将物体从一个地方搬到另一个地方,这两个地方的地址描述都是在同一个坐标空间的参照下。物体的老地址(老坐标)是V,搬动之后,新地址(新坐标)是V'。那么,我所要构造的矩阵M,其实描述的就是这个搬动动作--怎么个搬动法,或者你也可以认为M描述的是新旧坐标之间的一种【一一映射】关系。强调一下,这里的搬动只是比较直观的表述,实际上我要说的是运动,包括旋转。 搞明白了上面这些,我们就对运动的描述(用矩阵描述)与运动的执行(用乘法来执行)以及运动的结果(将物体搬到了新地方,得到了新坐标)有了一点点总体的印象。然后,我再来说怎么构造这样一个代表运动的矩阵。首先,我们先看3*3单位矩阵,由于我约定向量为行向量,因此,矩阵的每一行都是一个坐标基,即单位坐标轴的坐标,比如第一行为(1 0 0),第...
小保哥 发布于 2周前 阅读 6

NGUI 屏幕适配(2D UI)

博客内容基于 NGUI.3.11.2,讲述 NGUI 2D UI 。 # 设备无关坐标 以 OpenGL 为例,经过各种图形阶段(stage)后,几何形状最终被转换成像素显示在屏幕上。设备屏幕坐标以像素为单位,是设备相关的。不同设备分辨率不一样,即使同一设备,不同窗口的大小也不一样。在不关注具体设备的情况下绘制几何形状,则需要设备无关坐标系统。OpenGL 标准化设备坐标空间(NDC)在 X 轴、Y 轴,Z 轴上是 [-1, 1] 。举个例子,不做任何坐标变换(transform)和视口变换(viewport),对于顶点坐标(-1.0f, -1.0f, 0.0f)、(1.0f, -1.0f, 0.0f)、(1.0f, 1.0f, 0.0f)、(-1.0f, 1.0f, 0.0f),调用 `glDrawArrays` 并指定 `GL_TRIANGLE_FAN` 绘制的长方形覆盖整个窗口。 Unity 提供的坐标单位(设置 `Transform` 组件各属性值,如 `position`)就是设备无关的。设置 `Camera.orthographic = true` 使用 2D 正交摄像机,假设屏幕宽高比为 `aspect` ,则正交摄像机 XY 平面矩形宽高分别为 `cam.orthographicSize * 2.0f * apsect` 和 `cam.orthographicSize * 2.0f` 。 ## NGUI 2D UI 像素单位 使用菜单 NGUI|Create|2D UI 创建 2D UI 。具体的创建函数 `NGUITools.CreateUI` 有如下设置 ...
iiRecord 发布于 3周前 阅读 38

XYGame-AI设计4-行为树-第2版本

基于上篇   XYGame-AI设计3-行为树-第1版本  的  AI 丰富版本    也是       XYGame-AI设计2-FSM    的 行为树 重构版本 根据下下图的策划文档 得出以下行为树: 先说总结: 相比版本1 只是单纯的AI规则复杂化了, 每帧更新 还是从root节点开始遍历,通过不同的决策 找出执行的叶子节点,并且执行Action行为逻辑,而现在设计的这种树形结构 彼此是有依赖关系的,因为 看似可以简单粗暴的每次从root 开始遍历,更好的一种设计是保存当前节点,下次更新直接从当前节点继续执行,这个过程有点像函数的调用过程,地址保存 和恢复。 这样做虽然能省去每次从root遍历的性能开销,但是带来了几个难点: 1.行为节点的恢复和保存,什么时候开始执行行为,什么时候执行行为的条件等问题 2.行为的条件评定,严格看来虽然从root开始遍历,但是得出的行为始终是在严格的条件下执行的,只不过部分条件重合评定 导致的性能开销,而不是从root遍历本身带来的开销 3.节点将会携带执行状态,比如Running Complete Looping 等,   策划文档: 以下是Action 和Condition 的 实现代码 Action.cs /* * Author: caoshanshan * Email: me@dreamyouxi.com Behavior Tree 's Act...
梦想游戏人 发布于 3周前 阅读 19

有趣的二进制—高效位运算

位运算是一种比较特别的数学运算。一般情况下,位运算的运算效率比加减乘除等常规数学运算要高得多。此外,位运算具备一些常规数学运算所没有的特点和规律,我们可以利用位运算的相关特性来完成一些非常巧妙的程序设计。
wier 发布于 2个月前 阅读 2661 评论 29 点赞 6

【福利】蓝色巨人的云计算PaaS平台IBM Bluemix免费试用!

IBM Bluemix,包含认知、物联网、大数据分析、安全、DevOps、应用、应用整合、移动、计算、网络、存储等 11 大类共 140 多个服务的云计算平台。
IBM Bluemix

有趣的二进制

优秀应用算法都大量用到位运算,而位运算在工作中很少用到,所以借助其算法,我们看一下位运算的优势以及应用,但是大多数教材只会教大家二进制和十进制如何互换,都是死记硬背式的,并没有去讲解真正含义,换一个进制之后,依然不会,我们回到最根本的一些计数方法上,从10进制来推算,希望用一种更简单的方式介绍其原理
wier 发布于 2个月前 阅读 4750 评论 22 点赞 11

WinformGDI+入门级实例——扫雷游戏(附源码)

本文将作为一个入门级的、结合源码的文章,旨在为刚刚接触GDI+编程或对相关知识感兴趣的读者做一个入门讲解。游戏尚且未完善,但基本功能都有,完整源码在文章结尾中。
穆翔 发布于 8个月前 阅读 1374 评论 4 点赞 1

几款 Pokémon Go 开源项目介绍

Pokémon Go是由任天堂发布的增强现实(AR)游戏,一经推出,火遍全球,收获众多玩家。想必很多只猿,也沉浸其中。在这里,介绍几款 Pokémon Go开源项目,感兴趣的猿,可以尝试尝试。
催呀催呀 发布于 10个月前 阅读 5639 评论 14 点赞 3

Xgame 合服工具技术设计文档

这是一篇介绍“合服工具”的技术文档;合服工具代码可以参考:https://git.oschina.net/afrxprojs/xgame-php_tool,注意:合服工具使用 PHP 语言开发!为什么使用 PHP,我后面会简要说明;该文档的主要目的是说明开发“合服工具”的思维过程,而不仅仅是使用说明!技术文档的价值在于过程而不是结论;我假定你对游戏行业的技术岗位工作有所了解。如果你亲身参与过游戏合服工作,这篇文档阅读起来可能会比较轻松;这是一篇不合规范的文档,所有符合规范的文档,没有人喜欢读……该文档以“轻松、易读、实用”作为规范;
hjj2017 发布于 2年前 阅读 1043 评论 3 点赞 2

C#程序员整理的Unity 3D笔记(十五):Unity 3D UI控件至尊–NGUI

目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词)。 NGUI虽然不是Unity 官方原生的,但以其强大的能力和友好的操作性,成为了事实上的王者—-无他,OnGUI太挫了。
王文刚_AR_VR 发布于 2年前 阅读 13923 评论 4 点赞 7 打赏 1

C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想

如果你接触过《设计模式》、软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”。 这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例)。
王文刚_AR_VR 发布于 2年前 阅读 1943 评论 4 点赞 2

网络版五子棋(Nodejs+socket.io)

这是刚学Node的时候写的,很久了,虽然比较简陋,也许还有BUG,但总归也是作品,也提交上来充个数吧,项目地址:http://git.oschina.net/scgywx/five-chess/ 简介 NodeJS + Socket.io开发的网络版五子棋,类似QQ游戏的五子棋,有大厅、用户列表、房间、聊天等功能。 安装 1、下载源代码,安装socket.io 2、运行服务端, 进入server目录,执行node index.js 3、使用http server(nginx或apache)将目录指向client目录(需要访问图片,html等文件) 4、修改服务器IP和端口(分别位于index.html第70,87,88行) 5、访问index.html即可 图片
呵大官人 发布于 2年前 阅读 2885 评论 10 点赞 4

Lua脚本怎么样调用外部脚本?

Lua脚本在游戏中的应用
borey 发布于 3年前 阅读 6364 评论 14 点赞 2

第一个libgdx程序--仿别踩白块

唉,从想到做拖了很久 ==||
贺路的路 发布于 3年前 阅读 4385 评论 6 点赞 1

【深入Cocos2d-x】使用MVC架构搭建游戏Four

基于Cocos2d-x2.2.3框架,并使用MVC架构,搭建了游戏Four。提供了相应的源代码,apk文件等等,希望您在GitHub上Star这个项目。
王选易 发布于 3年前 阅读 9805 评论 12 点赞 15

2048 C++源代码by Reason

2048 C++实现 源代码
ChenReason 发布于 3年前 阅读 9783 评论 27 点赞 23

开源游戏 “Elvish Bird”

这是一个纯javascript语言开发的自虐、冒险、死磕类游戏,它的名字叫“Elvish Bird”,主体开发了5个工作日,内部含有全部的代码。希望大家学习学习。运行这款游戏可以在IE8以上浏览器运行。运行时如果屏幕分辨率不兼容,你可以缩放到最佳显示效果。
BruceWan 发布于 3年前 阅读 3592 评论 15 点赞 11

开源游戏 “打飞机”

这是一个纯javascript语言开发的射击类游戏,它的名字叫“打飞机”,主体开发了4个工作日,内部含有全部的代码。希望大家学习学习。运行这款游戏可以在IE8以上浏览器运行。运行时如果屏幕分辨率不兼容,你可以缩放到最佳显示效果。
BruceWan 发布于 3年前 阅读 9608 评论 62 点赞 57

【笔记】试玩 cocos2d-x-3.0beta on android

[cocos]: http://www.cocos2d-x.org/ [sdk]: http://developer.android.com/sdk/index.html [ndk]: http://developer.android.com/tools/sdk/ndk/index.html [ant]: http://ant.apache.org/ [python]: http://www.python.org/ [javase]: http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=ocomen # 试玩 cocos2d-x-3.0beta on android ## 1 环境准备 * [Cocos2d-x][cocos]: v3.0beta * [Android SDK][sdk]: Revision 22.3(SDK Tools) * [Android NDK][ndk]: Revision 9c * [Apache Ant][ant]: 1.9.3 Released * [Python][python]: 2.7.6 Android SDK Manager: ![][1] ps: 这次儿我把环境都提升到了最新状态,除了[Java][javase]仍为jdk-7u45。 ### 1.1 前提说明 1. 首先,以下都是在Win7 32位上操作的。 2. 其次,这里假设上述环境都安装在了E:盘。 ### 1.2 配置环境变量 ANDROID_SDK_ROOT = E:\android-sdk-windows NDK_ROOT = E:\android-ndk-r9c ANT_HOME = E:\apache-ant-1.9.3 PY_HOME = E:\Python27 JAVA_HOME = C:\Program Files\Java\jdk1.7.0_45 NDK_TOOLCHAIN_VERSION = 4.8 `ANDROID_SDK_ROOT`太长了,可以另外设个: SDK_RO...
加壹 发布于 3年前 阅读 7369 评论 4 点赞 4

OpenGL超级宝典笔记——深度纹理和阴影

之前我们介绍过简单的把物体压平到投影平面来制造阴影。但这种阴影方式有其局限性(如投影平面须是平面)。在OpenGL1.4引入了一种新的方法阴影贴图来产生阴影。 阴影贴图背后的原理是简单的。我们先把光源的位置当作照相机的位置,我们从这个位置观察物体,我们就知道哪些物体的表面是被照射到(被光源看到)的,哪些是没有被照射到(被遮挡住)的(在某个方向上离光源最近的表面是被照射的,后面的表面则没有被照射到)。我们开启深度测试,这样我们就可以得到一个有用的深度缓冲区数据(每一个像素在深度缓冲区中的结果),然后我们从深度缓冲区中读取数据作为一个阴影纹理,投影回场景中,然后我们在使用照相机的视角,来渲染物体。 光源视角 首先我们把视角移到光源的位置。我们可以通过glu库的辅助函数: gluLookAt(lightPos[0], lightPos[1], lightPos[2], 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 把光源的位置设置为观察的位置。 为了以最佳的方式利用空间来产生阴影贴图。从光源的角度看过去的透视可视区域要适应窗口的比例,且透视的最近平面位置是里光源最近的物体的平面,最远的平面位置是离光源最远的物体的平面。这样我们就可以充分的利用场景的信息来填充深度...
Mario_Q 发布于 3年前 阅读 10353 评论 7 点赞 13
顶部