2011-10-18 27 views
11

Ok vì vậy tôi đang tạo một trò chơi có hình con số với cocos2d trong mục tiêu ... Những thứ khác nhau cần được làm động nên hãy cho tôi một gợi ý về cách tốt nhất để hoàn thành phong trào cho những thứ này :Di chuyển hình Stick, điểm neo, hoạt ảnh hoặc thứ gì đó khác ...?

  1. các character- chính ông là một cung thủ ở góc dưới bên trái người không di chuyển xung quanh, ngoại trừ ông sẽ di chuyển phần thân trên của mình bởi vì bạn cần phải thay đổi góc của nơi bạn đang chụp góc ..

  2. Số lượng nhân vật dính vào kẻ thù đang phát hiện va chạm và chết khi bị bắn bởi một hình mũi tên.

Tôi nên di chuyển 1 và 2 bằng cách nào? tôi có nên nắm vững điểm neo và sử dụng các điểm neo đó không? (Tôi thực sự ghét những điểm neo ngu ngốc mà họ rất khó làm việc ... nhưng tôi sẽ sử dụng chúng nếu chúng tốt hơn) hoặc tạo ra hàng tấn hoạt ảnh, hoặc có cách nào khác để kết hợp nhiều sprites vào một chuyển động duy nhất?

Trả lời

44

Lời khuyên chung của tôi: không bao giờ sửa đổi anchorPoint mặc định (0.5f, 0.5f) trừ khi bạn có hiểu biết thực sự tốt về nó và cách nó giúp bạn hoàn thành mọi thứ. Trong tất cả các trường hợp khác, hãy sửa đổi thuộc tính vị trí.

Đặc biệt nếu bạn thực hiện phát hiện xung đột hộp hoặc bán kính dựa trên, việc sửa đổi điểm neo là phản tác dụng.

Giả sử hình sprite hình chữ nhật của bạn sử dụng một điểm neo mặc định, mà nằm ở trung tâm của các kết cấu:

._______. 
|  | 
|  | 
| * | 
|  | 
|  | 
°-------° 

Các * đánh dấu sự anchorPoint của kết cấu. Nếu bạn đặt sprite này ở vị trí (250, 100) thì anchorPoint của sprite sẽ nằm ở tọa độ (250, 100).

Hãy nói rằng bạn di chuyển anchorPoint đến (0.1f, 0.1f):

._______. 
    |  | 
. |  . | 
    |  | 
    |  | 
    | *  | 
    °-------° 

°  ° 

Vị trí của ma vẫn không thay đổi theo số (250, 100). Vị trí anchorPoint cũng không thay đổi. Những thay đổi là cách kết cấu được căn giữa điểm đó. Bạn có thể thấy vị trí hình ảnh trước đó trước khi sửa đổi điểm neo bằng cách nhìn vào các dấu chấm động. Trong thực tế, tất cả những gì bạn làm bằng cách sửa đổi anchorPoint là di chuyển (bù đắp) nơi mà kết cấu của nút được vẽ tương ứng với vị trí của nút.

Trong trường hợp trên, kết cấu hiện được căn giữa với góc dưới bên trái của nó trên vị trí của nút. Bạn không còn có thể dựa vào vị trí của sprite đánh dấu tâm của hình ảnh sprite. Nếu bạn sửa đổi anchorPoint tùy ý cho mỗi nút trong trò chơi, bạn không còn có bất kỳ mối tương quan nào giữa biểu diễn trực quan của một nút và vị trí của nó. Vì vậy, nó là thiết kế xấu để sửa đổi anchorPoint cho các đối tượng gameplay.

Ngoài ra, xoay vòng hoặc chia tỷ lệ sẽ luôn được căn giữa trên anchorPoint. Việc sửa đổi anchorPoint có thể dẫn đến hành vi không mong muốn khi xoay hoặc mở rộng các nút.

