Я создаю игру и использую JavaScript / jQuery, чтобы тратить очки атрибутов персонажа. У меня есть шесть входов, подобных этому, каждый из которых представляет один атрибут:
<input class="attributeVal" type="number" min="1" max="36" step="1" value="1">
И один вход, подобный этому («пул»):
<input id="pool" type="number" min="0" max="36" step="1" value="36" readonly>
Последний вход функционирует как «пул ", что означает, что это сумма оставшихся очков, которые будут потрачены на группу из шести входов. Я хотел бы иметь следующее:
- Изменение любого из входных данных «attributeVal» вычитает или восстанавливает точки в пуле, которые не могут быть больше 36 и меньше 0.
- Каждый вход «attributeVal» не может быть меньше 1 и больше 36.
- «attributeVal» и «pool» не могут быть отрицательными.
Я пробовал разные подходы, ноне мог помешать игроку превысить значения, превышающие максимум пула, в основном потому, что я не знаю, как предотвратить событие изменения.
Это то, что я пробовал до сих пор:
<script>
let attributeVal = $(".attributeVal");
attributeVal.on("change paste keyup", function (e) {
let prev = $(this).data('val');
let maxPointsOverall = 42;
let spentPoints = 0;
let poolInput = $('#poolInput');
$(".attributeVal").each(function () {
spentPoints += +$(this).val();
});
if ((maxPointsOverall - spentPoints) < 0) {
$(this).val(prev);
poolInput.val(0);
} else {
poolInput.val(42 - spentPoints);
}
});
attributeVal.on("cut copy paste", function (e) {
e.preventDefault();
});
</script>
Не могли бы вы дать мне какие-нибудь советы, как я могу заставить это работать?
let attributeVal = $(".attributeVal");
attributeVal.on("change paste keyup", function(e) {
let prev = $(this).data('val');
let maxPointsOverall = 42;
let spentPoints = 0;
let poolInput = $('#poolInput');
$(".attributeVal").each(function() {
spentPoints += +$(this).val();
});
if ((maxPointsOverall - spentPoints) < 0) {
$(this).val(prev);
poolInput.val(0);
} else {
poolInput.val(42 - spentPoints);
}
});
attributeVal.on("cut copy paste", function(e) {
e.preventDefault();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label class="font-weight-bold unselectable mb-3">Points available
<input id="poolInput" type="number" min="0" max="36" step="1" value="36" readonly>
</label>
<div class="form-group">
<label>Strength
<input class="attributeVal" type="number" min="1" max="36" step="1" value="1">
</label>
</div>
<div class="form-group">
<label>Endurance
<input class="attributeVal" type="number" min="1" max="36" step="1" value="1">
</label>
</div>
<div class="form-group">
<label>Dexterity
<input class="attributeVal" type="number" min="1" max="36" step="1" value="1">
</label>
</div>
<div class="form-group">
<label>Perception
<input class="attributeVal" type="number" min="1" max="36" step="1" value="1">
</label>
</div>
<div class="form-group">
<label>Intelligence
<input class="attributeVal" type="number" min="1" max="36" step="1" value="1">
</label>
</div>
<div class="form-group">
<label>Charisma
<input class="attributeVal" type="number" min="1" max="36" step="1" value="1">
</label>
</div>
Вот JSFiddle, чтобы проиллюстрировать проблему