|
|
首先,我要的是可以基于像素的卷动效果,所以直接使用和屏幕相同大小的surface是不可能实现的,那么必然得用一块比屏幕宽度宽2个tile宽的surface,至于为什么这样做我会在后面讲到。然后先看看我的想法:
先不考虑游戏中任何精灵,我们先考虑只是背景卷动的情景,在这之前我得说说两类坐标,一个是世界坐标,一个是屏幕坐标:
世界坐标:world_x , world_y;
屏幕坐标:scroll_x, scroll_y;
会变化的只有屏幕坐标,游戏的渲染也是根据屏幕坐标来进行的,世界坐标起什么作用呢?我只会用它的数据来做碰撞检测!游戏开始的时候,世界坐标和屏幕坐标都为0。
//判断卷轴是否卷动
if (press(left) && (scroll_x > world_x) )
{
//进行越界判断
scroll_x -= scroll_dx;
if(scroll_x<=world_x)
{
scroll_x = world_x;
}
}
else
if(press(right) && (scroll_x < world_x + world_width) )
{
scroll_x+= scroll_dx;
if(scroll_x > world_x + world_width - scroll_width)
{
scroll_x = world_x + world_width - scroll_width;
}
}
//渲染画面
首先得分配一个页面,取名为:clever_surface; 譬如,屏幕大小为640 * 480, 那么这个页面的大小就应该是:
(640+tile_width) * 480;
现在我可以解释为什么会用到这个技巧:
因为游戏中的地图数据是2维数组的形式: map[MAP_HEIGHT][MAP_WIDTH];
所以我贴图也只能是tile的方式,设想一种情况,屏幕的左端只看见一个砖块的一半因该怎么贴?很显然,直接往屏幕上贴图是不现实的。。所以我分配了一个比屏幕宽1个tile 宽度的surface,目的就在于先把完整的tile贴好,然后再把真正应该显示到屏幕上的surface rect复制到屏幕上。
posx_in_map = scroll_x/TILE_WIDTH ;
裁减量:
clip_x = scroll_x - posx_in_map *TILE_WIDHT; //you should use this when you clip surface.
for(int j = 0; j <= 14; j++)
for(int i = posx_in_map; i <= posx_in_map + 20; i++)
{
switch(tile.style)
{
case BLOCK:
blit tile(0,0) to clever_surface();
break;
//and other case.
}
}
那么剩下的就简单了。。
把这个clever_surface的rect(clip_x,0,640,480) 贴到屏幕surface的rect(0,0,640,480)就ok
。
|
|