2d游戏斜视角舆图的实现
副标题#e#
说明:
一、本措施是一个斜视角舆图的滚屏演示。本措施在实现的时候并没有思量屏幕渲染效率和内存空间的节减问题。所以舆图绘制函数并没有对不行视的图块部门举办解除。本措施的实现完全回收了win32汇编语言,因此回收gdi接口也能得到较好的帧速。
二、本措施反应了2d游戏舆图的节制思路。即,焦点问题是几个坐标调动问题,办理了坐标调动就可以了。
1、生存舆图的一维数据索引。需要把这个一维数组索引转酿成舆图坐标,即(列号,行号)。完成这一步今后,画图措施才气遍历整个一维数组,就象遍历
一个二维的舆图块数组一样。即通过数组索引确定它是在舆图上的坐标。
2、舆图坐标—-图块列号、行号。舆图坐标转酿成屏幕贴图坐标。因为舆图坐标是(列号、行号),所以必需要通过舆图坐标求解出舆图块左上角的像素坐标,即贴图坐标。
3、举办视调动。即,舆图很大的时候,把视口进行在舆图长举办平移就可以实现舆图的转动,看到差异的部门。所以,一旦视口的左上角在舆图上的绝对坐标确定下来,那么一个舆图块在视口内部的相对坐标——最终的窗口客户区贴图坐标就可以求出。
4、颠末上面几步调动,一个舆图块就真正的可以被绘制到窗口内里。
三、帧速节制:
a、用变量timeOld记录上次计较帧速竣事的时间。
b、变量timeNew记录当前时间。
c、用变量frameCount记录从timeOld到timeNew的隔断里一共播放的帧数。
d、每次获取当前时间timeNew今后,求自从
上次计较帧速竣事到此刻一共有几多时间(ms):timeNew – timeOld
当这个时距离断大于1秒,就举办一次帧速计较,而且令timeOld = timeNew,frameCount也归零,筹备以后刻从头记录帧播放,以备在下一秒举办计较。
e、用timeCur举办时间跟踪,以便帧速节制。
timeCur记录上次播放一帧竣事的时间。timeNew – timeCur暗示自从上次播放一帧到此刻颠末尾几多时间。
所以假如每次当 timeNew – timeCur > 10的时候才举办一帧的播放,然后令timeCur = timeNew,以便举办下一帧播放时距离断的节制。这样我们就可以节制在每个10ms内最多播放一帧,即对帧速举办了节制。
#p#副标题#e#
代码说明:
本例子主要的代码是舆图绘制函数,舆图绘制函数实现了几个坐标调动。
DrawMap proc hdc1:HDC
LOCAL i:DWORD
LOCAL row:DWORD
LOCAL col:DWORD
LOCAL xAbs:DWORD
LOCAL yAbs:DWORD
LOCAL vx:DWORD
LOCAL vy:DWORD
LOCAL vp:POINT
invoke BitBlt,buffer,0,0,640,480,bgDC,0,0,SRCCOPY
mov i,0
.repeat
;把数组索引转酿成舆图坐标
xor edx,edx
mov eax,i
mov ebx,20
div ebx
mov row,edx
mov col,eax
;把舆图坐标转酿成贴图坐标(绝对坐标)
mov eax,row
mov ebx,64/2
mul ebx
mov xAbs,eax
mov eax,col
mul ebx
sub xAbs,eax
mov eax,xstart
add xAbs,eax
mov eax,col
mov ebx,32/2
mul ebx
mov yAbs,eax
mov eax,row
mul ebx
add yAbs,eax
mov eax,ystart
add yAbs,eax
;按照视口坐标,把贴图坐标转酿成窗口(视口)坐标
mov eax,xAbs
sub eax,viewRect.left
mov vx,eax
mov eax,yAbs
sub eax,viewRect.top
mov vy,eax
;举办屏幕贴图
mov eax,i
.if mapInfo[eax]==0
invoke BitBlt,buffer,vx,vy,64,32,tile0,64,0,SRCAND
invoke BitBlt,buffer,vx,vy,64,32,tile0,0,0,SRCPAINT
.elseif mapInfo[eax]==1
invoke BitBlt,buffer,vx,vy,64,32,tile1,64,0,SRCAND
invoke BitBlt,buffer,vx,vy,64,32,tile1,0,0,SRCPAINT
.elseif mapInfo[eax]==2
invoke BitBlt,buffer,vx,vy,64,32,tile2,64,0,SRCAND
invoke BitBlt,buffer,vx,vy,64,32,tile2,0,0,SRCPAINT
.else
invoke BitBlt,buffer,vx,vy,64,32,tile3,64,0,SRCAND
invoke BitBlt,buffer,vx,vy,64,32,tile3,0,0,SRCPAINT
.endif
;
add i,1
.until i==400
;处理惩罚风景
mov i,0
.repeat
;把数组索引转酿成舆图坐标
xor edx,edx
mov eax,i
mov ebx,20
div ebx
mov row,edx
mov col,eax
;把舆图坐标转酿成贴图坐标(绝对坐标)
mov eax,row
mov ebx,64/2
mul ebx
mov xAbs,eax
mov eax,col
mul ebx
sub xAbs,eax
mov eax,xstart
add xAbs,eax
mov eax,col
mov ebx,32/2
mul ebx
mov yAbs,eax
mov eax,row
mul ebx
add yAbs,eax
mov eax,ystart
add yAbs,eax
;按照视口坐标,把贴图坐标转酿成窗口(视口)坐标
mov eax,xAbs
sub eax,viewRect.left
mov vx,eax
mov eax,yAbs
sub eax,viewRect.top
mov vy,eax
;举办屏幕贴图
#p#分页标题#e#
mov eax,i
.if sceneInfo[eax]==1
add vx,7
sub vy,44
invoke BitBlt,buffer,vx,vy,50,60,scene1,50,0,SRCAND
invoke BitBlt,buffer,vx,vy,50,60,scene1,0,0,SRCPAINT
.elseif sceneInfo[eax]==2
add vx,7
sub vy,30
invoke BitBlt,buffer,vx,vy,50,60,scene2,50,0,SRCAND
invoke BitBlt,buffer,vx,vy,50,60,scene2,0,0,SRCPAINT
.endif
;
add i,1
.until i==400
;<<<<<<<<<<<<<<<<<<处理惩罚精灵<<<<<<<<<<<<<<<<<<<<<<<<<<<<
mov eax,viewRect.left
mov vp.x,eax
mov eax,viewRect.top
mov vp.y,eax
invoke GetStatus
.if eax==0
invoke SetDir
.endif
invoke DrawSprite,buffer,vp
;打印措施信息
invoke SetBkMode,buffer,TRANSPARENT
invoke TextOut,buffer,50,300,addr frameInfo,28
invoke TextOut,buffer, 50,350,addr appInfo,sizeof appInfo - 1
invoke TextOut,buffer,55, 400,addr authInfo,sizeof authInfo - 1
invoke SetBkMode,buffer,OPAQUE
invoke BitBlt,hdc1,0,0,640,480,buffer,0,0,SRCCOPY
ret
DrawMap endp