青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

屏幕坐標(biāo)位置的確定用公式計(jì)算:
屏幕的x坐標(biāo)=地圖格子邏輯數(shù)組中的位置X * 格子寬度
屏幕的y坐標(biāo)=地圖格子邏輯數(shù)組中的位置Y * 格子高度/2

得到的圖應(yīng)該是這樣的:

那么這個(gè)公式是怎樣得到呢?




這個(gè)地圖有5行,看著這個(gè)地圖你會(huì)想,怎么拼圖才能將地圖拼出來。再畫張圖來演示:






從這張圖可以看出,拼圖時(shí)從左到右,從上到下,跟正規(guī)的矩形拼圖一樣,唯一同的是,地圖元素與元素之間有重疊,看看第一行和第二行之間,第二行的地圖元素會(huì)壓在第一行的元素上,而第三行的的地圖元素則壓在第二行的元素上。所以,只要找到正確的公式,你就能正確地設(shè)計(jì)程序,再來一張圖:





圖上綠點(diǎn)(是高亮度綠色,不是暗綠色)是每塊地圖元素的起點(diǎn),第一行的行坐標(biāo)是0,第二行的行坐標(biāo)是1,第三行的行坐標(biāo)是2,......由這些行坐標(biāo)決定你的地圖元素的起點(diǎn),從這個(gè)規(guī)律中看出行坐標(biāo)0,和行坐標(biāo)2的橫向坐標(biāo)X的起點(diǎn)是一樣的是0,行坐標(biāo)為1的起點(diǎn)是向右移半塊地圖元素。
再從縱向坐標(biāo)找規(guī)律,看行坐標(biāo)0和行坐標(biāo)2,兩塊地圖元素之間的距離剛好是一塊地圖元素的高。再看看行坐標(biāo)0和行坐標(biāo)1,兩塊地圖元素之間的距離剛好是半塊地圖元素的高。所以,計(jì)算每塊地圖元素的位置,你的轉(zhuǎn)換屏幕坐標(biāo)和邏輯公式剛好是:
logic.y = ( 2 * stage.y ) / TileHeigth;
logic.x = ( stage.x / TileWidth ) - ( logic.y & 1 ) * ( TileWidth / 2 );
stage.x = logic.x * TileWidth + ( logic.y & 1) * ( TileWidth / 2 );
stage.y = logic.y * TileHeigth / 2;
其中TileHeigth和TileWidth是菱形的高和寬,這樣你可以再嘗試著定義(0,1),(0,2),(0,3)等點(diǎn),和得到的結(jié)果完全一樣···

重要:
首先以上的公式只適用于Staggered斜45度角地圖,而slide,和Diamond形地圖,這個(gè)公式要稍加修改才能用。
Staggered:



Slide:



Diamond:




而得到的邏輯坐標(biāo)就是把了斜45度得到的實(shí)際坐標(biāo)么?當(dāng)然不是···
仔細(xì)觀察,如果我們想用一個(gè)直角的坐標(biāo)來表示這個(gè)地圖,那么大家可能開發(fā)起來也更加直觀一些,看這個(gè)坐標(biāo)表示出來的y軸都是扭曲的用起來實(shí)在不爽,那么我們來將它轉(zhuǎn)換到直角坐標(biāo),那么再來加上尋路等算法都沒有任何難度了

首先我們將地圖的高進(jìn)行轉(zhuǎn)換,這個(gè)轉(zhuǎn)換主要是將菱形還原成正方形,例如菱形的高寬比是2:1,那么在地圖上則需要將地圖高度擴(kuò)大一倍,然后旋轉(zhuǎn)-45度,那么得到對(duì)應(yīng)坐標(biāo)如下




我們更加仔細(xì)的對(duì)這個(gè)圖的坐標(biāo)進(jìn)行

 1 /*
 2  
 3 * @author myth815 
 4 */ 
 5 package ContainerObjectManager 
 6 
 7 import flash.geom.Point; 
 8 import Math; 
 9 public class PointExchange 
