Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сделать управление стрелками и wasd (https://javascript.ru/forum/misc/82404-kak-sdelat-upravlenie-strelkami-i-wasd.html)

Angelinasen 01.05.2021 00:05

Как сделать управление двумя игроками
 
Как сделать, чтобы два игрока могли двигаться одновременно?


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"
  }
})

рони 01.05.2021 00:30

Angelinasen,
код практически готовый тут
https://javascript.ru/forum/css-html...tml#post523635

Rise 01.05.2021 09:14

Цитата:

Сообщение от Angelinasen
Как сделать, чтобы они могли двигаться одновременно?

Одновременно не получится, нажатие одного игрока будет прерывать нажатие другого.

рони 01.05.2021 09:35

Rise,
а по коду выше, если продублировать на второго игрока, вроде не прерывает...

рони 01.05.2021 09:56

нажатие клавиш, два игрока одновременно.
 
:write:
по мотивам кода от 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>

рони 02.05.2021 16:26

Цитата:

Сообщение от 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

Angelinasen,
#7 проверяли?

Angelinasen 02.05.2021 17:11

Как сделать чтобы два игрока двигались одновременно
 
все отлично)) сразу не дошло))спасибо!!

рони 02.05.2021 19:28

столкновение блоков
 
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

Angelinasen,
что такое ширина1 и ширина2?

рони 03.05.2021 16:41

Angelinasen,
:-?

рони 04.05.2021 08:52

движение в границах поля
 
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;
    }
    .field {
    width: 300px;
    height: 300px;
    margin: 70px auto;
    box-sizing: border-box;
    background-color: #808080;
    }
    .image.freedom{
    --color: #00FFFF;
    }

    </style>
</head>

<body>
    <div class="field" >
    <div class="image" ></div>
    <div class="image" ></div>
    </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 box  = document.querySelector(".field");
        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, height : h, width : w} = one.getBoundingClientRect();
        let {top : b, left : d, height : hh, width : ww} = two.getBoundingClientRect();
        a -= b;
        c -= d;
        h -= hh;
        w -= ww;
        return a <= 0 ||  a >= -h || c < 0 || c  >=  -w
        }

        (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;
                    const collision = checkCollision([{user}, {user : box}])
                    if(collision) {
                    vector = vector.map(a => a * -1);
                    matrix.translateSelf(...vector);
                    }
                })
            })
            requestAnimationFrame(loop);
        })(lastT);
    </script>
</body>

</html>

Angelinasen 07.05.2021 21:52

спасибо большое за помощь! Если вопрос по jQuery, сюда же писать?
При клике на кнопку "профиль" (.profile-top-header) я вешаю на меню (.profile-top-header__menu) класс эктив и показываю его, при повторном клике или по клике на любое место страницы по идее класс эктив должен убираться и меню должно скрываться. Но при клике на кнопку не скрывается, только при клике на страницу(( но без второго скрипта (обработки события mouseup) кнопка работает.
как сделать чтобы меню сркрывалось по клике на кнопку и по клике на любое место страницы. (кроме самого меню конечно же)

$('.profile-top-header').click(function(event) {
  event.preventDefault();
  $('.profile-top-header__menu').toggleClass('active');
});

$(document).mouseup(function(e) {
  let container = $('.profile-top-header__menu.active'); 
  if (container.has(e.target).length === 0) {
      container.removeClass('active');
  }

рони 07.05.2021 23:00

Цитата:

Сообщение от Angelinasen
Если вопрос по jQuery, сюда же писать?

нет это уже к теме управления клавишами не относится, для это есть раздел https://javascript.ru/forum/jquery/
но можно и тут ...
$(function() {
    const menu = ('.profile-top-header__menu');
    $('.profile-top-header').click(function(event) {
        event.preventDefault();
        menu.toggleClass('active');
    });
    $(document).click(function(event) {
        if ($(event.target).closest('.profile-top-header__menu, .profile-top-header').length) return;
        menu.removeClass('active')
    });
});

рони 07.05.2021 23:03

Цитата:

Сообщение от Angelinasen
как сделать чтобы меню сркрывалось по клике на кнопку и по клике на любое место страницы. (кроме самого меню конечно же)

https://javascript.ru/forum/showthread.php?p=382814

Angelinasen 09.05.2021 00:10

увпвкеоевлеаловр
 
ЧТо Вы тут делаете)) Вы по-моему все знаете))С такими знаниями можно все)))

рони 09.05.2021 00:24

Angelinasen,
живу я здесь)))

Angelinasen 09.05.2021 01:00

jquery слайдер
 
заметно))) спасибо вам))))

рони 09.05.2021 01:03

Цитата:

Сообщение от Angelinasen
jquery слайдер

поищите примеры по форуму ... или конкретизируйте проблему.


Часовой пояс GMT +3, время: 05:34.