Chuyển động miễn phí trong một trò chơi isometric dựa trên gạch


9

Có cách nào dễ dàng hợp lý để thực hiện chuyển động miễn phí trong trò chơi isometric dựa trên gạch không? Có nghĩa là người chơi sẽ không ngay lập tức nhảy từ ô này sang ô khác hoặc không bị "chộp" vào lưới (ví dụ: nếu chuyển động giữa các ô là hoạt hình nhưng bạn sẽ bị khóa không làm gì trước khi hoạt ảnh kết thúc). Tôi là người mới bắt đầu với bất kỳ thứ gì liên quan đến lập trình trò chơi, nhưng với sự trợ giúp của trang web này và một số tài nguyên khác, việc thực hiện các công cụ cơ bản là khá dễ dàng, nhưng tôi không thể tìm thấy bất kỳ tài nguyên hữu ích nào cho vấn đề cụ thể này .

Hiện tại tôi đã ứng biến một cái gì đó gần với điều này: http://jsfiddle.net/KwW5b/4/ (phong trào WASD). Ý tưởng cho chuyển động là sử dụng bản đồ chuột để phát hiện khi người chơi chuyển sang một ô khác và sau đó lật các phần bù, và phần lớn nó hoạt động chính xác (mỗi góc làm cho người chơi di chuyển đến vị trí sai: xem http: //www.youtube.com/watch?v=0xr15IaOhrI , có lẽ là do tôi không thể làm cho bản đồ chuột đầy đủ hoạt động chính xác), nhưng tôi không hề ảo tưởng rằng nó thậm chí gần với một giải pháp tốt / lành mạnh. Và dù sao đi nữa, chủ yếu chỉ là để chứng minh loại điều tôi muốn thực hiện.


Mã đó trông rất tuyệt, vấn đề chính xác là gì? Bạn khá khiêm tốn (theo cách tốt) mã của bạn có vẻ khá tốt, tính năng nào còn thiếu trong bản demo?
AturSams

Điều tôi muốn nói đến các vấn đề góc là loại hành vi này: youtube.com/watch?v=0xr15IaOhrI . Tôi đã không thể đưa ra bất kỳ giải pháp nào khác ngoài việc thực hiện nhiều kiểm tra nếu các lỗi có vấn đề, và thậm chí sau đó có một số trường hợp đặc biệt khi người chơi di chuyển đến một vị trí sai. Nhưng như tôi đã nói, tôi đã tự hỏi làm thế nào loại chuyển động này thường được thực hiện vì tôi chưa thấy phương pháp tôi nghĩ ra được sử dụng ở bất cứ nơi nào khác.
xtr486

Câu trả lời:


10

Trước hết tôi khuyên bạn nên thay đổi hướng từ: W - lên trái S - xuống phải A - xuống trái D - trên cùng bên phải

vào trực quan hơn: W - lên S - xuống A - trái D - phải

Đối với mối quan tâm của bạn, tôi khuyên bạn nên thực hiện hai chức năng, một chức năng dịch tọa độ gạch đẳng phương thành tọa độ lưới và thứ hai theo cách khác. Bằng cách đó, bạn có thể tách đơn giản MVC và nó sẽ giúp cuộc sống của bạn dễ dàng hơn khi tính toán lát xếp hoạt động: nhập mô tả hình ảnh ở đây


1
Câu trả lời của bạn có vẻ rất hứa hẹn, nhưng tôi thừa nhận khá nhiều trong số đó chỉ đi qua đầu tôi. Tuy nhiên, tôi sẽ cố gắng tiếp tục tiêu hóa giải pháp của bạn trong vài ngày tới. Đây có phải là bất cứ nơi nào gần với những gì bạn đã sau? jsfiddle.net/Sd4ZP/18 Nó có một số lỗi logic (tắt bởi một, v.v.) và như vậy, nhưng theo tôi biết các bản đồ từ trên xuống và đẳng cự có cùng một chuyển động. Những gì tôi thậm chí không nhận được là làm thế nào để dịch bù gạch từ trên xuống thành đẳng
cự

Điều đó có vẻ tốt cho đến nay! Tôi sẽ xem xét nó vào buổi tối. Điều này là áp dụng các phép biến đổi trong phương thức vẽ gạch đẳng phương vào hàm dịch vị tríToUser () và nghịch đảo nó trong phương thức locationFromUser ().
Markus von Broady

Tôi thấy vấn đề: bạn đang vẽ chế độ xem izometric bằng cách đặt hình ảnh thay vì sử dụng API vẽ canvas. Điều đó khá logic, vì cuối cùng, gạch izo của bạn sẽ có nhiều màu hơn. Tuy nhiên, để gỡ lỗi, bạn cũng nên vẽ các đường giữa các ô, điều đó sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều. Dù sao, tôi đã rẽ nhánh mã của bạn và tạo chức năng dịch vị tríToUser (x, y). Kiểm tra nó bằng cách căn giữa hình vuông màu đen trên một ô (vì trong chế độ xem iso nó luôn luôn ở giữa) và di chuyển chuột trên khung vẽ dưới cùng - một dấu chấm dịch sẽ được hiển thị trên khung vẽ izo
Markus von Broady

Cảm ơn! Tôi thực sự đã tự mình suy ra (tốt, sắp xếp) một cái gì đó, cụ thể là phần bù đẳng cự trong hàm drawIsometric. Bây giờ nó trông như thế này: jsfiddle.net/P2eKF/4 , dường như chỉ làm những gì tôi đã hỏi trong câu hỏi ban đầu, vì vậy tôi sẽ đánh dấu câu trả lời của bạn. :)
xtr486

Tôi rất vui vì bạn đã làm điều đó! Tôi thích cách kombination khóa WA, WD, AS, SD sắp xếp chuyển động theo trục đẳng phương thay vì góc 45 độ. Làm tốt lắm.
Markus von Broady

0

Nếu tôi hiểu, bạn muốn người chơi di chuyển gạch sang gạch nhưng không nhảy. Bạn có thể:

1- Bắt đầu với gạch t0 và bù 0

2- Khi người chơi di chuyển đến ô t1, đặt offset = - (t1 - t0)

3- Trong bản cập nhật trình phát, nếu độ lệch không bằng 0, hãy giảm thời gian cập nhật và tốc độ trình phát.

amount = deltatime * playerSpeed
deltaoff = sqrt(offsetX*offsetX + offsetY*offsetY)
total = min( amount, deltaoff )
offsetX = offsetX - (total * offsetX / deltaoff)
offsetY = offsetY - (total * offsetY / deltaoff)

4- Yo có thể sử dụng offset == 0 kiểm tra để biết khi nào người chơi ở trên ô.

Với điều này, bạn có được một người chơi di chuyển tự do trong bản đồ nhưng dính vào các ô.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.