#javascript #html
#javascript #HTML
Вопрос:
var money = 10
var generators = []
var lastUpdate = Date.now()
for (let i = 0; i < 10; i ){
let generator = {
cost:Math.pow(Math.pow(10,i),i)*10,
bought:0,
amount:0,
mult:1
}
generators.push(generator)
}
function format (amount){
let power = Math.floor(Math.log10(amount))
let mantissa = amount / Math.pow(10 , power)
if (power < 3) { return amount.toFixed(2)}
return mantissa.toFixed(2) "e" power
}
function buyGenerator(i){
let g = generators[i - 1]
if(g.cost > money) return
money -= g.cost
g.amount = 1
g.bought = 1
g.mult *= 1.05
g.cost *= 1.6
}
function updateGUi (){
document.querySelector("#currency").textContent = "you have $" format(money)
for (let i = 0; i < 10; i ){
let g = generators [i]
document.getElementById("gen" (i 1)).innerHTML = "Amount: " format(g.amount) "<br> Bought: " g.bought "<br> Multiplier: " format(g.mult) "X <br> Cost: " format(g.cost)
if(g.cost > money) document.getElementById("gen" [i 1]).classList.add("locked")
else document.getElementById("gen" [i 1]).classList.remove("locked")
}
}
function productloop (diff){
money = generators[0].amount * generators[0].mult * diff
for (let i = 1; i < 10; i ){
generators[i - 1].amount = generators[i].amount * generators[i].mult * diff / 5
}
}
function mainloop (){
var diff = (Date.now() - lastUpdate)/1000
productloop(diff)
updateGUi()
lastUpdate = Date.now()
}
setInterval(mainloop, 50)
updateGUi()
* {
box-sizing: border-box;
}
.generator {
border: 2px solid black;
background-color: rgb(134, 230, 134);
text-align: center;
width: 300px;
padding: 15px;
font-size: 1.3em;
cursor: pointer;
user-select: none;
}
.generators-container {
display: flex;
width: 600px;
flex-wrap: wrap;
margin: auto;
}
#currency {
margin: 40px;
font-size: 2em;
text-align: center;
}
.locked {
background-color:rgb(221, 63, 63);
}
@media (max-width : 7in){
.generators-container {
display: flex;
flex-direction: column;
width: 100%;
flex-wrap: nowrap;
margin: auto;
}
.generator {
border: 2px solid black;
background-color: rgb(134, 230, 134);
text-align: center;
width: 100%;
padding: 15px;
font-size: 1.3em;
cursor: pointer;
user-select: none;
}
.locked {
background-color:rgb(221, 63, 63);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="./css/style.css" />
</head>
<body>
<div id="currency"> you have 0$</div>
<div class="generators-container">
<div class="generator" id="gen1" onmousedown="buyGenerator(1)"></div>
<div class="generator" id="gen2" onmousedown="buyGenerator(2)"></div>
<div class="generator" id="gen3" onmousedown="buyGenerator(3)"></div>
<div class="generator" id="gen4" onmousedown="buyGenerator(4)"></div>
<div class="generator" id="gen5" onmousedown="buyGenerator(5)"></div>
<div class="generator" id="gen6" onmousedown="buyGenerator(6)"></div>
<div class="generator" id="gen7" onmousedown="buyGenerator(7)"></div>
<div class="generator" id="gen8" onmousedown="buyGenerator(8)"></div>
<div class="generator" id="gen9" onmousedown="buyGenerator(9)"></div>
<div class="generator" id="gen10" onmousedown="buyGenerator(10)"></div>
</div>
<script src="index.js"></script>
</body>
</html>
как я могу продолжать выполнять функцию buyGenerator, когда я удерживаю click и у меня есть деньги для этого? он должен работать на телефонах, чтобы обычно я сохранял его в локальном хранилище, но здесь я продолжал получать ошибки из-за этого, по какой-то причине все работает, было бы намного лучше, если бы я мог просто удерживать щелчок, чтобы покупать много обновлений, а не нажимать непрерывно
это для инкрементной игры, которую я создаю
Комментарии:
1. Было бы очень круто, если бы в вашем исполняемом фрагменте были вещи, на которые я мог бы щелкнуть.
2. Также
generators
не определено3. Вы могли бы onmousedown запустить быстрый setinterval, а затем onmouseup отменить его.
4. Вероятно, вам следует реализовать надлежащий основной игровой цикл. Это делается с помощью
requestAnimationFrame
. Переданная вами функция цикла будет вызываться примерно 60 раз в секунду на настольных компьютерах. Далее вам понадобится переменная состояния, которая устанавливается при удержании курсора мыши нажатой и сбрасывается вonmouseleave
илиonmouseup
. Внутри вашей функции цикла вы проверяете состояние var и действуете соответствующим образом.5. Вот пример кода: jsfiddle.net/87m13tdL
Ответ №1:
Основная идея заключается в использовании интервала или тайм-аута. При наведении курсора мыши запустите таймер. Прослушайте наведение курсора мыши и отмените его.
const generators = [
{ cost: 100, amount: 0, bought: 0, mult: 1, cost: 1 },
{ cost: 200, amount: 0, bought: 0, mult: 1, cost: 1 },
{ cost: 300, amount: 0, bought: 0, mult: 1, cost: 1 }
];
let money = 100000;
function buyGenerator(i) {
let g = generators[i]
if (g.cost > money) return
money -= g.cost
g.amount = 1
g.bought = 1
g.mult *= 1.05
g.cost *= 1.6
console.log(money);
}
let activeTimer = null;
const wrapper = document.querySelector(".wrapper");
wrapper.addEventListener('mousedown', function (evt) {
const gen = evt.target.closest('[data-generator]');
if (gen) {
const genId = gen.dataset.generator;
activeTimer = window.setInterval(function () {
buyGenerator(genId);
}, 300);
}
});
window.addEventListener('mouseup', function () {
if (activeTimer) {
window.clearTimeout(activeTimer);
activeTimer = null;
}
});
<div class="wrapper">
<div class="generator" data-generator="0">Gen 1</div>
<div class="generator" data-generator="1">Gen 2</div>
<div class="generator" data-generator="2">Gen 3</div>
</div>
Ответ №2:
Я кое-что сделал с помощью setInterval, что может быть полезно для вашего случая: в основном я просто использую setInterval как цикл.
<script type="text/javascript">
var mousedown = false;
var counters = {1:1,2:1};
var loop;
var selected = 1;
function btnDown(a){
selected = a;
mousedown=true;
loop = setInterval(()=>{
counters[selected] =1;
document.getElementById("btn" selected).innerHTML = counters[selected];
},100);
}
function btnUp(){
mousedown = false;
clearInterval(loop);
}
</script>
<button type="button" id="btn1" onmousedown="btnDown(1)" onmouseup="btnUp(1)">a</button>
<button type="button" id="btn2" onmousedown="btnDown(2)" onmouseup="btnUp(2)">a</button>
Я надеюсь, что это помогло ^^
редактировать: не удалось задать параметры функции обратного вызова, поэтому я создал «выбранный» var