2012-04-10 27 views
5

Tôi đang làm việc trên một trò chơi bắn súng arcade cho Android tương tự như Ikaruga. Vấn đề tôi đang phải đối mặt là nó chứng tỏ khá khó khăn để tạo ra các mô hình di chuyển và bắn mạnh mẽ cho kẻ thù. Tại thời điểm này tôi đã tạo ra hai lớp trừu tượng EnemyShip và FlightPath mà từ đó mỗi mẫu kẻ thù và mô hình di chuyển khác nhau bắt nguồn từ tương ứng. Khi World được tạo ra nó instantiates một LevelManager mà các cửa hàng thông tin cấp dưới hình thức:Android shoot-em-up trò chơi. Mẫu kẻ thù mạnh mẽ cho hành vi nhóm phức tạp

waveInfos.add(new WaveInfo(3, 3f)); // new WaveInfo(NumberOfGroups, spawn interval) 
enemyGroups.add(new EnemyGroup(8, EnemyGroup.TYPE_SCOUT_SHIP, EnemyGroup.F_PATH_INVADERS)); 
enemyGroups.add(new EnemyGroup(1, EnemyGroup.TYPE_QUAD_SPHERE, EnemyGroup.F_PATH_QUAD_SPHERE_L, World.BLACK)); 
enemyGroups.add(new EnemyGroup(8, EnemyGroup.TYPE_SCOUT_SHIP, EnemyGroup.F_PATH_INVADERS)); 
// new EnemyGroup(NumberOfEnemies, EnemyType, FlightPathType) 
// new EnemyGroup(NumberOfEnemies, EnemyType, FlightPathType, ShipColour) 

waveInfos.add(new WaveInfo(2, 0.33f)); 
enemyGroups.add(new EnemyGroup(1, EnemyGroup.TYPE_QUAD_SPHERE, EnemyGroup.F_PATH_QUAD_SPHERE_L, World.WHITE)); 
enemyGroups.add(new EnemyGroup(1, EnemyGroup.TYPE_QUAD_SPHERE, EnemyGroup.F_PATH_QUAD_SPHERE_R, World.WHITE)); 

totalWaves = waveInfos.size(); 

Mức được chia thành sóng của các nhóm kẻ thù và ngay bây giờ lớp EnemyGroup mất tạo đối tượng chăm sóc, bổ sung thêm các FlightPath định với kẻ thù mới được tạo ra và truyền kẻ thù đó tới ArrayList trong LevelManager để lưu trữ cho đến khi sinh ra thế giới vào thời điểm cần thiết.

Sau khi sinh ra phần tử FlightPath tiếp nhận và bắt đầu đưa ra hướng dẫn dựa trên stateTime của nó và vì mỗi FlightPath có một trường tham chiếu đến chủ EnemyShip nó có thể truy cập các chức năng và thành viên của nó.

Lớp EnemyShip có một vài chức năng để dễ dàng hướng dẫn như moveTo (float x, float y, float duration) và shoot() nhưng ngay cả với các dẫn xuất FlightPath là diffcult để làm đặc biệt là khi tôi muốn kẻ thù khác nhau trong cùng một nhóm có đường dẫn hơi khác nhau và thời gian đến hơi khác nhau.

Tôi tạo ra một vài trường trong FlightPath để theo dõi các khung hình chính:

public int currentKeyFrame = 0; 
public int totalKeyFrames; 
public KeyFrame[] keyFrames; // Stores duration of instruction to be done, the spreadTime, totalFrameTime and enemyIntervalTime 
public int shipNumber; // Stores which ship out of group this FlightPath is attached to 
public int totalShips; // Stores total number of ships in this EnemyShip's group 
public float stateTime = 0; 

KeyFrame.spreadTime là nỗ lực của tôi để kiểm soát thời gian giữa kẻ thù đầu tiên trong nhóm để bắt đầu chuyển động/bắn súng và cuối cùng.

KeyFrame.totalFrameTime = KeyFrame.duration + KeyFrame.spreadTime

KeyFrame.enemyIntervalTime = KeyFrame.spreadTime/Số kẻ thù trong nhóm này

Trong khi thiết lập này hoạt động tuyệt vời cho phong trào tuyến tính rất đơn giản, nó cảm thấy khá cồng kềnh.

