Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.10.2018, 14:53
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Цикличный запуск анимации
У меня есть игра в которой главный персонаж имеет 3 состояния: бег вправо, бег влево и стояние.

Как это работает сейчас, при нажатие на клавишу A,D идёт постоянный вызов функции движения и при каждом этом вызове меняется кадр на другой(мне кажется это не правильный способ, т.к. нельзя контролировать скорость анимации). А так же сама анимация ожидания, лагает при беге, если её сделать через setInterval.

Как сделать правильное изменение кадров в зависимости от состояния? Ну или просто реализовать нормальную анимацию ожидания, когда персонаж не двигается.

вот код со всеми спрайтами:
https://yadi.sk/d/-DJ1GhtIoBIJLw

и просто код
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="container">
    <div id="Game">
      <div class="bg" width="800" height="600">
        <canvas id="canvas" width="800" height="600"></canvas>
        <img id="background"/>
        <img id="cat">
      </div>
    </div>

  </div>


  <script src="http://code.jquery.com/jquery-3.3.1.js"></script>
  <script src="script.js" charset="utf-8"></script>
</body>


//Game
var canvas = document.getElementById('canvas'), context = canvas.getContext('2d');
var width = 800, height = 600;
canvas.width = width;
canvas.height = height;
var bg = document.getElementById('background');
var cat = document.getElementById('cat');
var a = 1;
var b = 1;
var c = 1;


stand();
// DRAW game 

function moveRight(){
    context.clearRect(0, 0, 800, 600);
    context.drawImage(bg, 0, 0);
    context.drawImage(cat, x, y, 100, 100);
    cat.style.display = 'none';
    bg.style.display = 'none';
  bg.src = 'assets/images/bg/bg.jpg';
  cat.src = 'assets/images/cat/run/right/Run ('+ a +').png';
  if (a>=8) {
    a=0;
  }
  a++;
};
function moveLeft(){
  context.clearRect(0, 0, 800, 600);
  context.drawImage(bg, 0, 0);
  context.drawImage(cat, x, y, 100, 100);
  cat.style.display = 'none';
  bg.style.display = 'none';
  bg.src = 'assets/images/bg/bg.jpg';
  cat.src = 'assets/images/cat/run/left/Run ('+ b +').png';
  if (b>=8) {
    b=0;
  }
  b++;
};
function stand(){
      cat.onload = function(){
      context.clearRect(0, 0, 800, 600);
      context.drawImage(bg, 0, 0);
      context.drawImage(cat, x, y, 100, 100);
      cat.style.display = 'none';
      bg.style.display = 'none';
      };
      bg.src = 'assets/images/bg/bg.jpg';
      cat.src = 'assets/images/cat/stand/Idle ('+ c +').png';
      if (c>=10) {
        c=0;
      }
      c++;
};

//MOVE CAT 
var x = 0;
var y = 430;

function CheckPos(x) {
  if(x <= 700 && x >= 0){
      return true;
  }
  else return false;
}

window.onload = function () {
  window.onkeydown = function(event){
        /* move right */
        if(event.keyCode == 68){
          if(CheckPos(x+5)){
            x+=5;
            moveRight();
            }
          }
              /* move left */
        else if(event.keyCode == 65){
          if(CheckPos(x-5)){
              x-=5;
              moveLeft();
              }
            }
  };

  window.onkeyup = function () {
     if (event.keyCode != 68 && event.keyCode != 65) {
      setInterval(stand, 200)
    }

  };
};

Последний раз редактировалось Retro_1477, 09.10.2018 в 08:39.
Ответить с цитированием
  #2 (permalink)  
Старый 08.10.2018, 17:13
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Вот хорошее видео на эту тему
Ответить с цитированием
  #3 (permalink)  
Старый 09.10.2018, 08:38
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Хорошая презентация, но если я интегрирую весь мой код под этот стандарт, то проблема останется. Нужно чтобы анимация стояния не работала пока идут обращения к клавишам A,D.
Ответить с цитированием
  #4 (permalink)  
Старый 09.10.2018, 08:43
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

88 строка*
Как нужно задать условие, чтобы он выполнял эту функцию когда не происходит никаких взаимодействий? Я понимаю что если я удерживаю клавишу, то он обращается к функции ходьбы многократно и в промежутках этих вызовов он впихивает в неё функцию стояния, из-за этого происходит такой баг.
Ответить с цитированием
  #5 (permalink)  
Старый 09.10.2018, 11:08
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

