2010-10-30 55 views
6

Trong ActionScript 3 (và IIRC 2), thuộc tính x và y trên đối tượng hiển thị luôn được lưu trữ dưới dạng bội số của 0,05.Độ chính xác thuộc tính AS3 x và y

nên cái gì như obj.x = 66.6666 cũng giống như obj.x = 66.65

Hầu hết thời gian, điều này không thành vấn đề. Nhưng đôi khi tôi có thể kết thúc với các đối tượng chuyển động chậm, ví dụ: 1 pixel mỗi giây. 1/60 (khung hình/giây) = 0,017 pixel trên mỗi khung hình. obj.x += 0.017 sẽ không bao giờ thực sự thay đổi giá trị x, vì nó được làm tròn đến 0,05 gần nhất.
Điều này buộc tôi ghi đè các thuộc tính x & y của DisplayObject sao cho chúng không được làm tròn.

Tôi có thể hiểu các tọa độ làm tròn với giá trị tích phân gần nhất để hiển thị. Với trình kết xuất nâng cao hơn, tôi thậm chí có thể hiểu được làm tròn cho một số phần nhỏ thể hiện trong nhị phân (ví dụ 0,25). Nhưng 0,05 không thể được đại diện chính xác trong nhị phân.

Vậy tại sao những người sáng tạo của Flash lại quyết định làm tròn gần nhất .05? Nó có vẻ giống như một số tùy ý đối với tôi.

Trả lời

9

Từ Wikipedia article on Twips:

flash nội bộ tính toán bất cứ điều gì sử dụng pixel với twips (hoặc 1/20 của một pixel). Sprites, movie clip và bất kỳ đối tượng nào khác trên sân khấu là được định vị bằng twips. Kết quả là, tọa độ của (ví dụ) sprites luôn là bội số của 0,05 (tức là 1/20). (Ví dụ: 1/20).

Cách giải quyết là lưu trữ các tọa độ trong một số và sau đó gán nó vào thuộc tính của displayobject.

+0

ok, nhưng câu hỏi của tôi là nhiều hơn về quảng cáo thuận lợi của việc sử dụng bội số của .05 là. – Ponkadoodle

+3

Theo thông số định dạng tệp SWF, "Twips là sự thỏa hiệp tốt giữa kích thước và độ chính xác. Chúng cung cấp độ chính xác pixel phụ để thu phóng và sắp xếp chính xác đối tượng, trong khi tiêu thụ rất ít bit trên mỗi tọa độ". –

+0

Câu trả lời này không phải là những gì bạn đang tìm kiếm? –

5

Thậm chí tốt hơn, độ chính xác là khác nhau đối với các tài sản khác của DisplayObject ... xem xét đoạn mã sau:

var tmp:Number = 1/17; 
var s:Sprite = new Sprite(); 
s.scaleX = tmp; 
s.scaleY = tmp; 
s.x = tmp; 
s.y = tmp; 
s.rotation = tmp; 
trace(tmp); 
trace(s.scaleX); 
trace(s.scaleY); 
trace(s.x); 
trace(s.y); 
trace(s.rotation); 

nó sẽ ra

0.058823529411764705 
0.0588235294117647 
0.0588235294117647 
0.05 
0.05 
0.058823529411764705 

có nghĩa là xoay được lưu trữ trong Số chính xác, x và y trong twips (bội số của 0,05) và scaleX và scaleY được lưu trữ ở độ chính xác gần với Số nhưng ít hơn một chút (có thể chính xác một chút ít hơn?)

+0

Điều này rất hữu ích. Chúc mừng. – Jono

+1

Thật đáng buồn khi tìm ra, và thật vô lý. Các số cần được lưu dưới dạng Số; sự làm tròn tùy ý này chỉ yêu cầu các vấn đề về kịch bản, chẳng hạn như các lỗi tích lũy khi chuyển đổi tọa độ, và nghiêm túc, một BIT kém chính xác hơn cho việc mở rộng quy mô? Nó giống như ai đó cố ý phá hoại hệ thống.Nó giống như "Ồ, đó là một số, vì vậy tôi có thể làm một phép tính với nó, ngoại trừ, không, bạn không thể, bởi vì nó được làm tròn dưới mui xe mà không cần cảnh báo." – Triynko

Các vấn đề liên quan