Cảm ơn bạn đã đọc bài viết này. Câu hỏi của tôi là làm cách nào để thực hiện điều khiển mẫu được sắp xếp hợp lý hơn, cho phép chuyển động phức tạp mà không có câu lệnh if() để kiểm tra những kẻ thù khác trong nhóm đang làm và những thứ tương tự.

Tôi hy vọng tôi đã cung cấp đủ thông tin để bạn hiểu cách xử lý kẻ thù. Tôi sẽ cung cấp bất kỳ mã nguồn nào cho bất kỳ ai quan tâm. Cảm ơn trước cho bất kỳ ánh sáng bạn có thể đổ về chủ đề này.

Marios Kalogerou

EDIT: Tôi tìm thấy một trang mà rất nhiều mô tả các loại hệ thống đó sẽ là hoàn hảo cho những gì tôi muốn nhưng tôi không chắc chắn làm thế nào để thực hiện một cách chính xác nó liên quan đến nhóm tổng thể khung hình

http://www.yaldex.com/games-programming/0672323699_ch12lev1sec3.html

Trả lời

1

FlightPath không được kiểm soát bất kỳ đối tượng nào. Đó là một con đường, không phải là một người quản lý. Tuy nhiên, nó sẽ có thể cung cấp cho tọa độ cho bất kỳ khung chính hoặc thời gian. Ví dụ: flightPath.getX(1200) -> Tôi nên ở tọa độ X ở 1200ms ở đâu?

Mỗi EnemyShip phải duy trì quyền sở hữu đối tượng FlightPath. EnemyShip sẽ kiểm tra xem nó sẽ nằm ở đâu trên mỗi khung hình.

EnemyGroup sau đó kiểm soát việc sinh sản của mỗi EnemyShip. Nếu bạn có 8 EnemyShips trong một EnemyGroup, tất cả đều có cùng kiểu FlightPath, thì bạn có thể tưởng tượng rằng EnemyGroup sẽ sinh ra mỗi con tàu cách nhau khoảng 500ms để tạo ra sóng.

Cuối cùng, bạn dịch tất cả các tọa độ EnemyShip tương ứng với toạ độ thế giới/màn hình, theo truyền thống di chuyển chậm theo hướng thẳng đứng.

+0

Cảm ơn câu trả lời nhanh chóng của bạn. Tôi đoán FlightPath là tên sai: D Tôi thích những gì bạn nói về FlightPaths được đường dẫn mặc dù. Tôi sẽ rejig hệ thống này, cung cấp cho các lớp EnemyShip nhiều chức năng hơn và cũng cung cấp cho EnemyGroup kiểm soát hành vi nhóm tổng thể thay vì nó chỉ tạo và lưu trữ kẻ thù. Có thể chia rẽ AI để các tàu kiểm soát chúng là chuyển động của riêng mình dựa trên flightPath, tốc độ và tín hiệu được đưa ra bởi EnemyGroup và EnemyGroup theo dõi toàn bộ nhóm để nó có thể kiểm tra khi nào để cho tàu mới chỉ dẫn. Cảm ơn rất nhiều anh chàng – MazK

1

có cách tiếp cận khác nhau:

  1. Bạn có thể thêm khoảng ngẫu nhiên trước khi chụp và đặt thời gian đến ngẫu nhiên một chút. Giống như currentEnemyArrivalTime += (X - rand(2*X)).

  2. Bạn có thể kiểm soát chuyển động của nhóm kẻ thù. Mỗi kẻ thù trong nhóm cố gắng duy trì vị trí của nó so với trung tâm của nhóm.

  3. Đối với các mẫu thực sự phức tạp, có thể tốt hơn để phát triển một số công cụ tạo tập lệnh đơn giản. Nó có thể rất đơn giản (như mảng các hệ số cho spline), hoặc một cái gì đó phức tạp hơn. Tôi tin rằng, trong hành vi trò chơi như vậy được thực hiện bởi các kịch bản.

+0

Cảm ơn bạn đã trả lời nhanh chóng. Tôi thực sự thích ý tưởng của bạn về một công cụ tạo kịch bản nhưng tôi khá mới mẻ đối với lập trình trò chơi và lập trình nói chung. Tôi sẽ xem xét cách tốt nhất để triển khai loại hệ thống này. Cảm ơn một lần nữa – MazK

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