2次元空間でパスを見つける:AStarコンポーネント(アクションスクリプト3.0)

この記事は、A *アルゴリズムを使用した最も単純なパス検索を実装するAStarコンポーネントの説明です。 このアルゴリズムの実装には多くのソースコードがありますが、私が提案するコンポーネントは使いやすく、十分に文書化されています。 メソッドとプロパティの数が少ないにもかかわらず、このコンポーネントは非常に柔軟であり、多くの分野に適用できます(もちろん、ゲーム開発者は最も気に入っています)。 コンポーネントは、読者の希望とコメントに従ってさらに開発されます。 したがって、私はメールまたはコメントで私に書いてくれることに興味があるすべての人にお願いします。





コンポーネントファイルは次の場所にあります。

1) depositfiles.com/files/ptsxof3p9

2) ifolder.ru/14260428



検索の本質



検索を成功させるには、特定のエンティティが移動してパスを検索する平面を「タイル」に分割する必要があります(図1を参照) 。 原則として、このようなフィールドに関する情報をオブジェクトの2次元配列に格納します。

画像

図1-「タイル」のフィールド(ペイントされたタイルは障害物です)



最も単純な場合の「タイル」を説明する各オブジェクト(今後は「タイル」ではなく「ノード」という用語に切り替えましょう)では、その座標が画面に保存され、このタイルが障害物かどうかのサインが保存されます。 原則として、これはブール式であり、 trueの場合、このノードは障害物であり、 falseの場合通過するフリーノードです。 コンポーネントを開発するときに、「 障害マップ 」という用語を作成しました;コンポーネントの動作を説明するのに役立ちます。 障害マップは、各ノードの開通性(ノードが障害であるかどうか)を特徴付けるブール式を格納する2次元配列です。 障害物マップに基づいて、コンポーネントはパスを検索します。

次に、最も単純な例を使用して障害物マップを作成し、コンポーネントのメソッドに進みましょう。 5 x 7のフィールドを作成し、一部のセルを通過できないようにする場合、次のようにします。



1)各ノードをfalseに設定して障害物マップを初期化します-通過する無料のノード

var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();





a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);





, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}







, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);



! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);



onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>



, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);



, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .












var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}



, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];





. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];





. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];





. , .
















var obstacle_map:Array=[];

for ( var i: int =0; i<5; i++) {

obstacle_map[i]=[];

for ( var j: int =0; j<5; j++) {

obstacle_map[i][j]= false ;

}

}












2) , true.



obstacle_map[0][0]= true ;

obstacle_map[1][1]= true ;

obstacle_map[2][1]= true ;

obstacle_map[2][3]= true ;

obstacle_map[3][3]= true ;

obstacle_map[4][3]= true ;

obstacle_map[0][4]= true ;













, 2 – .



2 –



, , AStar.







, , , :

var a_star:AStar= new AStar();









a_star a_star.ERROR:

a_star.addEventListener(a_star.ERROR,onError);









, . onError. , , :



private function onError(e:Event): void {

trace(a_star.lastError);

}











, a_star, lastError. – . 3 output . , , .







3 –



:

a_star.setObstacleMap(obstacle_map);







! AStar.ERROR AStar, . , . setObstacleMap - , lastError . , – , . , , .. , , , , AStar, .



Event.COMPLETE:

a_star.addEventListener(Event.COMPLETE,onComplete);







onComplete , clippingType ( ):



a_star.clippingType=<>







, : a_star.F ( full), a_star.P ( prevent) a_star.N ( none). a_star.N , . ? , . . 4 S (start) , f (finish) .







4 –



clippingType (. 5)







5. – clippingType=a_star.N .

5. – , . clippingType=a_star.P . : , ( , 3D ) , , . , «» , . 6, , – .







6 –



clippingType=a_star.P ( ) , . , , .



5. , – clippingType=a_star.F . .. .

, . , :



AStar.findPath(_startx:int,_starty:int,_targetx:int,_targety:int):void



{0,1} {6, 3}. findPath:

a_star.findPath(0,1,6,3);







, Event.COMPLETE (, ?), a_star . a_star my_path:Array:



private function onComplete(e:Event): void {

my_path=a_star.getPath();

}




, , . { _x: < >, _y: < >}. , 5.:



my_path=[

{_x:0,_y:1},

{_x:1,_y:0},

{_x:1,_y:2},

{_x:1,_y:3},

{_x:2,_y:4},

{_x:3,_y:5},

{_x:3,_y:6}

];









. , .















All Articles