Em muốn bắn một viên đạn từ vị trí này tới vị trí kia với vận tốc là 8. Ví dụ từ tọa độ (0,0) tới (16,0) thì em sẽ tăng tọa x của viên đạn lên 8 trong mỗi vòng lặp. Hoặc là ví dụ đi từ (0,0) tới (16,16) thì em sẽ tăng tọa độ x và y cùng lên 8, mặc dù như vậy tốc độ không cân bằng nhau lắm. Nhưng nếu mà bây giờ di chuyển từ (0,0) tới (80, 56), hay những tọa độ mà lượng tăng của x và y không bằng nhau thì em không biết tăng x, y lên bao nhiêu cho phù hợp để đảm bảo tốc độ vẫn là 8, (Điều kiện là lượng tăng của x và y phải là nguyên). Không biết có cách nào giải quyết vấn đề này không vậy. Em cám ơn.
Hỏi về di chuyển đạn trong Tile Map?
Em cám ơn, nhưng em chưa hiểu ý anh lắm @@.
Độ dời, vận tốc và gia tốc em phải để ở dạng vector 2 chiều mới làm được.
Em ghi vận tốc là 8 cũng không đúng, số 8 chỉ nêu lên độ lớn của vận tốc, còn hướng thì chưa biết. Trong vector 1 chiều, hay trường số thực, họ quy ước số dương là cùng chiều quy ước, số âm là ngược chiều quy ước, nên số 8 trong 1 chiều bao hàm cả hướng và độ lớn. Còn khi xét từ 2 chiều trở lên phải bổ sung thông tin về hướng nữa.
khi tạo 1 vận tốc cần 2 đại lượng là hướng Vector2f (x,y) và độ lớn (float v) :V
trước tiên chuyển vector hướng thành unit vector (vector có độ dài = 1):
- tính độ dài vector hướng: length = sqrt(x*x + y*y)
- chia vector hướng cho độ dài của nó: unit vector = (x/length, y/length)
sau đó là nhân unit vector cho độ lớn v là xong:
- return (x/length*v, y/length*v)
vector hướng được tính là tọa độ sau cùng trừ cho tọa độ bắt đầu. Ví dụ từ tọa độ (80, 56) tới (16,5) thì vector hướng là (16-80, 5-56) = (-64, -51). Độ dài của (-64, -51) là căn(6697) ~ 81.8352. Unit vector của (-64, -51) là (-64, -51) là (-0.7821, -0.6232). Vận tốc của viên đạn là 8, vậy lấy 8 nhân cho unit vector hướng là ra: (-6.2565, -4.9856)
em rảnh thì đọc code người ta: https://www.willusher.io/LPCGame/namespace_math.html :V
Em cám ơn anh, em cũng đã tính như vậy rồi,có vẻ em diễn đạt hơi khó hiểu nhưng ý em là tính như vậy xong thì khoảng tăng của x và y sẽ lẻ, giống như anh tính ra là (-6.25 ,-4.98) , mà tọa độ trong SDL nó đặt là kiểu int, cho lên nó sẽ lấy là -6 và -4. Nếu di chuyển trong một đoạn ngắn em nghĩ nó sẽ không anh hưởng và sẽ tới được vị trí gần gần vị trí đích đặt ra, nhưng nếu di chuyển trong đoạn dài em nghĩ nó sẽ bị lệch hướng và không đi tới đúng mục tiêu.
Em nên phân biệt 2 hệ toạ độ. Một hệ toạ độ là nơi để tính toán các công thức động học, tất cả đều tính toán trên R2 (chính xác hơn là R3). Hệ toạ độ còn lại hiển thị trên màn hình, mỗi vector đều thuộc Z2. Rồi có 1 hàm mapping R2 -> Z2 từ hệ toạ độ tính toán sang hệ toạ độ hiển thị. Việc của em chỉ tính trên R2, còn chuyển sang Z2 để libs hoặc engine thực hiện.
Tất cả các libs, engine mà mình từng viết đều hỗ trợ cả (OpenGL, DirectX, Unity, Cocos2dx,…). Em không thể gộp 2 hệ toạ độ thành 1 hệ toạ độ, tính toán và hiển thị chỉ trên 1 hệ toạ độ. Có thể nói là đi ngược lại với những gì được dạy trong Computer Graphics.
Ok, em cám ơn các anh !!!
Vấn đề này khá đơn giản nên anh nghĩ em không cần phải đi sâu quá vào lý thuyết làm gì chỉ rắc rối thêm. Cái này có thể giải quyết đơn giản bằng kiến thức vector của lớp 10, áp dụng định lý Pythagoras là được, bởi vì ở đây ta đã biết tọa độ của 3 điểm nên chỉ cần tính tỷ lệ của khoảng dịch chuyển giữa mỗi lần tick, em cần tính ra độ dài 2 cạnh góc vuông của tam giác ứng với mỗi tick là được.
Em nghiên cứu thêm bài này để đạt được vận tốc không đổi như ý muốn: https://lazyfoo.net/tutorials/SDL/44_frame_independent_movement/index.php
thì em viết struct mới ví dụ struct Vector2f { float x, y; }
rồi tha hồ mà xài, có ai bắt em xài SDL_Point
đâu :V Khi vẽ lên màn hình thì cast mấy giá trị float đó thành int mà vẽ thôi. Vẽ như vậy lệch tối đa 1-2 pixel có ai đập mặt vô màn hình mà canh đâu :V