RPG游戏中地图占很重要的一部份。它是游戏展开的平台。所以我对使用地图的接口简化的很简单,必然太过复杂带来使用上的不便。
地图的接口:设置地图大小、设置地图块的大小、地图切换到指定ID的场景、根据指定的图片和地图块的大小生成地图。
RPG地图一般都是多层的:背景层、遮挡物,还有事件。背景层主要根据地图块进行地图场景的绘制。遮挡物则主要是可能发生事件、产生遮挡和阻挡关系的物体。事件是和地图区域绑定的,实际上也是地图块绑定的。因为角色在不动时或在前进时所有相关的检测都是和地图块相关的。
这里难点可能还是地图的拼接,地图的绘制都是很简单的事件。而拼接的难点导致了地图遮挡的难点。这里对这几个难点做一介绍:
1 地图的拼接:在斜45度中地图的行和一般意义上的行不同,它的行是锯齿形的,先对行上的块进行编号,偶数处于正常意义上的顺序位置,而奇数的则是在偶数的斜45度方向上进行绘制。
2 遮挡的判断:因为是斜45度视角,所以遮挡的判断不能依据90度的判断,单纯的x或y不能比较出谁在前,谁在后。如果我们在自己的视角前画切面,那么与地图的交面出会出现一条与地图坐标成45度的直线,那么这条直线就是我们要进行比较的依据。谁前谁后要看这条线谁离预原点远了。那就是看x+y=b中的b的值大小了。好了,到此因该明白了吧。还有一点就是当b相同时,可能要看谁y大了。OK大家应该明白了吧
地图的接口:设置地图大小、设置地图块的大小、地图切换到指定ID的场景、根据指定的图片和地图块的大小生成地图。
RPG地图一般都是多层的:背景层、遮挡物,还有事件。背景层主要根据地图块进行地图场景的绘制。遮挡物则主要是可能发生事件、产生遮挡和阻挡关系的物体。事件是和地图区域绑定的,实际上也是地图块绑定的。因为角色在不动时或在前进时所有相关的检测都是和地图块相关的。
这里难点可能还是地图的拼接,地图的绘制都是很简单的事件。而拼接的难点导致了地图遮挡的难点。这里对这几个难点做一介绍:
1 地图的拼接:在斜45度中地图的行和一般意义上的行不同,它的行是锯齿形的,先对行上的块进行编号,偶数处于正常意义上的顺序位置,而奇数的则是在偶数的斜45度方向上进行绘制。
startCol = g.getClipX()/20;endCol = (g.getClipX() +g.getClipWidth())/20 + 2; startRow = g.getClipY()/20;endRow = (g.getClipY() +(tmp = g.getClipHeight()))/20 + 2; for (int row = startRow - 1; row < endRow; row++) { //y = row*tileHeight; i = 0; if(row < 0 || row >= this.grid[0].length)continue; for (int col = ((startCol - 1)<<1); col < (endCol<<1); col++) { if(col < 0||col >= this.grid.length)continue; x = (col>>1) * this.tileWidth ; y = row * this.tileHeight; // this.drawCell(g, x, y, col, row); this.drawImage(this.tiles,g,x,y,20); //绘制奇数列 col++; x = x + halfW; y = y+ halfH; this.drawImage(this.tiles,g,x,y,20); } } |
2 遮挡的判断:因为是斜45度视角,所以遮挡的判断不能依据90度的判断,单纯的x或y不能比较出谁在前,谁在后。如果我们在自己的视角前画切面,那么与地图的交面出会出现一条与地图坐标成45度的直线,那么这条直线就是我们要进行比较的依据。谁前谁后要看这条线谁离预原点远了。那就是看x+y=b中的b的值大小了。好了,到此因该明白了吧。还有一点就是当b相同时,可能要看谁y大了。OK大家应该明白了吧