Giả sử một lẻ, trường hợp xấu nhất, nhưng kịch bản hoàn toàn có thể nơi anchorPoint không còn bên trong kết cấu:

     ._______. 
        |  | 
        |  | 
        |  | 
    *     |  | 
        |  | 
        °-------° 

đó có nghĩa là vị trí của sprite được bù đắp xa bên trái của nơi thực tế hình ảnh đang được hiển thị. Điều này có thể dẫn đến sự khác biệt về kiểm tra va chạm, đặc biệt là tình huống trên sẽ hoàn toàn vô hiệu các kiểm tra xung đột dựa trên bán kính. Đây cũng là một tình huống khó hiểu trong quá trình phát triển.

Trò chơi của bạn sẽ dễ phát triển hơn nếu bạn có thể chắc chắn rằng vị trí của sprite luôn ở giữa kết cấu của nó, thay vì một số điểm tùy ý mà bạn thậm chí không thể nhìn thấy mà không có sự trợ giúp của một số bản vẽ gỡ lỗi.

Câu hỏi đặt ra vẫn là:

Khi bạn muốn sửa đổi các điểm neo?

Tôi đã làm như vậy chỉ trong các trường hợp sau đây, và tránh nó trong tất cả các kịch bản khác:

  1. để gắn kết cấu không động với màn hình/cửa sổ biên giới hoặc tương tự
  2. sang phải/trái/trên/dưới căn chỉnh nhãn, nút hoặc hình ảnh
  3. để căn chỉnh hình ảnh đã sửa đổi (ví dụ: cập nhật nghệ sĩ) mà không sửa đổi vị trí nút.

1) Rất dễ giải thích. Giả sử bạn có hình nền toàn màn hình. Để làm cho nó bao gồm toàn bộ màn hình, bạn có thể làm một trong hai điều:

  • thay đổi vị trí để: (chiều rộng màn hình/2, màn hình chiều cao/2)
  • thay đổi các anchorPoint để (0, 0) aka CGPointZero

Bạn có thể tưởng tượng sau này dễ thực hiện hơn. Nếu bạn không bao giờ di chuyển nền, nó tốt làm điều đó. Tuy nhiên đối với một nền cuộn, tôi sẽ không thay đổi anchorPoint.

2) Giả sử hệ thống menu của bạn yêu cầu các nút và hình ảnh khác nhau được căn chỉnh chính xác với đường viền bên phải của màn hình. Tất cả các nút và hình ảnh có chiều rộng khác nhau: tức là Chơi trò chơi, Tín dụng, Cài đặt, Trò chơi thú vị khác!

Thay vì tìm ra các vị trí riêng cho từng ảnh/nút, sẽ dễ dàng sắp xếp chúng hơn bằng cách sửa đổi anchorPoint thành (1.0f, 0.5f) và sau đó định vị hình ảnh/nút ở chính xác chiều rộng màn hình (và chiều cao màn hình biến): vị trí = (chiều rộng màn hình, 100).

Giả sử vị trí của hình ảnh sau đây là (chiều rộng màn hình, chiều cao màn hình/2) với một anchorPoint mặc định (0.5f, 0.5f). Bạn có thể thấy nửa bên phải của hình ảnh là ngoài khu vực màn hình:

__________. 
      | 
     .___|___. 
     | | | 
     | | | 
     | * | 
     | | | 
     | | | 
     °---|---° 
      | 
----------° 

Với anchorPoint sửa đổi của (1.0f, 0.5f) hình ảnh có thể được gọn gàng phải phù hợp với biên giới màn hình phải/cửa sổ, bất kể chiều rộng của kết cấu của nó. Vị trí vẫn giữ nguyên: (chiều rộng màn hình, chiều cao màn hình/2).

__________. 
      | 
    ._______. 
    |  | 
    |  | 
    |  * 
    |  | 
    |  | 
    °-------° 
      | 
----------° 

Chỉ cần để so sánh, nếu bạn muốn sang phải-align hình ảnh này, nút menu, hoặc nhãn mà không sửa đổi anchorPoint, bạn sẽ phải thiết lập vị trí của nó theo công thức này:

