Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 07.01.2019, 18:16
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,672

Retro_1477,
Зеркально повернуть это метод .scale() с отрицательными значениями, он же .setTransform() и .transform() c 1-м и 4-м аргументами.
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Flip horizontally & vertically</title>
</head>
<body>
<canvas id="game" width="500" height="250" style="outline:1px solid black"></canvas>
<script>
const ctx = document.getElementById('game').getContext('2d');

const SpriteSheet = {
  load(map, onload) {
    this.map = map;
    this.image = new Image;
    this.image.onload = onload;
    this.image.src = 'https://i.imgur.com/EVUfjH2.png';
  },
  draw(ctx, sprite, x, y, frame, flip) {
    let s = this.map[sprite],
      a = flip.x ? -1 : 1,
      d = flip.y ? -1 : 1,
      e = flip.x ? x + s.w : x,
      f = flip.y ? y + s.h : y;
    ctx.save();
    ctx.setTransform(a, 0, 0, d, e, f);
    ctx.drawImage(this.image, s.x + frame * s.w, s.y, s.w, s.h, 0, 0, s.w, s.h);
    ctx.restore();
  }
};

const Animation = {
  objects: [],
  frame(timestamp) {
    if (!this.previous) this.previous = timestamp;
    let elapsed = timestamp - this.previous;
    this.update(elapsed / 1000);
    this.draw(1000 / elapsed);
    this.previous = timestamp;
    window.requestAnimationFrame(this.frame);
  },
  start() {
    this.frame = this.frame.bind(this);
    window.requestAnimationFrame(this.frame);
  },
  update(elapsed) {
    for (let obj of this.objects) obj.update(elapsed);
  },
  draw(fps) {
    ctx.clearRect(0, 0, 500, 250);
    ctx.fillText(fps, 5, 10);
    for (let obj of this.objects) obj.draw();
  }
};

class Cat {
  constructor(sprite, x, y, fx, fy, frame) {
    this.x = x;
    this.y = y;
    this.sprite = sprite;
    this.w = SpriteSheet.map[sprite].w;
    this.h = SpriteSheet.map[sprite].h;
    this.flip = {};
    this[fx]();
    this[fy]();
    this.frame = frame;
    this.subFrame = 4 * frame;
  }
  left() {
    this.flip.x = true;
  }
  right() {
    this.flip.x = false;
  }
  up() {
    this.flip.y = false;
  }
  down() {
    this.flip.y = true;
  }
  update(dt) {
    this.frame = Math.floor(this.subFrame++ / 4);
    if (this.subFrame >= 32) this.subFrame = 0;
  }
  draw() {
    SpriteSheet.draw(ctx, this.sprite, this.x - this.w / 2, this.y - this.h / 2, this.frame, this.flip);
  }
}

SpriteSheet.load({ bluecat: { x: 0, y: 0, w: 160, h: 80, frames: 8 } }, () => { Animation.start() });

Animation.objects.push(
  new Cat('bluecat', 100, 60, 'right', 'up', 0),
  new Cat('bluecat', 260, 60, 'left', 'up', 2),
  new Cat('bluecat', 100, 160, 'right', 'down', 4),
  new Cat('bluecat', 260, 160, 'left', 'down', 6));
</script>
</body>
</html>
Ответить с цитированием
  #12 (permalink)  
Старый 07.01.2019, 18:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Rise,
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сменить изображение по ссылке? seddx Общие вопросы Javascript 5 29.10.2015 12:05
Как при клики повернуть картинку на 45% byM Общие вопросы Javascript 1 05.08.2015 17:15
Как менять изображение при клики Darland Общие вопросы Javascript 2 05.11.2009 12:42
Как заставить браузер использовать закэшированное изображение? fog Общие вопросы Javascript 5 13.08.2009 15:40
Как предварительно загруженное изображение сделать бэкграундом? hrundel Общие вопросы Javascript 1 02.08.2009 12:45