2011-07-25 8 views
5

Vấn đề là nếu tôi thiết lập thuộc tính của một Sprite đối tượng .mask, đối tượng Sprite vẫn trả về nó đầy đủ chiều cao khi tôi gọi Sprite.height. Vì vậy, tôi đã tìm ra một cách đơn giản để khắc phục điều này sẽ là ghi đè lên getter tài sản.Tại sao Flash sử dụng toàn bộ chiều cao của vật thể được che mặt thay vì chỉ là khu vực hiển thị?

Bây giờ .. mặc dù mà làm việc, nếu tôi thêm đeo mặt nạ Sprite này đối tượng khác Sprite đối tượng, mới Sprite đối tượng sẽ báo cáo đó là chiều cao như đeo mặt nạ Sprite chiều cao của đối tượng mặc dù tôi đã ghi đè thuộc tính để chỉ trả lại chiều cao của khu vực hiển thị do mặt nạ. Vì vậy, có vẻ như Flash bỏ qua thực tế rằng không phải tất cả nội dung đều hiển thị nhưng vẫn tự động tăng chiều cao của đối tượng mới như không có mặt nạ trên mặt nạ Sprite.

Vì vậy, tôi tự hỏi nếu có một cách giải quyết vì vậy tôi có thể thêm đối tượng đeo mặt nạ này cho bất kỳ khác DisplayObject biết nó sẽ được thay đổi kích cỡ để chỉ những gì có thể nhìn thấy trong đối tượng đeo mặt nạ.

Cảm ơn bạn đã được trợ giúp.

EDIT

Dưới đây là một ví dụ mã ..

var content:Bitmap = new Bitmap(new BitmapData(50, 100, false, 0x000000)); 
var container:Sprite = new Sprite(); 
var mask:Bitmap = new Bitmap(new BitmapData(50, 50, false, 0x000000)); 

container.mask = mask; 

container.addChild(content); 

trace(container.height) // this should return 50 instead of 100 
+0

Tôi cũng đã thử một cái gì đó như thế này. Không làm việc. Đã cố gắng ghi đè getBounds quá, điều đó đã không làm điều đó. Tôi muốn được quan tâm để xem một giải pháp. – frankhermes

+0

Có vấn đề khi thiết lập mặt nạ theo cách như vậy để có thể sử dụng chiều cao và chiều rộng cho mục đích không? if (sprite.mask) ... – Neoraptor

+0

Tôi cần có thể thêm đối tượng đeo mặt nạ vào một đối tượng khác ** DisplayObject ** mà không thay đổi kích thước của nó thành cha mẹ mới với chiều cao đầy đủ của nội dung, thay vào đó chỉ thay đổi kích thước thành chiều cao của hiển thị Nội dung. Tôi đã thử **. ScrollRect ** cho bất cứ ai khác tự hỏi và vẫn trả về chiều cao đầy đủ. – xLite

Trả lời

2

Vì vậy, đối với những người quan tâm, tôi đã tìm cách giải quyết vấn đề này. Điều thực sự làm phiền tôi là DisplayObject.scrollRect không cập nhật kích thước ngay lập tức cho đến khi Adobe gỡ bỏ mông của họ và sửa nó, đây là những gì bạn cần làm.

Sự cố với .scrollRect, như tôi đã đề cập, là nó không điều chỉnh chiều rộng và chiều cao mới cho đến sau khi một khung đã trôi qua hoặc sau một khoảng thời gian nhất định. Dù bằng cách nào tôi đã xây dựng lớp học của tôi về cơ bản sao cho khi đã cài đặt .scrollRect, tôi tạo bộ hẹn giờ chạy mỗi mili giây, kiểm tra xem .width.height đã cập nhật các giá trị mới. Khi nó đã có, tôi gửi một sự kiện READY tùy chỉnh mà đối tượng mẹ lắng nghe trước khi thêm lớp vào giai đoạn.

Bây giờ một rất điều quan trọng bạn cần phải biết về arsehole này của một tài sản là đối tượng của mà bạn đang thiết lập thuộc tính .scrollRect phải được bổ sung vào giai đoạn trước khi nó làm cho bất kỳ nỗ lực cập nhật các giá trị chiều rộng và chiều cao cho các giá trị được đặt trong thuộc tính .scrollRect. Vì vậy, để làm điều này càng sạch càng tốt, tôi chuyển đối tượng Giai đoạn từ lớp chính của tôi đến đối tượng có .scrollRect Tôi muốn điều chỉnh, hãy gọi nó là MyClass. MyClass đặt .hiển thị thuộc tính thành false rồi tự thêm chính nó lên màn hình. Chỉ một khi điều này được thực hiện tôi có thể bắt đầu bộ hẹn giờ 1ms để kiểm tra xem các kích thước đã thay đổi chính xác sau khi tôi đã đặt .scrollRect.

Vì vậy, một khi chức năng hẹn giờ xử lý tick thấy kích thước đã thay đổi thành công, MyClass bây giờ có thể cử các kiện MyClass.READY đến lớp chính trong khi cùng một lúc, thiết lập .visible tài sản của mình là true và loại bỏ chính nó khỏi sân khấu. Khi trình xử lý sự kiện của lớp chính được kích hoạt, bây giờ nó có thể thêm MyClass vào bất cứ nơi nào nó muốn, biết rằng nó sẽ có kích thước chính xác như được đặt trong MyClass.scrollRect.

