簡體   English   中英

如何在C#中為2D游戲編寫簡單的攻擊邏輯?

[英]How to code simple attack logic for 2D game in C#?

同樣,攻擊也行得通,但是,主要的問題是我應該在一個方向上進行武器攻擊。

嗨,我正在制作回合制動作游戲,玩家可以使用某種武器來移動或攻擊敵人。 敵人只是使用一種簡單的攻擊邏輯,即檢查玩家是否在附近,然后讓玩家受到傷害。 Nearest()使用Math.Abs​​查找絕對距離。

這是用於敵人攻擊的舊的Nearest()方法:

public bool Nearby(Point locationToCheck, int distance)
        {
            if (Math.Abs(location.X - locationToCheck.X) < distance &&
            (Math.Abs(location.Y - locationToCheck.Y) < distance))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

因此,包含上述方法的Enemy類將Player的位置傳遞到該方法中,並將其自身的攻擊范圍作為int值,然后將其與自己的位置進行比較,如果返回true,則會損壞玩家。

但是,玩家攻擊更加復雜。 他的武器必須首先檢查給定方向上的Nearest()距離。 因此,我需要編寫一個新的重載Nearest()方法來使用播放器的武器攻擊邏輯。 我不知道該怎么做。 不知何故,播放器的“武器攻擊”方法應該將參數傳遞給以下DamageEnemy()方法:

protected bool DamageEnemy(Direction direction, int radius, int damage, Random random) 
{
Point target = game.PlayerLocation;
    for (int distance = 0; distance < radius; distance++) {
        foreach (Enemy enemy in game.Enemies) {
            if (Nearby(enemy.Location, target, distance)) {
                enemy.Hit(damage, random);
                return true;
            }
        }
        target = Move(direction, target, game.Boundaries);
        }
                return false;
}

該DamageEnemy方法依賴於兩個新的重載方法,即上述的Move()方法和重載的Nearest()方法。 我是在Oreilly Headfirst C#中通過教程進行此操作的。 480,順便說一句。

*原始的繼承Move()方法很簡單; 它只是根據一個方向枚舉的4個方向之一的輸入來更新沿某個方向繼承對象的對象的位置字段。

我想自己做,但是真的無法弄清楚攻擊邏輯應該如何工作! 誰能給我一些提示,以指示我正確的方向? 我不知道他們要我為新的Move()重載方法做什么。 玩家是否應該跳到進攻點? 還是還有其他功能? 謝謝!

for (int distance = 0; distance < radius; distance++) {
        foreach (Enemy enemy in game.Enemies) {
            if (Nearby(enemy.Location, target, distance)) {
                enemy.Hit(damage, random);
                return true;
            }

這真的很糟糕。 for例程是多余的-可以從敵人那里獲得距離,位置和目標,這將永遠需要檢查每個距離上的每個敵人。 再加上如果有障礙,該怎么辦。 我認為重寫的Nearest()函數中的“距離”應該是“方向”,它將回答您的問題。 我建議:

    foreach (Enemy enemy in game.Enemies) {
        if (Nearby(enemy.Location, target, radius, direction)) {
            enemy.Hit(damage, random);
            return true;
        }

另外,在距離循環中調用了“ move()”函數,因此其行為是不可預測的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM