Il concetto di OOP in Lua, come lo si utilizza in modo efficiente? Qualche idea? [chiuso]

0

Diciamo che ho una classe di persone. La persona può mangiare, nuotare e dormire. Fondamentalmente, faccio Person: Eat () e lui mangia e così via. E se avesse un set di arti marziali che può usare? Come potrei farlo?

Sarebbe come Person.martialArts.Karate: Kick () per eseguire un calcio di karate?

O sarebbe meglio avere martialArts come se fosse una classe in cui lo si userebbe come martialArts: Kick (Person.name) e passare di persona?

In che modo esattamente sarebbe meglio progettarlo in modo che possa essere il più efficiente possibile?

Sono davvero nuovo di OOP. L'aiuto sarebbe apprezzato.

Ho letto di OOP, ma non sono molto specifici sugli esempi di implementazione.

    
posta Seeist 14.10.2017 - 17:53
fonte

1 risposta

1

OK Penso che questa domanda possa essere risolta in termini di progettazione OOP nei giochi.

Non conosco LUA, quindi farò solo uno pseudo codice. (forse qualcuno può modificare?)

Il costrutto Person.MartialArts.Kick () o anche Person.MartialArts.Kick (otherPerson) nel contesto di un gioco in cui le persone si combattono non funziona bene.

Un metodo su un oggetto può restituire un valore e alterare le proprietà di quell'oggetto. Ma in generale la sua cattiva pratica influisce sulle variabili che si passano al metodo o ad altri oggetti presenti nel gioco.

Gli effetti dell'azione Kick dovrebbero essere il presupposto per danneggiare la persona presa a calci. Probabilmente vuoi calcolare il danno in base alle proprietà della persona che sta eseguendo il calcio!

diciamo che la nostra funzione di kick è qualcosa del tipo:

Target.HitPoints -= (Kicker.Strength * 2 - Target.Armour)

Non vogliamo modificare direttamente i punti chiave degli obiettivi, quindi possiamo aggiungere un metodo

function Person:ReceiveDamage(damage)
    self.Hitpoints = self.Hitpoints - (damage - self.Armour)
end

Solo il Kicker conosce la propria forza, quindi aggiungiamo:

function Person:Kick(target)
    target.ReceiveDamage(self.Strength * 2)
end

Ora abbiamo le basi di OOP, l'oggetto incapsula le sue proprietà e Espone il metodo che il programma può manipolare.

Ma possiamo anche supporre che la persona possa solo calciare se conosce l'arte marziale richiesta. Questo complica le cose. Una persona non può avere metodi che solo alcune persone hanno e MartialArt non è influenzato da un calcio. Inoltre, il progamma che effettua la chiamata di calcio, non sa se la persona che esegue il calcio può calciare o no! Quindi dobbiamo inventare

Creiamo un tipo di base MartialArt e diamo il metodo

int MartialArt.AttackDamage(string type, Person attacker)

Creiamo una nuova classe di Karate, che eredita da MartialArt e sovrascrive il Metodo AttackDamage.

int Karate.AttackDamage(string type, Person attacker)
{
    if(type == "kick")
    {
         return this.Kick(attacker);
    }
    return 0;
}

int Karate.Kick(Person attacker)
{
    return attacker.Strength * 2;
}

ora possiamo avere

Person.MartialArt = new Karate();

e

Person.Attack(string type, Person target)
{
    var damage = this.MartialArt.Attack(type, this);
    target.ReceiveDamage(damage);
}

ora la persona può attaccare un altro giocatore e se conosce l'arte marziale con quell'attacco il giocatore subirà la giusta quantità di danni.

Puoi avere molte persone ciascuna con diverse arti marziali. La sottoclasse di MartialArt sa tutto su come calcolare il danno e quali attacchi può fare.

La persona sa come subire danni e come eseguire un attacco.

Puoi vedere come questo rende le cose più facili da modificare. diciamo che abbiamo anche alcune persone che hanno uno sheild.

Possiamo creare una nuova classe PersonWithShield che eredita da Person e sovrascrivere il suo Metodo ReceiveDamage

PersonWithShield.ReceiveDamage(int damage)
{
    if(!this.ShieldIsUp)
    {
        this.HitPoints -= damage;
    }
}

Tutto funzionerà correttamente e non abbiamo dovuto modificare la nostra funzione Kick per sapere di scudi, armature, blocchi o qualsiasi altra cosa potremmo immaginare

    
risposta data 14.10.2017 - 20:22
fonte

Leggi altre domande sui tag