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
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