1、为多边形创建边界矩形同创建边界球是采取相同的方式,但你需要找出四条边而不是半径。为了找出(max_x, min_x, max_y, min_y)的值,可采取如下的简单算法:
① 初始化(max_x = 0, min_x = 0, max_y = 0, min_y = 0),这是假设多边形的中心在(0, 0)。
② 对多边形的每个顶点,计算(max_x, min_x, max_y, min_y)的(x, y)分量,并进行近似调整。
2、判断点是否在多边形中: 如果进行检测的多边形是一个凸多边形,你可以想象将每条边延长至无限长,从而平面被分割成两半,如果检测的点是在每个半空间的内侧,根据凸多边形的性质,点一定是在多边形的内部。 将直线以一定顺序进行标记,并将之转变为矢量,之后将每条线段想象成一个平面,使用点积操作符,便可以确定是在平面的哪一侧还是恰好就在平面上。
3、实际情况中,游戏有时需要将帧速度锁定在某个值,比如30fps,实现帧速锁定的一个较好的方法是在循环开始时启动一个定时器(或记下当时的时间),然后再游戏循环的结尾处检测是否满足30fps,也就是看看是否经过了三十分之一秒,如果是的话,则显示下一帧,如果不是,则等待知道剩余时间耗尽为止。
int Game_Main(void *parms = NULL, int num_parms = 0)
{
Get_Clock();
//do works
Wait_Clock();
}
DWORD Get_Clock(void)
{
return(GetTickCount());
}
DWORD Start_Clock(void)
{
return (start_clock_count = Get_Clock());
}
DWORD Wait_Clock(DWORD count)
{
while((Get_Clock() - start_clock_count) < count)
return (Get_Clock());
}
4、DirectX有一个垂直空白(Vertical Blank)检测函数,可以在电子枪渲染图像时使用它来测量它的状态。WaitForVerticalBlank()。 垂直空白:当电子枪完成绘制所有扫描线,它必须回到显示设备的最上端,电子枪复位回到显示设备的最上端的这段时间叫做垂直空白。
5、 页面卷轴(Page Scrolling) 基本上是指当玩家在屏幕上四处走动或越过了某个阀值的时候,整个屏幕会随之更新,就好像是玩家走进了另一个房间一样。
6、使用大块DirectDraw表面实现平滑卷动:
7、稀疏位图平铺显示引擎: 平铺显示引擎的位移问题是需要画很多位图,有时想编写一个卷动游戏,但是并没有太多的图形需要卷动,也并不希望所有的tile都有相同的尺寸。对于这类的游戏世界,可以创建一个很大的全局图形,比如说让我们用4*4个屏幕(或者40*40)。然后,我们不用tile地图填充每一个子屏幕,而仅仅将每个对象放在世界坐标系的某个位置。
8、等轴侧(Isometric,ISO)游戏,实际上就是采用一定倾斜的视角的游戏,如45度。
实现ISO 3D有三种方法:
① 基于单元,全二维
② 基于全屏,具有一些二维或三维的碰撞网络
③ 采用全三维数学运算,使用一个固定的相机视角
方法1:基于单元,全二维
首先需要确定一个视角,根据它来画所有的图片。一般地,需要将所有的东西都画成矩形tile,就像你在普通卷轴引擎里做的那样。 渲染时有一定的技巧,当绘制场景时,你不能以随意的顺序画对象,而必须使远的对象被近的对象所遮盖。原则是,从后往前画。
① 初始化(max_x = 0, min_x = 0, max_y = 0, min_y = 0),这是假设多边形的中心在(0, 0)。
② 对多边形的每个顶点,计算(max_x, min_x, max_y, min_y)的(x, y)分量,并进行近似调整。
2、判断点是否在多边形中: 如果进行检测的多边形是一个凸多边形,你可以想象将每条边延长至无限长,从而平面被分割成两半,如果检测的点是在每个半空间的内侧,根据凸多边形的性质,点一定是在多边形的内部。 将直线以一定顺序进行标记,并将之转变为矢量,之后将每条线段想象成一个平面,使用点积操作符,便可以确定是在平面的哪一侧还是恰好就在平面上。
3、实际情况中,游戏有时需要将帧速度锁定在某个值,比如30fps,实现帧速锁定的一个较好的方法是在循环开始时启动一个定时器(或记下当时的时间),然后再游戏循环的结尾处检测是否满足30fps,也就是看看是否经过了三十分之一秒,如果是的话,则显示下一帧,如果不是,则等待知道剩余时间耗尽为止。
int Game_Main(void *parms = NULL, int num_parms = 0)
{
}
DWORD Get_Clock(void)
{
}
DWORD Start_Clock(void)
{
return (start_clock_count = Get_Clock());
}
DWORD Wait_Clock(DWORD count)
{
while((Get_Clock() - start_clock_count)
return (Get_Clock());
}
4、DirectX有一个垂直空白(Vertical Blank)检测函数,可以在电子枪渲染图像时使用它来测量它的状态。WaitForVerticalBlank()。 垂直空白:当电子枪完成绘制所有扫描线,它必须回到显示设备的最上端,电子枪复位回到显示设备的最上端的这段时间叫做垂直空白。
5、 页面卷轴(Page Scrolling) 基本上是指当玩家在屏幕上四处走动或越过了某个阀值的时候,整个屏幕会随之更新,就好像是玩家走进了另一个房间一样。
6、使用大块DirectDraw表面实现平滑卷动:
![Windows <wbr>Game <wbr>Note9 Windows <wbr>Game <wbr>Note9](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
7、稀疏位图平铺显示引擎: 平铺显示引擎的位移问题是需要画很多位图,有时想编写一个卷动游戏,但是并没有太多的图形需要卷动,也并不希望所有的tile都有相同的尺寸。对于这类的游戏世界,可以创建一个很大的全局图形,比如说让我们用4*4个屏幕(或者40*40)。然后,我们不用tile地图填充每一个子屏幕,而仅仅将每个对象放在世界坐标系的某个位置。
![Windows <wbr>Game <wbr>Note9 Windows <wbr>Game <wbr>Note9](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
8、等轴侧(Isometric,ISO)游戏,实际上就是采用一定倾斜的视角的游戏,如45度。
实现ISO 3D有三种方法:
① 基于单元,全二维
② 基于全屏,具有一些二维或三维的碰撞网络
③ 采用全三维数学运算,使用一个固定的相机视角
首先需要确定一个视角,根据它来画所有的图片。一般地,需要将所有的东西都画成矩形tile,就像你在普通卷轴引擎里做的那样。 渲染时有一定的技巧,当绘制场景时,你不能以随意的顺序画对象,而必须使远的对象被近的对象所遮盖。原则是,从后往前画。