我正在创建一个非常简单的基于文本的RPG来测试我的技能。我是JS的初学者,我正在使用它来学习和磨练我现有的技能,所以如果这看起来非常基础,请耐心等待。
实际上,我创建了一个功能,可以检查玩家当前EXP是否等于或大于玩家所需的EXP。它的效果非常好,因为它实际上可以提升我的玩家并提供技能点等。
这是功能:
function getExp(amt) {
player.currentExp += amt;
if (player.currentExp >= player.reqExp) {
player.level ++;
player.reqExp = (player.level * 100) + ((player.level * 10) * 4);
player.currentExp = 0;
player.points += 5;
}
}
例如,假设您所需的EXP为100,并且您获得120 EXP点。它不会将20 EXP添加到下一个级别,而是始终重置为0.我知道我已将其设置为执行此操作,但我想知道如何绕过它。我仍然希望EXP栏清空并从0开始(+从前一级继续的额外EXP)。
我正在为HP,MP和EXP使用HTML进度条。
提前致谢。
答案 0 :(得分:0)
如果水平与所需数量成正比,则很容易:
player.level += Math.floor(player.currentExp/100);
player.currentExp=player.currentExp%100;
如果您想要持续增加所需的exp,可以这样做:
player.requiredExp=100;
function getExp(val){
player.currentExp+=val;
while(player.currentExp>=player.requiredExp){
player.requiredExp=player.requiredExp+100;//or some other algorithm
player.level++;
player.currentExp-=player.requiredExp;
}
}
引用播放器的函数应该是播放器对象的一部分,并且你的函数名称没有被明智地选择(其他人可能想在某些时候使用你的代码),所以整个事情我将如何编写它:
var player={
level:0,
_exp:0,
set exp(value){
this._exp+=value;
this.level += Math.floor(this._exp/100);
this._exp=this._exp%100;
},
get exp(){ return this._exp}
};
所以你可以很容易地做到:
player.exp+=500;
答案 1 :(得分:0)
你需要做的就是解决这些问题,从一开始就再次使用你的逻辑。上面的代码使玩家升级并重置栏。您没有检查您的玩家获得的EXP是否分别大于或等于所需金额 相反,你应该做的是:
function getExp(amt) {
player.currentExp += amt;
if (player.currentExp == player.reqExp) { //the amount gained is equal to the required
player.level ++;
player.reqExp = (player.level * 100) + ((player.level * 10) * 4);
player.currentExp = 0;
player.points += 5;
} else if (player.currentExp > player.reqExp){//the amount gained is greater than the required one
//calculate the extra EXP gained
var extra = player.currentExp - player.reqExp;
player.level ++;
player.reqExp = (player.level * 100) + ((player.level * 10) * 4);
player.currentExp = extra;
player.points += 5;
}
一个友好的说明:这个逻辑需要更多的工作,例如,如果玩家获得exp等于两个级别怎么办?
答案 2 :(得分:0)
您可以使用for循环来迭代您所需的级别体验,并在每个循环中减去所需级别的exp需求量。在某些时候,你将达到一个需要经验高于你的经验的水平,此时返回水平。
var exp = document.querySelector(".exp");
var levelDOM = document.querySelector(".currentLevel");
exp.addEventListener('input', function (evt) {
var newValue = getExp(exp.value);
levelDOM.innerHTML = newValue;
console.log(newValue)
});
var level = [100, 200, 300, 600, 700, 800, 1000];
function getExp(exp) {
for(var i = 0; i < level.length; i ++) {
if(exp > level[i]) {
exp -= level[i];
} else {
return i + 1;
}
}
return 1;
}
&#13;
<input type="number" class="exp" />
Current Level : <span class="currentLevel"></span>
&#13;