在微信公众平台 开发者模式的情况下,自定义的菜单跳转到自己的Web页,通过微信内置的浏览器来解析页面
但是通常情况下,浏览器的工具栏 上下占用了屏幕不少的位置
一直想干掉
今天看到如下代码
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
WeixinJSBridge.call('hideToolbar');
WeixinJSBridge.call('hideOptionMenu');
});
就可以把微信浏览器访问时候的工具条隐藏掉了
float ratio = 1.0* w / h;
// 投影在屏幕上显示的位置,以及宽度,高度(现在即投影到屏幕(0,0)坐标)
glViewport(0, 0, w, h);
// 看到的是一个1的正方体
// 投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//正投影(左右下上前后的投影范围)(这个是以摄像机为原点的坐标)
// 看到的是眼前6.1 到 7.1 范围的东西,看不到任何东西
//glOrtho(-2, 2, -2, 2, 6.1, 7.1);
glOrtho(-2, 2, -2, 2, 1, 10);
//透视投影
// 第一个是眼睛睁开大小 第二个是宽高比 第三个是近裁面 第四个是远裁剪面
//gluPerspective(45,ratio,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 自定义观察坐标,不设置,则世界坐标的原点为摄影机,z反方向为观察方向,y正方向为上(右手系坐标,右方为x,上为y,向外为z)
// 前三个是摄影机坐标,观察点(摄影机-观察点为z轴正向)最后三个是y轴正方向(不可与z同向),确定yz,x方向就定了
gluLookAt(0,1, 5, 0,0,0, 0,1,0);
//---------------------正投影
// 投影面是-2 到 2,因为摄像机和观察点都上移了2,所以观察的范围就是世界坐标的0-4,所以只看到窗口下面1/4处有正方体
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);
// 投影面是-2 到 2,因为摄像机和观察点都上移了2,所以观察的范围就是世界坐标的0-4,所以只看到窗口下面1/4处有正方体
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,2, 5, 0,2,0, 0,1,0);
// 摄像机上移2,观察点不变,上下看到的是斜着穿过正方体的平面,左右还是正方体,所以上下长,左右不变
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,2, 5, 0,0,0, 0,1,0);
// 摄像机上移2,观察点不变,而截取范围缩小,导致中间有部分投影为空
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 4.5, 5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,2, 5, 0,0,0, 0,1,0);
// 看到的是眼前6.1 到 7.1 范围的东西,而正方体位于-1到1,即4到6,所以看不到任何东西
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 6.1, 7.1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);
//// -----------------透视投影---------------------------
// 观察点为5,y轴为上,眼睛睁开90度,宽高比为1,近裁剪面为眼前1,即世界坐标4,所以看到正方型占屏幕1/5
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0,0,0, 0,1,0);
// 眼睛睁开的小,等于正方向放大
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);
// 宽高比为2,因为视口没变,所以感觉左右压缩,上下边长(正常显示应该 glViewport(0, 0, w, h/2);即视口的宽高于此一致)
//glViewport(0, 0, w, h/2);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,2,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);
// 裁剪改变,参考正投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,6.1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);
// 摄像机与观察点同时下移2,等于正方体在头顶,被眼睛看到(不是直视),参考正投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,-2, 5, 0,-2,0, 0,1,0);
// 摄像机下移2,等于正方体正方体翻转了,参考正投影(注意与上一个的区别
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,-2, 5, 0,0,0, 0,1,0);
// 上方向为0 -1 0 等于上下颠倒,若是正方向有箭头指向就可以看清
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,-1,0);
今天看了一下国外的开源游戏Warzone ,想学习一下别人的服务端,就顺带翻译了一下他的网络方面的文档;如下
战地2100游戏中的网络相关代码使用TCP来实现对战网络,它可以由一个中转枢纽或者服务器来重新分配来自其他主机的消息数据(代码见:[source:lib/netplay/netplay.cpp@master lib/netplay/netplay.cpp])。每个主机都会对传到自己机器人和结构的指令负有责任,并且将自己的指令队列里面的消息转发转发给其他主机(指令队列:一个NET_SHARE_GAME_QUEUE message);
在所有客户端上,所有指令都会以相同的顺序执行相同的游戏逻辑时间,所以所有客户端的状态是相同的。状态信息通过syncDebug()函数打印出来,每个游戏时间片打印出来的状态的循环冗余校验码都会在网络中互相传递([source:lib/gamelib/gtime.cpp@master lib/gamelib/gtime.cpp] 中的 GAME_GAME_TIME )。如果某个时间片的消息没有按时送达,则游戏必须暂停(可能会增大指令发送和指令处理之间的公共延时来填补之后网络的滞后)。每个客户端的CRC冗余码都会进行比较来确认所有的客户端都有相同的游戏状态。
如果客户端没有相同的游戏状态,所有玩家已发出的打印的状态会被保存(在通过网络自动转发给你之后。)。项目里还有一些老的同步代码打算再次同步游戏状态如果客户端没有回复同意([source:src/multisync.cpp@master src/multisync.ppc]中),(在2.3以及之前的版本,游戏状态从未同步,所以这段代码曾经需要), 但是再次同步的代码实际上没有太大的用途,在未来可能会移除。
如果游戏客户端不知何故变得不同步,游戏状态的打印数据保存在~/.warzone2100-master/logs/desync[TIME]_p[CLIENT].txt中([TIME]是游戏逻辑时间,[CLIENT]是玩家数量)。为了查明为什么会不同步,会对之前的文件和不同的客户端进行对比(要确保对比的不是上一次游戏的数据),通过对数据逐一对比来找出哪个打印数据是错乱的源头。希望能通过它来猜测出导致这个不同数据的原因,并且解决它。
诸如炮弹之类的东西的数据不会通过网络进行转发。相反,每个玩家处理每个游戏物件并且计算出诸如物件哪里会着火,并在那个方向发生炮弹。由于每个客户端都有相同的代码和相同的数据,他们将在同一个目标上着火(在2.3版本及之前版本,这些话不完全正确,没有人会再谁向射击上达成共识)。每个对象有针对性的检查打击和毁灭,如果毁灭了,所有客户端都知道并且不需要发送任何网络消息。
战地2100这款游戏曾经被设计的让游戏开始时获得东西非常轻松,在发送决定给其他主机时也没有任何的数据封锁或者权限要求。预测错误并且尝试在检查阶段改正。正如你猜测的那样,这倒是了很多怪异事情的发生,没有人确认坦克在哪里,随机坦克随机爆炸,每个人都以为大家在作弊。
有很多东西需要在网络代码中进行改进:
1、TCP 连接枢纽模型不是特别的稳定有效,也就是说如果主机崩溃了,其他客户端也会随之崩溃。但是常理来讲应该每个客户端都要尝试连接其他客户端并且在另一个枢纽崩溃的情况下继续尝试连接。
2、用TCP取代UDP使得实现变得简单了许多,但是大多数的游戏使用P2P分布式决策系统或者使用UDP以达到快速传输和低开销的目的。
3、应该有一个玩家掉线重新连接的逻辑。