2012-08-27 10 views
5

Tôi đang tạo một trò chơi nhỏ trong as3.Làm thế nào để xóa tất cả người nghe sự kiện cùng một lúc trong AS3

Trò chơi có 10 cấp độ.

Khi tôi nhập 1 cấp, mọi thứ đều ổn. Nhưng khi tôi vào cấp độ thứ hai (frame), người nghe sự kiện từ frame đầu tiên vẫn đang làm việc và nhận được một cảnh báo nói rằng 'Không thể truy cập một đối tượng tham chiếu null objct'. Điều này là do tôi xóa mọi đối tượng ở cấp độ đầu tiên và thêm đối tượng từ giai đoạn 2.

Tôi đã thử sử dụng removeEventListeners, nhưng nó không hoạt động, khiến ENTER_FRAME Người nghe làm việc thêm một lần nữa sau khi tôi xóa sự kiện Người nghe.

Tôi đã thử sử dụng các khung khác nhau cho các cấp khác nhau, bit không hoạt động. Ngoài ra tôi đã thử sử dụng 1 frmae cho tất cả 10 khung hình, nhưng tôi nhận được nhiều cảnh báo và Flash Loader bị quá tải.

Làm cách nào tôi có thể chuyển qua các cấp (quay lại và chuyển tiếp)? Cảm ơn trước.

addEventListener(Event.ENTER_FRAME, subtracting2); 
    arrListeners.pop(); // poping it out of the array because it will be deleted after the count reaches 0 
    function subtracting2 (e:Event):void 
    { 
     count--; 
     var FAcoef:Number = count/30; // 
     FadeAway.alpha = FAcoef; //     Some effect like FadeAway 
     setChildIndex(FadeAway, numChildren - 1); // 
     if(count == 0) 
     { 
      setChildIndex(FadeAway, 0); 
      removeEventListener(Event.ENTER_FRAME, subtracting2); 
     } 
    } 
+0

Bạn không thể. Nếu bạn không muốn làm phiền bạn với các sự kiện (** không đồng bộ **), hãy thử [Tín hiệu AS3] (https://github.com/robertpenner/as3-signals) (** đồng bộ **). – Florent

+4

Có thể bạn không nên thêm người nghe sự kiện vào vòng lặp enterframe ... – Kodiak

+0

Tôi phải thêm ENTER_FRAME để kiểm tra xem cấp độ có được thông qua hay không và để chắc chắn rằng luật trò chơi không bị hỏng. Nó không phải là ý tưởng của tôi whick là đúng (với loại bỏ EventListeners). Miễn là nó hoạt động tốt, tôi sẽ chấp nhận bất kỳ ý tưởng – Stefan4024

Trả lời

9

Không có cách tích hợp để xóa tất cả người nghe.

Bạn có thể sử dụng các tham chiếu yếu để cho phép người nghe bị xóa khi đối tượng là Garbage Collected.

object.addEventListener (......, ......., false, 0, true);

Hoặc bạn có thể thêm removeAllListeners chức năng bản thân, đây là một số thông tin:
http://blog.reyco1.com/method-of-removing-all-event-listeners/ (Có một cái nhìn tại Ion bình luận)

Nhưng .. bạn không cần bất kỳ ở trên nếu bạn chăm sóc để loại bỏ mọi người nghe sự kiện ngay lập tức khi không cần thiết nữa.

Nếu bạn có một lớp học với một hoặc nhiều trình xử lý sự kiện cần thiết cho đến khi kết thúc cuộc đời của cá thể, bạn nên tạo hàm destroy(). Trong hàm destroy() đó, bạn sẽ loại bỏ tất cả các trình lắng nghe sự kiện.

Trong trường hợp của bạn, bạn có thể gọi destroy() trước khi bạn chuyển đến cấp độ thứ hai (khung).

+0

Nếu tôi thử sử dụng tham chiếu yếu và Thu thập rác, làm cách nào tôi có thể xóa Trình nghe sự kiện được kết nối với sân khấu? Và nếu tôi xóa đối tượng, tôi có nên gọi lại lần nữa để bắt đầu trình xử lý sự kiện không? – Stefan4024

+0

ý bạn là gì khi "xóa đối tượng"? nulling nó hoặc loại bỏ khỏi sân khấu? –

+0

Tôi có thể sử dụng destroy() như thế nào? Nhiều như tôi biết phá hủy không phải là phương pháp hoặc chức năng trong AS3 – Stefan4024