Cách làm đường cong để nhân vật chạy trên đó?
Em muốn làm một game mà nhân vật sẽ chạy trên một đường cong vô tận (như trong hình) nhưng không biết làm thế nào để tạo ra đường cong và để nhân vật di chuyển được trên đó.
Có bác nào biết thì giúp em với. Em học SFML.
Để vẽ đường cong, bạn có thể chọn loại đường cong Bezier hoặc Rom-Catmull. Sau đó bạn có thể tìm hiểu rộng ra các loại khác.
Để giữ vị trí nhân vật luôn nằm trên đường cong thì trong game loop (hoặc khi nhận được event di chuyển), cho di chuyển tùy thích, nhưng giữ độ cao của nhân vật (trục y) luôn cao hơn vị trí của pixel nằm trong đường cong.
Nhìn đơn giản vậy, nhưng để làm được thì khá phức tạp
1/ vẽ đường cong , vẽ hình tròn có tâm I, bán kính r
2/ viết game loop
3/ gán cho vật 1 vận tốc
4/ cập nhật điểm tiếp theo dựa trên vận tốc đã gán theo trục x
5/ viết hàm tính khoảng cách từ tâm đường tròn đến đường cong d = f(y, y’)
6/ để tạo cảm giác vật di chuyển trên đường tròn tức là d = r; từ d,x và y’(tính ra từ x vì x’=x) đường cong mình tính đc y của tâm hình tròn
7/ xóa hình tròn, về lại hình tròn ở tâm mới xác định được.
Cao xa hơn nữa là tính độ nghiên của đường cong, thêm gia tốc của vật, cập nhật gia tốc theo độ nghiên đường cong, cập nhật vận tốc theo thời gian dựa trên gia tốc …
Nhưng nếu thế thì cả đường tròn sẽ được in ra, mình chỉ muốn một phần đường cong nó in ra thôi (phần màu đỏ trong hình)
xài Perlin noise ấy :V đường cong chỉ là 1 cái VertexArray có x[i] = 6*i chẳng hạn, còn y[i] thì = magnitude * noise(x, 0, 0) hoặc thêm mắm muối noise(x*2, 0, 0), noise(x*4, 0, 0), v.v… gì nữa là được
à mà vertex array thì chỉ di chuyển qua phải được, ko di chuyển qua trái được vì nó insert có 1 chiều là append vào đuôi :V Muốn di chuyển qua trái thì chắc phải làm custom 1 cái class chứa các phần tử nằm liên tục vào cho thêm/bớt vào đầu/cuối dãy
di chuyển thì mới dzui :V Nếu xài box2d thì muốn nhân vật đứng nghiêng thì phải vật vã config sao cho lực ma sát to gì gì đó chả biết nữa :V Còn muốn tự viết di chuyển thì đã có cái đoạn thẳng ví dụ 100 đoạn, phải biết nhân vật nằm trên đoạn thứ mấy, nằm ở đâu trên đoạn đó, rồi tính độ dài tới đoạn kế tiếp, nếu move amount < độ dài này thì chỉ cần tịnh tiến nhân vật trong đoạn hiện tại, còn >= độ dài này thì giảm move amount độ dài này, chuyển nhân vật sang đoạn kế tiếp, gọi đệ quy move() tiếp :V :V :V
Làm physics handling nữa chắc ốm luôn, hehe. Nếu thớt đơn giản chỉ muốn sinh đường cong + di chuyển trên đó thì có thể dùng cách anh @tntxtnt đưa ra, sinh Perlin noise + lấy đường cong, hoặc dùng algorithms vẽ đường cong mình đưa ra ở trên. Di chuyển thì cứ position * delta
mỗi frame, muốn nó nằm trên đường cong thì clamp trục y của charactear cho nó luôn nằm trên mỗi đoạn trong đường cong.