10 
11 private static var TileWidth : int = 60
12 private static var TileHeigth : int = 30
13 public function PointExchange() 
14 
15 //this Class not allow init! 
16 
17 
18 public static function StageToLogic(stage:Point):Point 
19 
20 var logic : Point = new Point; 
21 logic.y = ( 2 * stage.y ) / TileHeigth; 
22 logic.x = ( stage.x / TileWidth ) - ( logic.y & 1 ) * ( TileWidth / 2 ); 
23 return logic; 
24 
25 
26 public static function LogicToStage(logic:Point):Point 
27 
28 var stage : Point = new Point; 
29 stage.x = logic.x * TileWidth + ( logic.y & 1* ( TileWidth / 2 ); 
30 stage.y = logic.y * TileHeigth / 2
31 return stage; 
32 
33 
34 

標(biāo)注:

 

  1 比方說定義格子的長(zhǎng)度(W=80像素),高度(H=40像素)    
  2 Constants.TILE_WIDTH = 80;    
  3 Constants.TILE_HEIGHT= 40;    
  4 1:格子坐標(biāo)與像素坐標(biāo)的互相轉(zhuǎn)換公式    
  5 1.1:格子坐標(biāo)轉(zhuǎn)像素坐標(biāo)   
  6    /**  
  7      * 像素坐標(biāo)轉(zhuǎn)換成斜45度的格子坐標(biāo)  
  8      * @param px  像素X坐標(biāo)  
  9      * @param py  像素Y坐標(biāo)  
 10      * @return  
 11      */  
 12     public static short[] pixToTile(int px,int py){   
 13         int ty= 2*py/Constants.TILE_HEIGHT-1;   
 14         if(ty<0){   
 15             log.error("ty:"+py);   
 16             ty = 0;   
 17         }   
 18         int tx= (px-(ty&1)*(Constants.TILE_WIDTH/2))/Constants.TILE_WIDTH;   
 19         if(tx<0){   
 20             log.error("tx:"+px);   
 21             tx = 0;   
 22         }   
 23         return new short[]{(short)tx,(short)ty};   
 24     }   
 25 1.2:像素坐標(biāo)轉(zhuǎn)格子坐標(biāo)   
 26 /**  
 27      * 斜45度的格子坐標(biāo)轉(zhuǎn)換成像素坐標(biāo)  
 28      * @param tx 斜45度的格子X坐標(biāo)  
 29      * @param ty 斜45度的格子Y坐標(biāo)  
 30      * @return  
 31      */  
 32     public static short[] tileToPix(int tx,int ty){   
 33         int px=(tx*Constants.TILE_WIDTH+((ty&1)+1)*(Constants.TILE_WIDTH/2));   
 34         int py=(ty+1)*(Constants.TILE_HEIGHT/2);   
 35         return new short[]{(short)px,(short)py};   
 36     }   
 37   
 38   
 39   
 40 2:兩格子坐標(biāo)四方向相差的格子數(shù)計(jì)算    
 41   
 42 /**  
 43      * 忽略地圖地形(計(jì)算兩個(gè)格子之間經(jīng)過的格子數(shù))  
 44      * @param bx 開始格子X坐標(biāo)  
 45      * @param by 開始格子Y坐標(biāo)  
 46      * @param ex 目標(biāo)格子X坐標(biāo)  
 47      * @param ey 目標(biāo)格子Y坐標(biāo)  
 48      * @return  
 49      */  
 50     public static int getTileNumFromTile(short bx,short by,short ex,short ey){   
 51         short[] beginPix =  tileToPix(bx,by);   
 52         short[] endPix =  tileToPix(ex,ey);   
 53         int subX = Math.abs(endPix[0]-beginPix[0])/(Constants.TILE_WIDTH/2);   
 54         int subY = Math.abs(endPix[1]-beginPix[1])/(Constants.TILE_HEIGHT/2);   
 55         return Math.max(subX, subY);   
 56     }   
 57   
 58 3:靠近某目標(biāo)格子的相關(guān)計(jì)算    
 59   
 60 /**  
 61      * 獲取以此格子坐標(biāo)(x,y)為中心的四個(gè)方向的其他格子坐標(biāo)  
 62      * @param x  
 63      * @param y  
 64      * @return  
 65      */  
 66     public static short[][] getNext4(short x,short y){   
 67         short[][] nextXy= new short[4][2];   
 68         //Y坐標(biāo)偶數(shù)時(shí) X坐標(biāo)減1   
 69         if(y%2==0){   
 70             short preX = (short)(x-1);   
 71             short preY = (short)(y-1);   
 72             short nexY = (short)(y+1);   
 73             nextXy[0]=new short[]{preX,preY};   
 74             nextXy[1]=new short[]{preX,nexY};   
 75             nextXy[2]=new short[]{x,preY};   
 76             nextXy[3]=new short[]{x,nexY};   
 77         }else{   
 78             short preY = (short)(y-1);   
 79             short nexY = (short)(y+1);   
 80             short nextX = (short)(x+1);   
 81             nextXy[0]=new short[]{x,preY};   
 82             nextXy[1]=new short[]{x,nexY};   
 83             nextXy[2]=new short[]{nextX,preY};   
 84             nextXy[3]=new short[]{nextX,nexY};   
 85         }   
 86         return nextXy;   
 87     }   
 88   
 89   
 90 /**  
 91      * 找出最短格子路線  
 92      * @param map 地圖數(shù)據(jù)  
 93      * @param begin 起點(diǎn)位置數(shù)據(jù)  
 94      * @param end 目標(biāo)位置格子坐標(biāo)  
 95      * @param moveAbility 可移動(dòng)的格子數(shù)  
 96      * @param areaNum 所占格子數(shù)  
 97      * @param isOmit 忽略地形  
 98      * @return  
 99      */ public static Object[] findMinTileLine(byte[][]map,SlgNode begin,short[] end,byte moveAbility,byte areaNum,boolean isOmit){   
100         //最小格子數(shù)   
101         int minNums = getTileNumFromTile(begin.getTx(),begin.getTy(),end[0],end[1]);   
102         if(minNums<2)return null;   
103         if(areaNum>1){   
104             short[][] infos = getTopArea(begin.getTx(),begin.getTy(),areaNum);   
105             for(int i=1;i<infos.length;i++){   
106                 int tmpNums = getTileNumFromTile(infos[i][0],infos[i][1],end[0],end[1]);   
107                 if(tmpNums<minNums){   
108                     minNums = tmpNums;   
109                     if(minNums < 2return null;   
110                 }   
111             }   
112         }   
113         int curr=0;   
114         SlgNode node = begin;   
115         while(curr<moveAbility){   
116             //找出周圍四個(gè)格子離目標(biāo)的位置   
117             short[][] data = getNext4(node.getTx(),node.getTy());   
118             SlgNode minNode = null;   
119                             int   omit = (isOmit?2:1);   
120   
121             for(int i=0;i<data.length;i++){   
122                 short tx =data[i][0],ty =data[i][1];   
123                                 //格子位置是否合法(沒有被障礙物阻止)   
124                 if(ty>=0&&ty<map.length&&tx>=0&&tx<map[0].length&&map[ty][tx]<omit){   
125                     int tmpNums = getTileNumFromTile(tx,ty,end[0],end[1]);   
126                     boolean isFlag = true;   
127                     //如果是占用多格子的檢測(cè)其他的格子是否合法   
128                     if(areaNum>1){   
129                         short[][] infos = getTopArea(tx,ty,areaNum);   
130                         for(int j=1;j<infos.length;j++){   
131                             short tx0 = infos[j][0],ty0=infos[j][1];   
132                             if(ty0<map.length&&tx0 <map[0].length && ty0>=0&&tx0>=0&&map[ty0][tx0]<omit){   
133                                 if(tmpNums>1){   
134                                     int tmpNums0 = getTileNumFromTile(tx0,ty0,end[0],end[1]);   
135                                     if(tmpNums0<tmpNums)tmpNums = tmpNums0;   
136                                 }   
137                             }else{   
138                                 isFlag = false;break;   
139                             }   
140                         }   
141                     }   
142                     if(tmpNums<minNums && isFlag){   
143                         minNode= new SlgNode(tx,ty,(byte)(node.getLen()+1));   
144                         minNode.setParent(node);   
145                         if(tmpNums<2)return new Object[]{minNode,tmpNums};   
146                         minNums = tmpNums;   
147                     }   
148                 }   
149             }   
150             if(minNode==null)return curr==0?null:new Object[]{minNode,minNums};   
151             curr++;   
152             node = minNode;   
153         }   
154         return new Object[]{node,minNums};   
155     }   
156   
157   
158   
159 /**  
160  * SLG移動(dòng)格子坐標(biāo)數(shù)據(jù)定義  
161  * @author Administrator  
162  *  
163  */  
164 public class SlgNode implements Comparable<SlgNode>{   
165     //格子坐標(biāo)   
166     private short tx;   
167     private short ty;   
168     //父節(jié)點(diǎn)   
169     private SlgNode parent;   
170     //步長(zhǎng)   
171     private byte len;   
172        
173     public SlgNode(){   
174            
175     }   
176        
177        
178     public SlgNode(short tx,short ty,byte len){   
179         this.tx = tx;   
180         this.ty= ty;   
181         this.len = len;   
182     }   
183        
184     public short getTx() {   
185         return tx;   
186     }   
187     public void setTx(short tx) {   
188         this.tx = tx;   
189     }   
190     public short getTy() {   
191         return ty;   
192     }   
193     public void setTy(short ty) {   
194         this.ty = ty;   
195     }   
196     public SlgNode getParent() {   
197         return parent;   
198     }   
199     public void setParent(SlgNode parent) {   
200         this.parent = parent;   
201     }   
202     public byte getLen() {   
203         return len;   
204     }   
205     public void setLen(int len) {   
206         this.len = (byte)len;   
207     }   
208        
209     public static String getCode(int x,int y){   
210         return x+"_"+y;   
211     }   
212        
213     public String getCode(){       
214         return getCode(tx,ty);   
215     }   
216        
217     public String toString(){   
218         StringBuilder path = new StringBuilder().append("[").append(tx).append(",").append(ty).append("][").append(len).append("]");   
219         if(this.parent!=null){   
220             path.append("->").append(this.parent.toString());   
221         }   
222         return path.toString();   
223     }   
224   
225     public int compareTo(SlgNode o) {   
226         if(len>0 && o.getLen()>0){   
227             return len-o.getLen();   
228         }else if(o.getLen()>0){   
229             return 1;   
230         }   
231         return 0;   
232     }   
233 }  
234 

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99精品黄色片免费大全| 国产精品毛片在线| 欧美一级免费视频| 亚洲日本成人| 欧美 日韩 国产 一区| 久久大综合网| 国产欧美一区二区三区在线老狼 | 狠狠综合久久| 性欧美超级视频| 欧美影院久久久| 国产精品一区久久久久| 宅男噜噜噜66国产日韩在线观看| 亚洲国产网站| 欧美成人国产一区二区| 亚洲欧美99| 国产精品色网| 亚洲欧美一区二区三区在线| 久久av免费一区| 国产手机视频一区二区| 久久久高清一区二区三区| 免费久久久一本精品久久区| 亚洲国产美女精品久久久久∴| 嫩草影视亚洲| 99热精品在线观看| 亚洲欧美色一区| 国产一本一道久久香蕉| 久久国产精品久久久| 欧美成人一区二区三区在线观看 | 一区一区视频| 免费亚洲一区二区| 日韩亚洲欧美高清| 亚欧成人在线| 精品1区2区| 欧美高潮视频| 在线视频你懂得一区| 久久经典综合| 亚洲欧洲精品天堂一级| 欧美日韩一卡| 亚洲欧美激情一区| 国产精品一区久久| 久久综合狠狠综合久久综青草| 亚洲成色最大综合在线| 亚洲视频在线看| 国产一区二区三区不卡在线观看| 久久艳片www.17c.com| 亚洲精品视频在线看| 性欧美长视频| 亚洲黄色高清| 国产精品久久久久一区| 久久久久天天天天| 99热在这里有精品免费| 久久婷婷亚洲| 国产精品第一区| 久久久人人人| 亚洲天堂网在线观看| 男人插女人欧美| 午夜国产精品视频免费体验区| 黄色亚洲精品| 国产精品国产三级国产普通话三级 | 欧美日本簧片| 性刺激综合网| 亚洲精品久久久久久一区二区| 欧美在线1区| 99精品国产高清一区二区| 国产一区二区三区免费在线观看| 亚洲免费不卡| 亚洲视频免费| 欧美一区久久| 99视频精品全国免费| 免费永久网站黄欧美| 亚洲欧美中文在线视频| 亚洲精品麻豆| 一区二区亚洲| 国产偷国产偷亚洲高清97cao| 欧美看片网站| 免费国产自线拍一欧美视频| 性色av一区二区三区| 一本大道av伊人久久综合| 欧美福利电影在线观看| 久久视频免费观看| 午夜免费日韩视频| 中文日韩欧美| 99精品99| 亚洲精品日日夜夜| 在线精品视频一区二区| 国产日韩专区| 欧美午夜视频一区二区| 欧美国产先锋| 亚洲国产精品久久久久秋霞不卡 | 国产精品久久网| 欧美成人小视频| 欧美一区二区精品在线| 亚洲乱码国产乱码精品精| 久久综合久久综合九色| 香蕉久久国产| 国产一区再线| 国内精品美女在线观看| 国产精品爱久久久久久久| 欧美3dxxxxhd| 久久视频在线视频| 欧美在线播放视频| 亚洲综合另类| 亚洲欧美日韩在线观看a三区 | 久久av一区二区三区| 亚洲国产成人在线| 亚洲免费一区二区| 亚洲二区在线| 国产精品乱子久久久久| 欧美日韩亚洲一区二区三区在线观看 | 国产精品区二区三区日本 | 久久国产精品久久久久久电车| 国产精品99久久久久久白浆小说| 亚洲国产精品精华液网站| 一区二区三区在线免费观看| 国产综合色精品一区二区三区| 国产乱码精品| 国产精品自在欧美一区| 国产精品久久一区主播| 国产欧美日韩不卡免费| 国产美女一区二区| 国产精品无码永久免费888| 国产精品大全| 国产精品成人观看视频免费| 欧美日韩视频在线一区二区 | 久久久久久一区二区| 久久精品道一区二区三区| 欧美一级大片在线观看| 亚洲另类在线视频| 亚洲清纯自拍| 国产视频亚洲| 狂野欧美激情性xxxx欧美| 久久精品日韩一区二区三区| 欧美在线黄色| 久久久久久电影| 久久亚洲精品一区| 欧美第一黄网免费网站| 欧美国产日韩一区二区三区| 欧美精品在线视频| 国产精品www网站| 国产日韩欧美亚洲| 亚洲麻豆国产自偷在线| 正在播放日韩| 香蕉国产精品偷在线观看不卡| 久久av资源网站| 久久亚洲一区二区| 亚洲高清电影| 日韩亚洲在线| 日韩视频一区二区三区| 一区二区电影免费在线观看| 亚洲影视在线| 另类专区欧美制服同性| 欧美激情一区二区三区成人 | 午夜精品久久久| 久久亚洲二区| 亚洲精品美女免费| 亚洲一区二区三区影院| 久久精品国产清自在天天线| 亚洲一区二区三区四区中文| 免费在线看一区| 国产精品福利网站| 国内精品模特av私拍在线观看| 亚洲精品黄色| 欧美一区二区视频观看视频| 卡通动漫国产精品| 欧美成人免费大片| 欧美一二三区精品| 欧美韩日一区| 国产日产亚洲精品| 亚洲免费激情| 久久琪琪电影院| 欧美激情成人在线视频| 亚洲欧美视频在线观看| 欧美顶级少妇做爰| 国产日韩精品一区二区三区| 亚洲激情视频在线| 欧美一区二区视频在线| 亚洲第一搞黄网站| 99综合精品| 欧美日韩国产成人在线观看| 国产亚洲欧美一区| 亚洲无限乱码一二三四麻| 蜜桃视频一区| 亚洲欧美日韩国产| 美国成人毛片| 亚洲国产精品久久久久久女王 | 国产精品成人免费精品自在线观看| 一区在线播放视频| 欧美资源在线| 一本不卡影院| 欧美激情a∨在线视频播放| 欧美新色视频| 亚洲一区二区三区免费观看 | 亚洲午夜精品久久| 日韩视频在线一区| 久久综合九九| 国产一区亚洲一区| 翔田千里一区二区| 一本一本久久a久久精品牛牛影视| 另类亚洲自拍| 黄色国产精品一区二区三区|