2016-07-30 24 views
1

Ich versuche mehrere Instanzen verschiedener Objekte zum Array eines anderen Objekts hinzuzufügen. Ich habe jedoch Schwierigkeiten.Hinzufügen mehrerer Instanzen eines Objekts zum Array eines anderen Objekts;

*Creates the player* 
function Player(){ 
    this.name = ""; 
    this.status = "Alive"; 
    this.primaryClass = null; 
    this.secondaryClass = null; 
    this.strength = 0; 
    this.stamina = 0; 
    this.mystica = 0; 
    this.health = 0; 
    this.primaryWeapon = null; 
    this.offHand = null; 
    this.accuracy = 0; 
    this.block = 0; 
    this.baseDamage = 0; 
    this.maxDamage = 0; 
    this.attackSpeed = 0; 
    this.shield = null; 
    this.armor = null; 
    this.armorRating = 0; 
    this.exp = 0; 
} 
*Creates the sword weapon* 
function LongSword(){ 
    this.name = ""; 
    this.attackSpeed = 1; 
    this.baseDamage = 10; 
    this.maxDamage = 15; 
    this.durability = 100; 
    this.block = 5; 
    this.exp = 0; 
} 
*Creates the Long Sword skills* 
function Stab(){ 
    this.name = "Stab"; 
    this.status = "Unlocked"; 
    this.damage = 0; 
    this.damageModifier = 0.75; 
    this.cooldown = 5; 
    this.exp = 0; 
    this.desc = "Stabs your opponent for an additional " +parseInt(this.damageModifier * 100) +"% of your base damage."; 
} 
*Equips the Player weapon(s)* 
Player.prototype.equipWeapon = function equipWeapon(main, offHand){ 
    if(this.primaryClass.dualWield){ 
     this.primaryWeapon = main; 
     if(offHand){ 
      this.offHand = offHand; 
      this.baseDamage += (this.strength + (main.baseDamage + (offHand.baseDamage/2)))/10; 
      this.maxDamage += (this.strength + (main.maxDamage + (offHand.maxDamage/2)))/5; 
      this.attackSpeed += main.attackSpeed + (offHand.attackSpeed/2); 
      this.block += main.block + offHand.block; 
     } 
    } 
    else{ 
     this.primaryWeapon = main; 
     this.offHand = null; 
     this.baseDamage += (this.strength + main.baseDamage)/10; 
     this.maxDamage += (this.strength + main.maxDamage)/5; 
     this.attackSpeed += main.attackSpeed; 
     this.block += main.block; 
    } 

    if(!this.primaryClass.dualWield && offHand){ 
     console.log("Your class can not wield dual weapons."); 
    } 
} 
*Equips the Weapon skills* 
LongSword.prototype.skills = function skills(skill){ 
    this.skills = []; 
    skill.damage = parseFloat((this.baseDamage/skill.damageModifier).toFixed(1)); 
    this.skills.push(skill); 
} 

Diese Objekte konstruieren die grundlegenden Elemente von dem, was ich versuche zu tun. Also, wenn ich gehe, um jede zu instanziieren,

Ich bekomme die Ergebnisse, die ich will. Wenn ich jedoch eine andere Instanz Stab() hinzufügen, um zu versuchen waren, so dass es aussieht wie dieses

var Robert = new Player(); 
Robert.equipWeapon(new LongSword()); 
Robert.primaryWeapon.skills(new Stab()); 
Robert.primaryWeapon.skills(new Stab()); 

ich die Typeerror erhalten: Robert.primaryWeapon.skills is not a function. Warum würde es einmal richtig funktionieren, aber nicht ein zweites Mal? Das Endergebnis, von dem ich versuche, zu erreichen, ist, dass, wenn ich Robert.primaryWeapon.skills ausgetröstet habe, ich zwei Instanzen des Stab Objekts sehen sollte.

Antwort

1

Es gibt zwei Probleme in Ihrem Longsword Prototyp.

Zuerst ersetzen Sie Ihre Funktion mit Ihrem skill Array zu speichern, die den gleichen Namen haben:

LongSword.prototype.skills = function skills(skill){ 
    this.skills = []; //Overrides your function 
    ... 

die auf Ihre Fehler führt, Robert.primaryWeapon.skills is not a function, verursachen, wenn Sie es nennen, es ist ein wirklich Array.

Um es zu beheben, ändern Sie einfach den Namen einer der Funktion oder des Arrays.

Zweitens initialisieren Sie Ihr Array skills bei jedem Aufruf der Funktion auf ein leeres Array und setzen es jedes Mal neu. Sie sollten es in Longsword's Prototype initialisieren.


Hier ist ein ein Beispiel mit diesem Updates (fiddle with it if you want):

function LongSword(){ 
    this.skills = []; 
    ... 

LongSword.prototype.addSkill = function skills(skill){ 
    ... 

Dann Sie werden in der Lage sein, mehrere Fähigkeiten hinzuzufügen:

var Robert = new Player(); 
Robert.equipWeapon(new LongSword()); 
Robert.primaryWeapon.addSkill(new Stab()); 
Robert.primaryWeapon.addSkill(new Stab()); 
+1

... und wahrscheinlich auch die 'dies. Skills'-Array sollte im'Player'' Weapon'-Konstruktor initialisiert werden, nicht die 'addSkill'-Methode. – Bergi

+0

@Bergi, auch wenn die Fähigkeiten spezifisch für die Waffe sind? –

+1

Es sollte dann auf 'Longsword' Konstruktor sein. – Bigood

Verwandte Themen