(screen width - contentSize.width * anchorPoint.x, screen height/2) 

Công thức vẫn còn khá đơn giản, nó sẽ trở thành một công việc tuy nhiên nếu contentSize của nút thay đổi, thường là trường hợp cho các nhãn, ví dụ điểm bắt đầu với 1 chữ số nhưng tăng lên 2, 3 và 4 chữ số theo thời gian. Trong những trường hợp như vậy, việc căn chỉnh một nút bằng cách sửa đổi anchorPoint là hợp lý vì nó tránh phải tính lại vị trí mỗi khi contentSize của nút thay đổi.

3) Có những trường hợp hiếm hoi mà một nghệ sĩ đã cung cấp cho tôi hình ảnh cập nhật về một đối tượng trò chơi. Kích thước hình ảnh đã thay đổi, vì vậy nó không còn phù hợp tự nhiên với đồ họa của trò chơi nữa. Mặt khác, vị trí của đối tượng đã được thiết lập tốt thông qua thử nghiệm gameplay và không nên thay đổi để tránh kiểm tra lại trò chơi.

Trong trường hợp này, hãy chỉnh anchorPoint sao cho hình ảnh mới phù hợp tốt với các đồ họa khác, mà không ảnh hưởng đến cách chơi, được đảm bảo. Đây là bản sửa đổi an toàn, vào phút chót. Đừng bắt đầu làm điều này trong giai đoạn sản xuất hoặc bạn sẽ kết thúc trong anchorPoint-tweaking-hell trong suốt thời gian tồn tại của dự án của bạn. Đừng đi đến đó!

Nói tóm lại:

Sửa anchorPoint chỉ nếu mà làm cho nó dễ dàng hơn để sắp xếp các nút với các nút khác hoặc viền màn hình/cửa sổ, hoặc để tinh chỉnh nghệ thuật cuối cùng mà không ảnh hưởng đến gameplay.

Trong tất cả các trường hợp khác, sử dụng vị trí độc quyền để di chuyển các nút.

+0

Giả sử tôi đang kết nối hai đường nhỏ như vậy _ và/để tạo một cánh tay ... với khuỷu tay để cánh tay có thể di chuyển xung quanh. Vì vậy, nó trông giống như _ /. Bạn có nghĩ rằng việc thiết lập điểm neo cho/đến ccp (0.5f, 0.0f) có gây ra bất kỳ vấn đề nào không? Tôi có nghĩa là nó có vẻ như là nó hoạt động ... nhưng bạn có bất kỳ đầu vào nào về chủ đề này không :) – Gabe

+3

@Gabe: ví dụ cánh tay có ý nghĩa vì xoay vòng được đặt ở giữa anchorPoint, vì vậy di chuyển anchorPoint trong trường hợp này cho phép bạn vòng quay tại khớp khuỷu tay. Đối với các thiết kế phức tạp hơn, tôi sẽ sử dụng một đối tượng CCNode như khớp khuỷu tay, và thêm cánh tay thấp hơn vào khớp khuỷu tay tại một bù đắp. Điều đó cho phép bạn xoay khuỷu tay-nút-khớp và cho bạn sự linh hoạt hơn. Đặc biệt, nếu mỗi chi nên làm các thử nghiệm va chạm riêng của nó để thêm các nút "khớp" đó. – LearnCocos2D

+1

Ngoài nhận xét phụ, trừ khi bạn có bằng chứng cho thấy mọi người đang đăng spam hoặc không trả lời cho một câu hỏi nhất định, chúng tôi không ưu tiên bảo vệ các câu hỏi. Chúng tôi có thể bảo vệ họ khi họ bắt đầu trở thành một vấn đề, nhưng chúng tôi không muốn chặn người dùng mới một cách không cần thiết trả lời ngay cả những câu hỏi cũ hơn. –

Các vấn đề liên quan