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
+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
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
@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