root/lang/actionscript/FPazzle/trunk/src/net/suztomo/FPazzle/FPieceGroup.as @ 14406

Revision 14406, 5.0 kB (checked in by suztomo, 6 years ago)

lang/actionscript/FPazzle : Fixed 2-2 snap bug.

Line 
1package net.suztomo.FPazzle
2{
3        import flash.display.Sprite;
4        import flash.events.Event;
5        import flash.events.MouseEvent;
6       
7        import net.suztomo.FPazzle.event.*;
8
9        public class FPieceGroup extends Sprite
10        {
11                private static var snapDistance:Number = 20;
12                private var p_width:Number, p_height:Number;
13                private var init_piece:FPiece;
14               
15                public var pieces:Array;
16                public var handle:Sprite;
17                public var board:FBoard;
18               
19                public function FPieceGroup(p:FPiece)
20                {
21                        super();
22                        pieces = new Array();
23                        pieces.push(p);
24                        init_piece = p;
25                        addEventListener(Event.ADDED, onAdded);
26                       
27                        handle = new Sprite;
28                        handle.graphics.beginFill(0x222222, 1);
29                        handle.graphics.drawCircle(0, 0, 30);
30                        handle.alpha = 0.0;
31                        addChild(handle);
32                        initHandleListener();
33                }
34
35                public function onAdded(e:Event):void
36                {
37                        if (e.target == this) {
38                                board = parent as FBoard;
39                                for (var i:uint=0; i<pieces.length; i++) {
40                                        addChildAt(pieces[i], 0);
41                                }
42                                p_width = board.p_width;
43                                p_height = board.p_height;
44                        }
45                }
46
47                public function putNewPiece(p:FPiece):void
48                {
49                        if (p == pieces[0]) return;
50                        pieces.push(p);
51                        if (p.parent) {
52                                if (pieces.length == 1) {
53                                        x = p.parent.x + p.x;
54                                        y = p.parent.y + p.y;
55                                        p.x = 0;
56                                        p.y = 0;
57                                } else {
58                                        p.x = p.parent.x - x + p.x;
59                                        p.y = p.parent.y - y + p.y;
60                                }
61                        }
62                        for(var i:uint=0; i<pieces.length; i++) {
63                                addChildAt(pieces[i], 0);
64                        }
65                        setHandlePosition();
66                }
67
68                private function initHandleListener():void
69                {
70                        handle.addEventListener(MouseEvent.MOUSE_OVER, handleAppear);
71                        handle.addEventListener(MouseEvent.MOUSE_OUT, handleDisappear);
72                        handle.addEventListener(MouseEvent.MOUSE_DOWN, startDragGroup);
73                        handle.addEventListener(MouseEvent.MOUSE_UP, stopDragGroup);
74                }
75               
76                private function setHandlePosition():void
77                {
78                        var offset_x:Number = 0;
79                        var offset_y:Number = 0;
80                        var handle_x:Number=0, handle_y:Number=0;
81
82                        if (pieces.length < 1) {
83                                alpha = 0.3;
84                                return;
85                        } else {
86                                alpha = 1;
87                        }
88
89                        for (var i:uint; i<pieces.length; i++) {
90                                handle_x += pieces[i].x;
91                                handle_y += pieces[i].y;
92                        }
93                        handle.x = handle_x / pieces.length + offset_x;
94                        handle.y = handle_y / pieces.length + offset_y;
95                }
96               
97                public function removePiece(p:FPiece):void
98                {
99                        if (p == init_piece && pieces.length > 1) {
100                                var new_p:FPiece = init_piece;
101                                var i:uint;
102                                for (i=0; new_p == init_piece; i++) {
103                                        new_p = pieces[i];
104                                }
105                                var movePiece:FPiece;
106                                while((movePiece = pieces.pop() as FPiece) != null) {
107                                        if (movePiece != init_piece) {
108                                                new_p.init_group.putNewPiece(movePiece);
109                                        }
110                                }
111                                pieces.push(init_piece);
112                        } else {
113                                pieces.splice(pieces.indexOf(p, 0), 1);
114                        }
115                        setHandlePosition();
116                }
117               
118                private function handleAppear(e:Event):void
119                {
120                        if (pieces.length > 1) handle.alpha = 1;
121                        e.stopPropagation();
122                }
123               
124                private function handleDisappear(e:Event):void
125                {
126                        handle.alpha = 0.0;
127                        e.stopPropagation();
128                }
129               
130                public function startDragGroup(e:Event):void
131                {
132                        startDrag();
133                        e.stopPropagation();
134                }
135               
136                public function stopDragGroup(e:Event):void
137                {
138                        stopDrag();
139                        snap();
140                        board.checkAnswer();
141                        e.stopPropagation();
142                }
143
144                private function snap():void
145                {
146                        var i:int;
147                        var tmp:FPieceGroup;
148                        var orig_x:Number = x;
149                        var orig_y:Number = y;
150
151                        var offset_x:Number, offset_y:Number;
152
153                        var diff_x:Number;
154                        var diff_y:Number;
155                        var x_snap:Number, y_snap:Number;
156                        var snap_to:FPieceGroup = null;
157                        var snapped_x:Boolean = false, snapped_y:Boolean = false;
158                        var min_dist:Number = snapDistance*snapDistance*2, tmp_dist_x:Number, tmp_dist_y:Number;
159
160                        for (i=0; i<board.pieces.length; i++) {
161                                tmp = board.groups[i] as FPieceGroup;
162                                x_snap = 0;
163                                y_snap = 0;
164                               
165                                if (tmp != this && tmp.pieces.length > 0) {
166                                        snapped_x = false;
167                                        snapped_y = false;
168                                        for (var j:int=-1; j<=1; j++) {
169                                                diff_x = tmp.x + p_width * j - orig_x;
170                                                diff_y = tmp.y + p_height * j - orig_y;
171                                                if (Math.abs(diff_x) < snapDistance) {
172                                                        x_snap = tmp.x + p_width*j;
173                                                        snapped_x = true;
174                                                        tmp_dist_x = diff_x*diff_x;
175                                                }
176                                                if (Math.abs(diff_y) < snapDistance) {
177                                                        y_snap = tmp.y + p_height*j;
178                                                        snapped_y = true;
179                                                        tmp_dist_y = diff_y*diff_y;
180                                                }
181                                        }
182                                       
183                                        if (snapped_x && snapped_y && min_dist > (tmp_dist_x + tmp_dist_y)) {
184                                                x = x_snap;
185                                                y = y_snap;
186                                                snap_to = tmp;
187                                                min_dist = tmp_dist_x + tmp_dist_y;
188                                        }
189                                }
190                        }
191
192                        if (snap_to != null) {
193                                var movePiece:FPiece;
194                                for (i=pieces.length-1; i>= 0; i--) {
195                                        movePiece = pieces[i];
196                                        removePiece(movePiece);
197                                        snap_to.putNewPiece(movePiece);
198                                }
199                                board.dispatchEvent(new FPazzleEvent(FBoard.PIECE_SNAPPED));
200                        }
201                }
202               
203                public function deactivate():void
204                {
205                        handle.removeEventListener(MouseEvent.MOUSE_OVER, handleAppear);
206                        handle.removeEventListener(MouseEvent.MOUSE_OUT, handleDisappear);
207                        handle.removeEventListener(MouseEvent.MOUSE_DOWN, startDragGroup);
208                        handle.removeEventListener(MouseEvent.MOUSE_UP, stopDragGroup);
209                }
210        }
211}
212
Note: See TracBrowser for help on using the browser.