01.05.2021, 00:05
|
Интересующийся
|
|
Регистрация: 22.04.2021
Сообщений: 20
|
|
Как сделать управление двумя игроками
Как сделать, чтобы два игрока могли двигаться одновременно?
window.addEventListener('keydown', function(e){
if(e.keyCode == 38){
let goUp = firstSquare.offsetTop;
firstSquare.style.top = goUp - 10 + "px";
}
if(e.keyCode == 40){
let goDown = firstSquare.offsetTop
firstSquare.style.top = goDown + 10 + "px"
}
if(e.keyCode == 37){
let goLeft = firstSquare.offsetLeft
firstSquare.style.left = goLeft - 10 + "px"
}
if(e.keyCode == 39){
let goRight = firstSquare.offsetLeft
firstSquare.style.left = goRight + 10 + "px"
}
if(e.keyCode == 87){
let moveUp = secondSquare.offsetTop;
secondSquare.style.top = moveUp - 10 + "px";
}
if(e.keyCode == 83){
let moveDown = secondSquare.offsetTop
secondSquare.style.top = moveDown + 10 + "px"
}
if(e.keyCode == 65){
let moveLeft = secondSquare.offsetLeft
secondSquare.style.left = moveLeft - 10 + "px"
}
if(e.keyCode == 68){
let moveRight = secondSquare.offsetLeft
secondSquare.style.left = moveRight + 10 + "px"
}
})
Последний раз редактировалось Angelinasen, 02.05.2021 в 18:13.
|
|
01.05.2021, 00:30
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
|
|
01.05.2021, 09:14
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 456
|
|
Сообщение от Angelinasen
|
Как сделать, чтобы они могли двигаться одновременно?
|
Одновременно не получится, нажатие одного игрока будет прерывать нажатие другого.
|
|
01.05.2021, 09:35
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Rise,
а по коду выше, если продублировать на второго игрока, вроде не прерывает...
|
|
01.05.2021, 09:56
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
нажатие клавиш, два игрока одновременно.
по мотивам кода от Malleys,
кликнуть по полю, 1 игрок WSDA, 2 игрок стрелки. тестировать лучше на отдельной странице.
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div class="image" style="width: 50px; height: 25px; background: linear-gradient(to right, red, black);"></div>
<div class="image" style="width: 50px; height: 25px; background: linear-gradient(to right, #008000, black);"></div>
<script>
const pressedKeys = new Set();
addEventListener("keydown", event => {
pressedKeys.add(event.code);
});
addEventListener("keyup", event => {
pressedKeys.delete(event.code);
});
let dt, lastT = performance.now();
const image = document.querySelectorAll(".image");
const userKeys = [
[
["KeyW", .1],
["KeyS", -.1],
["KeyD", .2],
["KeyA", -.2]
],
[
["ArrowUp", .1],
["ArrowDown", -.1],
["ArrowRight", .2],
["ArrowLeft", -.2]
]
]
const users = userKeys.map((keys, i) => ({
matrix : new DOMMatrix(),
user: image[i],
keys
}));
(function loop(t) {
requestAnimationFrame(loop);
dt = t - lastT;
lastT = t;
users.forEach(({matrix, user, keys}) => {
keys.forEach(([key, delta], i) => {
let method = i < 2 ? "translateSelf" : "rotateSelf";
if (pressedKeys.has(key)) matrix[method](delta * dt);
})
user.style.transform = matrix;
})
})(lastT);
</script>
</body>
</html>
Последний раз редактировалось рони, 01.05.2021 в 10:34.
|
|
02.05.2021, 16:26
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Сообщение от Angelinasen
|
без rotate?
|
строки 47, 48
let vector = i < 2 ? [0, delta * -dt] : [delta * dt, 0];
if (pressedKeys.has(key)) matrix.translateSelf(...vector);
|
|
02.05.2021, 16:34
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Angelinasen,
#7 проверяли?
|
|
02.05.2021, 17:11
|
Интересующийся
|
|
Регистрация: 22.04.2021
Сообщений: 20
|
|
Как сделать чтобы два игрока двигались одновременно
все отлично)) сразу не дошло))спасибо!!
|
|
02.05.2021, 19:28
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
столкновение блоков
Angelinasen,
не плодите темы
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
html{
height: 100%;
}
body.gradient{
background-image:radial-gradient(red,yellow);
background-repeat: no-repeat;
background-size: 100% 100%;
}
.image{
--color: #FF0000;
width: 50px;
height: 50px;
background-image: linear-gradient(to right, var(--color), black);
}
.image:nth-child(2){
--color: #008000;
width: 10px;
height: 10px;
}
</style>
</head>
<body>
<div class="image" ></div>
<div class="image" ></div>
<script>
const pressedKeys = new Set();
addEventListener("keydown", event => {
pressedKeys.add(event.code);
});
addEventListener("keyup", event => {
pressedKeys.delete(event.code);
});
let dt, lastT = performance.now();
const image = document.querySelectorAll(".image");
const userKeys = [
[
["KeyW", -.1],
["KeyS", .1],
["KeyD", .1],
["KeyA", -.1]
],
[
["ArrowUp", -.1],
["ArrowDown", .1],
["ArrowRight", .1],
["ArrowLeft", -.1]
]
]
const users = userKeys.map((keys, i) => ({
matrix : new DOMMatrix([1, 0, 0, 1, 100 + 100 * i, 100 + 100 * i]),
user: image[i],
keys
}));
const checkCollision = users => {
const [{user : one}, {user : two}] = users;
let {top : a, left : c} = one.getBoundingClientRect();
let {top : b, left : d} = two.getBoundingClientRect();
a -= b;
c -= d;
return a >= -50 && a <= 10 && c >= -50 && c <= 10
}
(function loop(t) {
dt = t - lastT;
lastT = t;
users.forEach(({matrix, user, keys}) => {
keys.forEach(([key, delta], i) => {
let vector = i < 2 ? [0, delta * dt] : [delta * dt, 0];
if (pressedKeys.has(key)) matrix.translateSelf(...vector);
})
user.style.transform = matrix;
})
document.body.classList.toggle('gradient', checkCollision(users));
requestAnimationFrame(loop);
})(lastT);
</script>
</body>
</html>
|
|
03.05.2021, 15:41
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Angelinasen,
что такое ширина1 и ширина2?
|
|
|
|