2011-10-31 41 views
14

Tôi đang tạo một trò chơi trong C++, nơi một chiếc xe tăng có thể di chuyển trên sân khấu. Chiếc xe tăng có góc (phao, theo độ, và tôi cho rằng xe tăng là 0º khi pháo của anh ta hướng về bên phải), tốc độ (phao), và có hằng số thời gian gọi là "deltaT" (phao).C++ gamedev: cắt ngắn phao thành int

Khi người chơi di chuyển xe tăng về phía trước, tôi sử dụng lượng giác và phương trình vật lý của vị trí theo thời gian (ý tôi là X (t), tôi không biết nó nói bằng tiếng Anh như thế nào) tọa độ của xe tăng trên sân khấu.

Đây là vấn đề của tôi: do đoạn từ phao đến int, các giá trị gần bằng 0 nhất không được tính đến. Vì vậy, ở các góc độ nhất định, xe tăng xuất hiện xoay, nhưng di chuyển theo một hướng khác.

Đây là những gì mã của tôi không:

1 - lần đầu tiên, tôi tách tốc độ trong thành phần X và Y, bằng cách sử dụng các góc trong Mà hồ đang chuyển động:

float speedX = this->speed * cos(this->angle); 
    float speedY = this->speed * sin(this->angle); 

2 - sau đó sử dụng phương trình tôi đã đề cập ở trên để có tọa độ mới:

this->x = (int) ceil(this->x + (speedX * deltaT)); 
    this->y = (int) ceil(this->y - (speedY * deltaT)); 

Vấn đề bắt đầu ở bước đầu tiên: ở các góc nhất định, giá trị cos hoặc sin rất gần bằng không. Vì vậy, khi tôi nhân nó cho tốc độ để có được, nói, speedX, tôi vẫn có một số rất thấp, và sau đó khi tôi nhân nó cho deltaT nó vẫn còn quá thấp, và cuối cùng khi áp dụng ceil, số tiền đó là hoàn toàn bị mất .

Ví dụ, tại 94º, với deltaT = 1.5, và tốc độ = 2, và giả định giá trị ban đầu của X là 400, ta có:

speedX = -0.1395... 
this->x = 400 //it must be 399.86..., but stays in 400 due to the ceiling 

Vì vậy, trong trò chơi của tôi bình xuất hiện luân chuyển, nhưng di chuyển thẳng về phía trước. Ngoài ra, đôi khi nó di chuyển tốt về phía sau nhưng sai về phía trước, và ngược lại.

¿Làm thế nào để tôi có thể làm cho hướng của xe tăng chính xác hơn? Để tăng tốc độ hoặc giá trị của deltaT không phải là các tùy chọn vì nó là một bể chứa, không phải là công thức 1: P

+4

+1: công việc tốt giải thích câu hỏi của bạn và cung cấp mã có liên quan tối thiểu. – ObscureRobot

+1

Lưu trữ góc là độ hiếm khi hữu ích. C++ nguyên bản hoạt động trong radian. Bạn sẽ kết thúc chuyển đổi qua lại. Một ngoại lệ mà bạn sẽ không sử dụng radian là khi bạn có một loạt các sprites, một cho mỗi vòng quay của bể. Trong trường hợp đó, có thể hữu ích khi sử dụng chỉ mục mảng thay thế. Nhưng không ai sẽ tạo ra 360 sprites; 128 (4x32) sẽ phổ biến hơn nhiều. – MSalters

+0

@MSalters Có, tôi đã reallized về radian quá muộn. Nhưng trên thực tế, mã mà tôi đã đăng một chút đơn giản: Tôi không sử dụng hàm sin và cos từ thư viện toán học, nhưng tôi đã lập bảng các giá trị của cos và sin của các góc nhất định, để tránh tính toán chúng trong thời gian chạy. Ngoài ra, đối với hình ảnh xoay, tôi không có 128 sprites, nhưng tôi chỉ có một, và sử dụng chức năng "rotozoomSurface" (trong SDL_gfx lib, một add on cho SDL), mà làm việc với độ. – Granjero

Trả lời

9

Làm cách nào để làm cho hướng của xe tăng chính xác hơn? Để nâng cao tốc độ hoặc giá trị của deltaT không lựa chọn vì nó là về một chiếc xe tăng, không phải là một công thức 1: P

Bạn nên lưu trữ các giá trị vị trí của bạn như float s, mặc dù họ đang cuối cùng sử dụng như int s cho định vị trên màn hình. Bằng cách đó, bạn sẽ không mất phần không phải số nguyên của vị trí của bạn. Chỉ cần truyền tới int ngay khi kết thúc bản vẽ của bạn.

+1

Ồ, cảm ơn rất nhiều! Tôi vừa mới thực hiện các thay đổi trong mã và nó hoạt động! Tôi không thể tin rằng nó rất đơn giản – Granjero

5

Luôn giữ vị trí của bể trong float s. Ngoài ra, chỉ để cho xe tăng xoay trong gia số 45 độ. Quyết định xem trò chơi của bạn có sử dụng vị trí và tiêu đề gần đúng hay chính xác hay không và tuân theo quyết định đó.

+0

_Ngoài ra, chỉ để cho các xe tăng xoay trong gia số 45 độ._ Có, tôi đã thử trước đó, nhưng xe tăng quay quá nhanh và không phải là cách rất lỏng. – Granjero

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