У меня по рукой, правда, нет отдельных кадров движения...
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="container">
    <div id="Game">
      <div class="bg" width="800" height="300">
        <canvas id="canvas" width="800" height="300"></canvas>
        <img id="background"/>
        <img id="cat">
      </div>
    </div>

  </div>

 <script>
//Game
var canvas = document.getElementById('canvas'), context = canvas.getContext('2d');
var width = 800, height = 300;
canvas.width = width;
canvas.height = height;
var bg = document.getElementById('background');
var cat = document.getElementById('cat');
cat.style.display = 'none';
bg.style.display = 'none';
bg.src = 'https://javascript.ru/forum/images/ca_serenity/misc/logo.gif';

var a = 1;
var b = 1;
var c = 1;
var  standLoop;
var oldKey;
stand();
// DRAW game 

function moveRight(){
    cat.src = 'https://javascript.ru/cat/list/donkey.gif';
    context.clearRect(0, 0, 800, 600);
    context.drawImage(bg, 0, 0);
    context.drawImage(cat, x, y, 100, 100);
  if (a>=8) {
    a=0;
  }
  a++;
};
function moveLeft(){
  cat.src = 'https://javascript.ru/cat/list/event.gif';
  context.clearRect(0, 0, 800, 600);
  context.drawImage(bg, 0, 0);
  context.drawImage(cat, x, y, 100, 100);
  if (b>=8) {
    b=0;
  }
  b++;
};
function stand(){
      cat.src = 'https://javascript.ru/cat/list/jquery_54.png';
      cat.onload = function(){
      context.clearRect(0, 0, 800, 300);
      context.drawImage(bg, 0, 0);
      context.drawImage(cat, x, y, 100, 100);
      };
      if (c>=10) {
        c=0;
      }
      c++;
};

//MOVE CAT 
var x = 0;
var y = 200;

function CheckPos(x) {
  if(x <= 700 && x >= 0){
      return true;
  }
  else return false;
}

window.onload = function () {
  window.onkeydown = function(event){
             clearInterval(standLoop);
        /* move right */
        if(event.keyCode == 68 || oldKey == 68 ){
          if(CheckPos(x+5)){
            oldKey = 68;
            x+=5;
            moveRight();
            }
          }
              /* move left */
        else if(event.keyCode == 65 || oldKey == 65){
          if(CheckPos(x-5)){
              oldKey = 65;
              x-=5;
              moveLeft();
              }
            }
  };

  window.onkeyup = function (event) {
      if(event.keyCode == 65 || event.keyCode == 68) {
          oldKey = 0;
          standLoop =  setInterval(stand, 200);
      } 
  };
};
</script>
</body>

Последний раз редактировалось Dilettante_Pro, 09.10.2018 в 15:05.
Ответить с цитированием
  #6 (permalink)  
Старый 09.10.2018, 12:53
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Странно... в твоей демке я наблюдаю те же проблемы что и у меня (на мгновение анимация бега меняется на стояние). Но при добавление твоего кода в свой, всё хорошо работает. Спасибо!
Ответить с цитированием
  #7 (permalink)  
Старый 09.10.2018, 12:59
Кандидат Javascript-наук
Отправить личное сообщение для Retro_1477 Посмотреть профиль Найти все сообщения от Retro_1477
 
Регистрация: 14.04.2018
Сообщений: 113

Хоте неее, я поторопился с выводами, всё так же, только теперь анимация мерцает и очень редкие появления анимации стояния.
Ладно, всё равно спасибо, сделаю просто, чтобы стоял без смены кадров)
Ответить с цитированием
  #8 (permalink)  
Старый 09.10.2018, 13:08
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Сообщение от Retro_1477
в твоей демке я наблюдаю те же проблемы что и у меня (на мгновение анимация бега меняется на стояние)
Странно... В своей демке я не наблюдаю кадров стояния при нажатой A или D

ЗЫ: появляются, если нажимать/отпускать еще и другие клавиши.

Последний раз редактировалось Dilettante_Pro, 09.10.2018 в 13:11.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск Анимации css Ш.Азиз Общие вопросы Javascript 3 31.05.2018 14:17
Запуск анимации progressbar js при скролле к div alekspvn Events/DOM/Window 3 10.08.2017 11:47
Повторный запуск анимации при нажатии Levitan Элементы интерфейса 3 22.10.2014 11:14
Начало анимации с места предыдущей анимации FanAizu (X)HTML/CSS 3 21.03.2014 12:39
Запуск анимации при наведении курсора на ссылку в другом фрейме flasher167 Общие вопросы Javascript 0 11.04.2013 19:33