Giữ luân chuyển giữa hai đối tượng


9

Trong trò chơi XNA của tôi, tôi có hai vật thể va chạm. Khi vật thể đầu tiên va chạm với vật thể khác, nó có thể bám vào nó và di chuyển nó về thế giới. Tôi đang gặp vấn đề với môn toán ở đây (Toán không phải là điểm mạnh của tôi). Tôi hiện đang có đối tượng thứ hai bám vào đối tượng thứ nhất và di chuyển xung quanh với nó, nhưng tôi không thể lấy nó để giữ hướng ban đầu. Vì vậy, nếu đối tượng hướng lên trên thì nên giữ hướng này so với cách nó được xoay với vật phẩm ban đầu.

nhập mô tả hình ảnh ở đây

Bất kỳ lời khuyên về cách tôi có thể tốt nhất để đạt được điều này?


Tôi nghĩ rằng cả hai đối tượng sẽ xoay quanh trục của tâm của đối tượng khác.
MichaelHouse

Câu trả lời:


3

Đối với góc có liên quan, chỉ cần giữ góc của đối tượng thứ hai giống với góc của đối tượng thứ nhất. Đối với vị trí, khi hai đối tượng va chạm với nhau, hãy tìm khoảng cách của đối tượng thứ hai so với đối tượng thứ nhất bằng công thức khoảng cách.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Để tìm vị trí của đối tượng thứ hai so với đối tượng thứ nhất:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

Ngoài câu trả lời của @ tesselode, tôi khuyên bạn nên giữ một danh sách các đối tượng đính kèm cho mọi đối tượng thế giới trong trò chơi của bạn. Một cái gì đó dọc theo dòng List<WorldObject> AttachedObjects. Sau đó, khi bạn phát hiện ra một vụ va chạm, bạn sẽ thêm hình chữ nhật màu đen vào hình đỏ AttachedObjects. Sau đó, vấn đề chỉ là cập nhật vị trí của trẻ em bằng phương pháp @ tesselode mỗi khi bạn cập nhật vị trí của cha mẹ.


2

Tôi cho rằng một trong hai người sẽ có quyền kiểm soát người kia, giống như một chiếc xe nâng. Trong bản vẽ của bạn, tôi giả sử đây là màu đen và màu đỏ là gói. Bạn chỉ đề cập đến việc bạn gặp rắc rối với các góc, vì vậy đó là tất cả những gì tôi sẽ đề cập.

Khi các đối tượng khớp với nhau, bạn nên nhớ sự khác biệt góc giữa hai người (tôi sẽ gọi đây là Theta). Tôi đã vẽ điều này trong hình 2 với các mũi tên từ hình đầu tiên được vẽ lên nhau. Cho đến khi các đối tượng không được ghép, góc của đối tượng Đỏ sẽ được xác định bởi góc của Đen cộng với Theta, như trong hình 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Góc khác


1

Bạn có thể thực hiện khả năng có các đối tượng con cho một đối tượng (trong đó các đối tượng con sẽ tự động bị ảnh hưởng bởi các thay đổi đối với vị trí / góc quay của cha mẹ). Sau đó, khi va chạm khi chúng bám vào nhau, bạn tạo ra một vật thể vô hình và biến cả hai vật thể gắn liền thành con của nó. Sau đó, thay vì áp dụng các phép biến đổi (chuyển động, xoay) trên các đối tượng riêng lẻ, bạn áp dụng nó trên đối tượng lớn, HOẶC bạn vẫn có thể áp dụng lực cho các đối tượng con riêng lẻ, điều này sẽ kiểm tra "tôi có cha mẹ không?", Và nếu vâng, lực sẽ được gửi đến cha mẹ (sẽ hợp nhất các lực từ tất cả các đối tượng con vào một vectơ mà nó sẽ áp dụng cho chính nó).

Ngoài ra, cách tiếp cận này sẽ xử lý đúng cách xoay vòng của chúng, nếu bạn tính trung tâm khối lượng cho cha mẹ vô hình theo trọng số của các đối tượng chốt, mà phương pháp của John dường như không thực hiện được (đối tượng xoay quanh tâm khối chung mới của chúng, không xung quanh trung tâm khối lượng của một trong các đối tượng) và bạn có thể dễ dàng lồng loại hành vi này mà không cần bất kỳ mã bổ sung nào. Nó dường như là cách tiếp cận mạnh mẽ và linh hoạt hơn.

+ điều kiện nếu lực tác dụng lên trẻ đủ mạnh để phá vỡ khớp và bạn có thể xử lý việc "tháo gỡ" của nó bằng cách loại bỏ mối quan hệ cha mẹ-> con. Nếu chỉ còn một đứa con, bạn cũng sẽ tách nó ra và loại bỏ cả cha mẹ vô hình.

Tôi có thể cung cấp thêm chi tiết (có hình ảnh và ít nhất là mã giả và như vậy) nếu bạn quan tâm.

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.