Đây là một nỗi đau lớn đối với bản thân và có lẽ nhiều nhà phát triển khác đang tìm kiếm giải pháp vì vậy tôi hy vọng điều này đã giúp bạn và sẽ đủ cho đến khi Adobe thực hiện điều gì đó về vấn đề này. Nhờ tất cả những người đã đăng tải trước đây đã cố gắng giúp đỡ, tôi thực sự đánh giá cao điều đó, cảm ơn!

0

Nếu bạn không thể tìm thấy một giải pháp trực tiếp, có một điều bạn có thể thử là:

  1. Draw đứa trẻ (DisplayObject của bạn bao gồm một mặt nạ và maskee) cho một đối tượng BitmapData.
  2. Phân tích cú pháp thông qua các pixel của đối tượng BitmapData và kiểm tra giá trị của kênh alpha bằng phương pháp getPixel32() của BitmapData.
  3. Xác định hộp giới hạn bao quanh tất cả các pixel alpha khác 0 và sử dụng các thứ nguyên đó.

Tôi muốn kết hợp tất cả điều đó theo phương thức getMaskedDimensions(child:DisplayObject):Rectangle. Hãy cho tôi biết nếu như bạn cần thêm chị tiết. Nếu không, chúc may mắn với nó!

+0

Cảm ơn Ian, tiếc là điều đó không liên quan đến những gì tôi cần. Tôi đang thêm đối tượng masked này vào một ** Sprite ** mới như một đứa trẻ, bây giờ hành vi mặc định cho Flash là thay đổi kích thước ** Sprite ** dựa trên nội dung _ (trong trường hợp này, đối tượng được che dấu) _. Thật không may thay vì Flash thiết lập chiều cao theo vùng hiển thị của đối tượng được che chắn, thay vào đó nó sử dụng chiều cao đầy đủ của đối tượng được che chắn, bao gồm cả các bit không thể nhìn thấy được. Vì vậy, tôi cần một cách lừa hoặc làm cho nó xuất hiện rằng đối tượng đeo mặt nạ được xử lý như thể chiều cao của nó là cùng một chiều cao như nội dung có thể nhìn thấy bên trong nó. – xLite

+0

Tôi hiểu. Bạn có thể mở rộng đối tượng con để ghi đè 'get width()' và 'get height()' để cung cấp chiều rộng và chiều cao được điều chỉnh cho cha mẹ và lừa nó theo cách đó ... – Ian

+0

Như tôi đã đề cập trong bài gốc, tôi có đã cố gắng trọng các getters, Flash dường như để có được chiều cao một cách khác nhau. Cảm ơn sự đóng góp anyway mặc dù. ;) – xLite

0

chiều rộng và chiều cao có thể bị ghi đè. Một đối tượng sẽ luôn luôn có chiều rộng và chiều cao nội tại tương ứng với những gì được hiển thị bên trong nó, và không may rằng chiều rộng và chiều cao nội tại sẽ không bao giờ chiếm các vùng bị che khuất. getRect và getBounds không nhạy cảm với mặt nạ, do đó, những thứ đó cũng không đủ.

Những gì bạn cần làm là viết một phương thức đệ quy có tên là "getMaskSensitiveRect" nhạy cảm với mặt nạ. Thay vì giao kết quả của getRect trên mỗi đối tượng con, trước tiên bạn sẽ kiểm tra xem thuộc tính mặt nạ của mỗi con là null hay không, và nếu nó không rỗng, hãy gọi hàm getRect trên mặt nạ thay vì đối tượng và sử dụng nó làm hình chữ nhật của trẻ để cắt nhau với phần còn lại của các đối tượng con. Và bạn chắc chắn phải đi bộ toàn bộ hệ thống phân cấp của tất cả trẻ em, cháu, v.v ... đến mức sâu nhất để có được một thước đo chính xác, bởi vì nếu ngay cả một mặt nạ không được tính, nó có thể làm tăng kích thước.

Hãy nhớ ghi đè lên bộ định dạng cho chiều rộng và chiều cao, bởi vì thay đổi chiều rộng hoặc chiều cao của thang hiển thị thực sự thay đổi tỷ lệ và chiều cao tương đối so với kích thước nội tại đó, KHÔNG chiều rộng và chiều cao ghi đè của bạn.Những gì bạn phải làm trong setter là gọi phương thức getMaskSensitiveRect của bạn, và tính toán một tỷ lệ bằng cách sử dụng nó và chiều rộng mong muốn của bạn, sau đó gán tỷ lệ cho các thuộc tính scaleX và scaleY.

2

Như xLite đã đề cập, nó sẽ cập nhật chiều rộng và chiều cao khi nó hiển thị khung tiếp theo. Do đó, bạn có thể làm điều gì đó để buộc nó hiển thị.

var content:Bitmap = new Bitmap(new BitmapData(50, 100, false, 0x000000)); 
var container:Sprite = new Sprite(); 
content.scrollRect = new Rectangle(0, 0, 50, 50); 

container.addChild(content); 

new BitmapData(1,1).draw(content);//this line would help 
trace(container.height); 
+0

hiện dòng đó luôn đảm bảo hiển thị bắt buộc phải không? – xLite

+0

Tôi đã thử rằng trong công việc của tôi và nó hoạt động. Trong hầu hết trường hợp, bạn chỉ cần gọi nó một lần. – Pan

+0

Đã làm việc cho tôi. – Pup