2011-11-02 42 views
6

Tôi đang thực hành một số chương trình trò chơi 2D đơn giản và đã đưa ra lý thuyết rằng trong khi hoạt ảnh (thay đổi thực tế ở vị trí hình ảnh được tính toán tốt nhất với các số dấu phẩy động). Tôi có cảm giác rằng nếu bạn di chuyển một hình ảnh xung quanh với ints các hình ảnh động sẽ không được mịn màng.Điều gì xảy ra khi chuyển đổi gấp đôi (hoặc nổi) thành ints?

Trong Java có vẻ như bạn không thể vẽ hình ảnh có số dấu phẩy động để cung cấp cho một vị trí hình ảnh. Nhưng dường như khi ban đầu bạn khai báo các ảnh xy của mình, bạn có thể khai báo chúng là Đôi hoặc Phao nổi và khi thực sự vẽ hình ảnh bạn phải đưa chúng vào int. Giống như tôi tìm thấy HERE:

/** 
* Draw this entity to the graphics context provided 
* 
* @param g The graphics context on which to draw 
*/ 
public void draw(Graphics g) { 
    sprite.draw(g,(int) x,(int) y); 
} 

Câu hỏi của tôi là về cách Java xử lý chuyển đổi? Nếu đoạn mã này tăng gấp đôi vào phút cuối, tại sao chúng lại tăng gấp đôi ở vị trí đầu tiên? Java có ẩn các số sau dấu thập phân không?

Tôi biết trong C và C++ số sau khi số thập phân bị cắt và bạn chỉ thấy những gì trước đó. Java xử lý việc truyền này như thế nào?

+2

Nó chỉ giảm số thập phân, giống như C, C++. http://www.fluffycat.com/Java/Casting/ – dmcnelis

+0

Bạn nên thực hiện các phép tính trong gấp đôi nhiều nhất có thể, và khi bạn cuối cùng chuyển nó sang một phương thức chấp nhận int, bạn làm Math.round(). – Stephan

Trả lời

4

Điểm ảnh trên màn hình bị rời rạc và bị giới hạn về số lượng; do đó hiển thị tọa độ cần phải là số nguyên - số dấu phẩy động không có ý nghĩa, vì bạn không có điểm ảnh thực tế, ví dụ: (341.4, 234,7).

Điều đó nói rằng, các số nguyên chỉ nên được sử dụng ở giai đoạn vẽ cuối cùng. Khi bạn tính toán chuyển động của đối tượng, tốc độ, vv, bạn cần sử dụng số dấu phẩy động. Số nguyên sẽ gây ra một số lượng lớn các vấn đề về độ chính xác. Hãy xem xét các đoạn mã sau:

a = 1; 
x = (a/2) * 2; 

Nếu ax được các số dấu phảy, x cuối cùng sẽ có số lượng dự kiến ​​của 1. Nếu chúng là số nguyên, bạn sẽ nhận được 0.

Đường cơ sở: sử dụng các loại điểm động để tính toán vật lý và chuyển đổi thành int vào thời gian vẽ. Điều đó sẽ cho phép bạn thực hiện các phép tính vật lý với độ chính xác cao như yêu cầu.

EDIT:

Theo như việc chuyển đổi từ số FP để nguyên là có liên quan, trong khi số FP có một phạm vi lớn hơn, các giá trị được tạo ra bởi tính vật lý của bạn sau khi bình thường hóa đến kích thước khu vực bản vẽ của bạn nên thường không tràn một int loại.

Điều đó nói rằng, Java truncates các số dấu chấm động khi chuyển sang một kiểu số nguyên, có thể tạo ra hiện vật (ví dụ một hình ảnh động không có pixel ở cột điểm ảnh ngoài cùng bên phải, do ví dụ 639.9 được chuyển đổi sang 639 hơn 640). Bạn có thể muốn xem Math.round() hoặc một số phương thức làm tròn khác do Java cung cấp để có kết quả hợp lý hơn.

2

Các phôi Java nổi lên int bằng cách thả số thập phân. Nhưng tôi không nghĩ rằng có tọa độ x và y trong phao nổi có ý nghĩa gì. Bạn có pixel trên màn hình không thể hiển thị trong bất kỳ thứ gì nhỏ hơn một pixel. Ví dụ: bạn không thể vẽ pixel .5px x .5px vì trên màn hình, nó sẽ chỉ là 1px x 1px pixel. Tôi không phải là lập trình viên máy tính nhưng tôi đã viết một công cụ hoạt hình trong Java và nó rất mượt mà. Tôi có thể chia sẻ điều này nếu bạn muốn.

Lưu ý rằng bạn nên vẽ bằng cách sử dụng int nhưng làm tất cả tính toán của bạn bằng cách sử dụng tăng gấp đôi. Đối với những thứ như xoay hoặc bất cứ thứ gì dựa vào công thức toán học thì phải được thực hiện theo dạng thập phân.

+1

Floats rất hữu ích vì nhiều lý do - trong số đó, 'sin' /' cos' (gần như là cần thiết cho quay phong nha) thực tế yêu cầu chúng, và nhiều ops ma trận có thể được hưởng lợi từ khả năng cho các số có giá trị phân số. Bạn biến chúng thành ints, bạn sẽ mất rất nhiều tính linh hoạt (trừ khi bạn muốn viết các hàm số nguyên riêng của bạn và như vậy). Vì vậy, nhiều người sẽ giữ chúng như là đôi hoặc nổi cho đến khi họ hoàn toàn có được ints. – cHao

+0

Điều này đúng. Tôi không có nghĩa là để làm tính toán của bạn trong ints. Trong ứng dụng của tôi, tôi vẫn làm tất cả các phép tính trong đôi và vẽ bằng cách sử dụng ints. Tôi sẽ cập nhật để phản ánh ghi chú này. –

+0

@AmirRaminfar tôi có thể xem xét điều đó không? – mastrgamr

3

Java cắt ngắn các số thập phân. Ví dụ:

(int) 2.34 == 2 
(int) 2.90 == 2 

Lý do không có khả năng để vẽ ở một vị trí nổi chỉ đơn giản là không có pixel nửa vv :) ​​

+0

Tôi hiểu. Cảm ơn cho đầu vào, nó làm cho tinh thần – mastrgamr

1

Lý do x và y cần phải tăng gấp đôi là khi họ cần phải được tính toán học, ví dụ:

x += (delta * dx)/1000; 

Bạn muốn tránh tràn và mất độ chính xác cho đến khi bạn vẽ pixel.

+0

vì vậy tôi đoán trước khi đôi được đúc nó được tính toán để có được càng gần int chính xác gần nhất có thể? (nếu điều đó có ý nghĩa O_o) – mastrgamr

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