ฉันจินตนาการลำดับการต่อสู้เป็น minigame ในเกมของคุณ การอัพเดตเห็บ (หรือจุดเปลี่ยน) ถูกนำไปยังส่วนประกอบที่จัดการเหตุการณ์เหล่านี้ วิธีการนี้จะสรุปตรรกะลำดับการต่อสู้ในคลาสแยกออกจากเกมหลักของคุณโดยอิสระเพื่อเปลี่ยนระหว่างสถานะเกม
void gameLoop() {
while(gameRunning) {
if (state == EXPLORATION) {
// Perform actions for when player is simply walking around
// ...
}
else if (state == IN_BATTLE) {
// Perform actions for when player is in battle
currentBattle.HandleTurn()
}
else if (state == IN_DIALOGUE) {
// Perform actions for when player is talking with npcs
// ...
}
}
}
คลาสลำดับการต่อสู้จะมีลักษณะเช่นนี้:
class BattleSequence {
public:
BattleSequence(Entity player, Entity enemy);
void HandleTurn();
bool battleFinished();
private:
Entity currentlyAttacking;
Entity currentlyReceiving;
bool finished;
}
Troll และ Warrior ของคุณทั้งสองสืบทอดมาจาก Superclass ทั่วไปที่เรียกว่า Entity ภายใน HandleTurn เอนทิตีที่โจมตีได้รับอนุญาตให้ย้าย นี่เทียบเท่ากับกิจวัตรการคิดแบบ AI
void HandleTurn() {
// Perform turn actions
currentlyAttacking.fight(currentlyReceiving);
// Switch sides
Entity temp = currentlyAttacking;
currentlyAttacking = currentlyReceiving;
currentlyReceiving = temp;
// Battle end condition
if (currentlyReceiving.isDead() || currentlyAttacking.hasFled()) {
finished = true;
}
}
วิธีการต่อสู้จะตัดสินว่ากิจการจะทำอะไร โปรดทราบว่าสิ่งนี้ไม่จำเป็นต้องเกี่ยวข้องกับฝ่ายตรงข้ามเช่นการดื่มยาหรือวิ่งหนี
อัปเดต:เพื่อสนับสนุนสัตว์ประหลาดหลายตัวและกลุ่มผู้เล่นคุณแนะนำคลาสกลุ่ม:
class Group {
public:
void fight(Group opponents) {
// Loop through all group members so everyone gets
// a shot at the opponents
for (int i = 0; i < memberCount; i++) {
Entity attacker = members[i];
attacker.fight(opponents);
}
}
Entity get(int targetID) {
// TODO: Bounds checking
return members[targetID];
}
bool isDead() {
bool dead = true;
for (int i = 0; i < memberCount; i++) {
dead = dead && members[i].isDead();
}
return dead;
}
bool hasFled() {
bool fled = true;
for (int i = 0; i < memberCount; i++) {
fled = fled && members[i].hasFled();
}
return fled;
}
private:
Entity[] members;
int memberCount;
}
คลาสกลุ่มจะแทนที่การเกิดขึ้นทั้งหมดของเอนทิตีในคลาส BattleSequence การเลือกและการจู่โจมจะได้รับการจัดการโดยหน่วยงานระดับเองเพื่อให้ AI สามารถนำกลุ่มทั้งหมดมาพิจารณาเมื่อเลือกแนวทางที่ดีที่สุด
class Entity {
public:
void fight(Group opponents) {
// Algorithm for selecting an entity from the group
// ...
int targetID = 0; // Or just pick the first one
Entity target = opponents.get(targetID);
// Fighting algorithm
target.applyDamage(10);
}
}