###前提
javascriptで記述した以下のようなコードがあるとします。
制約条件
・パーティに同じ名前のキャラは一人しか編成できない
・パーティには控えはいない
・キャラは違う処理をするスキルを持つ
・ダメージを受けた時特有の反応をするキャラもいる
CharacterData.js
1characters ={ 2 "主人公":{ 3 partyid:0, 4 AttackDate:{ 5 discription:"ターゲットに通常攻撃", 6 count:10, 7 Atk:function(){ 8 getDamage = partystetas[characters["主人公"].partyid].Pow; 9 Damage(standEnemy[characters["主人公"].partyid],getDamage); 10 //console.log("aaa"); 11 EnemySetting(characters["主人公"].partyid); 12 console.log(enemystetas.length); 13 }, 14 }, 15 SapportDate:{ 16 discription:"SCORE上昇量1%up", 17 Sap:function(){ 18 if(updatecounter % fps_*3 === 0){ 19 for(var i=0;i<4;i++){ 20 if(partystetas[i].Hp < partystetas[i].maxHP) 21 partystetas[i].Hp += 50; 22 } 23 } 24 } 25 }, 26 Dam:function(){ 27 Damage(this.partyid,getDamage); 28 }, 29 Date:new CharacterData( 30 "img/characters/sprite_char1.jpg",//イメージuri 31 0,//ID 32 "主人公",//表示名--パーティーデータ取得時に主キーにしてユーザー毎のキャラステータスを取得? 33 1100,//最大HP 34 1500,//攻撃力 35 800,//防御力 36 "atk",//タイプ 37 "ヒューマン",//種族 38 "SR"//レアリティ 39 ), 40 }, 41 "朱雀":{ 42 partyid:0, 43 AttackDate:{ 44 discription:"ターゲットに通常攻撃", 45 count:10, 46 Atk:function(){ 47 }, 48 }, 49 SapportDate:{ 50 discription:"SCORE上昇量1%up", 51 Sap:function(){ 52 if(updatecounter % fps_*5 === 0){ 53 score_ += 10; 54 } 55 } 56 }, 57 Dam:function(){ 58 Damage(this.partyid,getDamage); 59 }, 60 Date:new CharacterData( 61 "img/characters/sprite_char2.jpg", 62 1, 63 "ヒロイン", 64 1010, 65 1020, 66 200, 67 "enh", 68 "ヒューマン", 69 "SR" 70 ), 71}, 72 "白虎":{ 73 partyid:0, 74 AttackDate:{ 75 discription:"ターゲットに通常攻撃", 76 count:10, 77 Atk:function(){ 78 console.log("aaap"); 79 }, 80 }, 81 SapportDate:{ 82 discription:"SCORE上昇量5%up", 83 Sap:function(){ 84 if(updatecounter % fps_*3 === 0) 85 member_combCount[characters["プレイヤー"].partyid]+=1; 86 } 87 }, 88 Dam:function(){ 89 Damage(this.partyid,getDamage); 90 }, 91 Date:new CharacterData( 92 "img/characters/sprite_char3.jpg", 93 1, 94 "プレイヤー", 95 1010, 96 1020, 97 200, 98 "enh", 99 "ヒューマン", 100 "SR" 101 ), 102 }, 103 "玄武":{ 104 partyid:0, 105 AttackDate:{ 106 discription:"ターゲットに通常攻撃", 107 count:10, 108 Atk:function(){ 109 console.log("捕ったど~"); 110 }, 111 }, 112 SapportDate:{ 113 discription:"SCORE上昇量5%up", 114 Sap:function(){ 115 //console.log("Support3"); 116 } 117 }, 118 Dam:function(){ 119 console.log("ダメージ受けたなり~"); 120 Damage(this.partyid,getDamage); 121 }, 122 Date:new CharacterData( 123 "img/characters/sprite_char3.jpg", 124 1, 125 "玄武", 126 1300, 127 1520, 128 300, 129 "def", 130 "オーガ", 131 "SSR" 132 ), 133 }, 134}; 135 136function EnemySetting(num){ 137 if(standEnemy[num].Hp <= 0){ 138 if(enemystetas.length > 0){ 139 standEnemy[num]=(enemystetas.shift()); 140 standEnemy[num].partyid = num; 141 } 142 } 143}
キャラ(charaClassオブジェクト)ごとに違うスキル、ステータスを保持しており、戦闘シーンでのメイン処理では分岐を使わず同じ呼び出し方で書きたいと思ってたどり着いたのが現状の書き方ですね。「キャラの持つスキルの内容」を一纏めにするためにAttackDateを作っています。
キャラを作成するのと同じようにスキルも作成しようと思ったのですが、引数にfunction()を渡すコールバック処理をcharacterclassオブジェクトに作っています。
characterClass.js
1var 2member_size_X = member_size_Y=32,//サイズ 3partyspritesize_W=288,partyspritesize_H=32, 4Damagestetas={ 5 damage_:0, 6 type_:"ATK"//攻撃者のタイプ 7}, 8getDamage=0; 9//キャラクターデータクラス 10function CharacterData(img,id,name,maxhp,maxpow,maxdeff,type,race,rera){ 11 this.img=new Image(), 12 this.img.src=img; 13 this.id=id; 14 this.name=name; 15 this.Hp=maxhp; 16 this.Pow=maxpow; 17 this.Deff=maxdeff; 18 this.Type=type; 19 this.Race=race; 20 this.Rare=rera; 21 22 this.waitSprite = new AnimSprite(this.img,0,0,partyspritesize_W,partyspritesize_H,member_size_X,member_size_Y,3,1); 23 this.attackSprite= new AnimSprite(this.img,member_size_X*3,0,partyspritesize_W,partyspritesize_H,member_size_X,member_size_Y,3,1); 24 this.skillSprite= new AnimSprite(this.img,0,member_size_Y*2,partyspritesize_W,partyspritesize_H,member_size_X,member_size_Y,3,1); 25 this.damageSprite= new AnimSprite(this.img,0,member_size_Y*3,partyspritesize_W,partyspritesize_H,member_size_X,member_size_Y,3,1); 26 this.deadSprite= new AnimSprite(this.img,192,160,partyspritesize_W,partyspritesize_H,member_size_X,member_size_Y,3,1); 27 28 this.motionsprite= this.waitSprite ; 29 30 this.Atkfunction = function(atkfunc){ 31 atkfunc(); 32 }; 33 34 this.Damagefunction=function(damagefunc){ 35 damagefunc() 36 }; 37 38 this.Sapportfunction=function(sapportfunc){ 39 sapportfunc(); 40 }; 41} 42 43 44//基本的なダメージ処理 45var 46Damage = function(member,damage){ 47 member.Hp -= damage; 48}, 49//キャラ描画 50Characterdtaw = function(charax_,charay_,sprite_){ 51 sprite_.animdraw(ctx,charax_,charay_); 52}; 53 54function charinit(){//呼び出し方の例 55 var 56 i, 57 58 chara1 = characters["主人公"], 59 chara2 = characters["ヒロイン"]; 60 61 62 chara1.Date.Atkfunction(chara1.AttackDate.Atk); 63 chara2.Date.Sapportfunction(chara1.SapportDate.Sap); 64 65 66} 67 68function SetDamagest(Damagest,damage_,type_){ 69 Damagest.damage_ = damage_; 70 Damagest.type_ = type_; 71 72 return Damagest; 73} 74 75function DamageCol(stetas_){ 76 var getdamage; 77 getdamage = stetas_.damage_;//ダメージ計算 78 79 return getdamage; 80} 81 82
main.js
1var 2//////////////////////////////////////////////パーティオブジェクト///////////////////////////////////////////////////// 3party=[ 4 characters["主人公"], 5 characters["ヒロイン"], 6 characters["プレイヤー"], 7 characters["玄武"] 8],//4人 9partystetas=[], 10 11i=0, 12STEPTIME = 10, 13step=0; 14 15function Partyinit(){ 16 for(i=0;i<4;i++){ 17 party[i].partyid = i; 18 partystetas[i]={ 19 maxHP:party[i].Date.Hp, 20 Hp:party[i].Date.Hp, 21 maxpow:party[i].Date.Pow*5, 22 Pow:party[i].Date.Pow, 23 maxDef:party[i].Date.Deff*5, 24 def:party[i].Date.Deff, 25 specialgage:0 26 }; 27 memberView[i]= { 28 hpvar:document.getElementById("HPbox_member"+(i+1)), 29 combcount:document.getElementById("Comb_member"+(i+1)), 30 iconimg:document.getElementById("membericonimg"+(i+1)), 31 Hp:document.getElementById("member"+(i+1)+"_stetas") 32 }; 33 } 34} 35 36function getPartyMemberActionSkill(num){ 37 if(partystetas[num].Hp > 0){//生存中だけ呼び出し 38 party[num].Date.Atkfunction(party[num].AttackDate.Atk); 39 } 40} 41 42function getPartyMemberSapportSkill(num){ 43 party[num].Date.Sapportfunction(party[num].SapportDate.Sap); 44} 45 46function getPartyMemberDamageSkill(num){ 47 party[num].Date.Dam(); 48} 49 50function PartyStetasCheck(i){ 51 if(partystetas[i].Hp <= 0){ 52 party[i].Date.motionsprite=party[i].Date.deadSprite; 53 54 $("#member"+(i+1)+"-icon").addClass("deth"); 55 56 $("#member"+(i+1)+"_stetas").css('color', 'Red'); 57 $("#HPbox_member"+(i+1)).removeClass("alive"); 58 $("#HPbox_member"+(i+1)).addClass("dead"); 59 60 $("#member"+(i+1)+"-icon").removeClass("partymembers-icon"); 61 partystetas[i].Hp++; 62 /*蘇生処理*/ 63 if(partystetas[i].Hp > 0){ 64 65 partystetas[i].Hp = partystetas[i].maxHP/2; 66 $("#member"+(i+1)+"-icon").addClass("partymembers-icon"); 67 $("#member"+(i+1)+"-icon").removeClass("deth"); 68 69 $("#HPbox_member"+(i+1)).addClass("alive"); 70 $("#HPbox_member"+(i+1)).removeClass("dead"); 71 72 } 73 if(Math.abs(partystetas[i].Hp) <= partystetas[i].maxHP){ 74 memberView[i].iconimg.style.opacity=1-(-partystetas[i].Hp/partystetas[i].maxHP); 75 memberView[i].hpvar.style.width = (-partystetas[i].Hp/partystetas[i].maxHP)*100 +"%"; 76 } 77 }else{ 78 if(party[i].Date.motionsprite === party[i].Date.deadSprite){ 79 party[i].Date.motionsprite = party[i].Date.waitSprite; 80 } 81 if($("#HPbox_member"+(i+1)).hasClass("dead")){ 82 $("#HPbox_member"+(i+1)).removeClass("dead"); 83 $("#HPbox_member"+(i+1)).addClass("alive"); 84 }if( $("#member"+(i+1)+"-icon").hasClass("deth")){ 85 $("#member"+(i+1)+"-icon").addClass("partymembers-icon"); 86 $("#member"+(i+1)+"-icon").removeClass("deth"); 87 } 88 89 $("#member"+(i+1)+"_stetas").css('color', 'Black'); 90 memberView[i].hpvar.style.width = (partystetas[i].Hp/partystetas[i].maxHP)*100 +"%"; 91 } 92 if(partystetas[i].Hp > partystetas[i].maxHP)partystetas[i].Hp = partystetas[i].maxHP; 93} 94 95function Party_Update(){ 96 if(GameStage !== "GameOver"){ 97 for(i=0;i<4;i++){ 98 getPartyMemberSapportSkill(i);//Supportを毎時間呼び出す 99 PartyStetasCheck(i); 100 memberView[i].Hp.innerHTML=partystetas[i].Hp; 101 } 102 //全員の状態を調べる 103 for(i=0;i<4;i++){ 104 if(partystetas[i].Hp > 0){ 105 break; 106 } 107 }if(i===4) GameStage="GameOver"; 108}} 109 110 111function Party_Draw(){ 112 for(i=0;i<4;i++){//パーティメンバー描画 113 Characterdtaw(140+markerdistance,45+i*20,party[i].Date.motionsprite);//パーティー 114 } 115} 116
この時、Atk:function()の中で書いている『characters["主人公"]』の部分を変数にして書きたいです。
###やりたいこと
partyidをどのように記述して親オブジェクトから参照したらいいのかわかりません。partyidは他のオブジェクトも共通して持つプロパティであり、一々プロパティ名を指定し自身を参照するのはおかしい気がします。親オブジェクトの持つプロパティを取得するための代表的な記述や別の構造などあれば教えていただきたいです。よろしくお願いします。
###試したこと
this.partyとするとunderfindeで取得できませんでした。
回答2件
あなたの回答
tips
プレビュー