p5.js - сложность с функцией keyPressed и изменением y-координат - PullRequest
2 голосов
/ 18 июня 2019

Я начинающий, когда дело касается всего, что связано с программированием;У меня нет абсолютно никакого опыта вообще.Имея это в виду, у меня есть задание, которое я отчаянно пытался выяснить, как его выполнить - создать полностью функциональную космическую стрелялку, что-то похожее на Galaga или Space Invaders.К сожалению, я застрял.(Какой сюрприз, верно?)

Я добился очень небольшого прогресса в этом вопросе, но моя самая последняя трудность заключается в попытке выяснить причину и выяснить, почему объект, который я так метко обозначил как «игрок»Корабль, не будет двигаться вверх и вниз.Я не совсем уверен, что я должен искать - это проблема с тем, как программа интерпретирует ввод с клавиатуры?Что-то не так с координатами, которые я просто не могу распознать?Может быть, это область видимости переменных?

В любом случае объект вызывается с помощью функции конструктора Ship () - сам объект является треугольником.(Я уже говорил, что предпочел бы не тратить время на попытки выяснить сложные формы, потому что я вроде идиот и, вероятно, очень хорошо бы это сделал? Но я отвлекся.)указали координаты в шести различных переменных, каждая из которых соответствует x- или y-значению для одной из трех вершин.На случай, если это имеет какое-либо отношение, размер холста составляет 400 на 400 пикселей.

... Оглядываясь назад, это, вероятно, не имеет большого значения.

Просто, чтобы уточнить, следующее является частью файла constructors.js, который отделен от основного кода, записанного в sketch.js.Я также обязательно связал его с HTML-файлом, на случай, если кому-то будет интересно.

  /*
  Rather than setting the values as static numbers, I chose to
  set them dynamically so that the triangle would appear in the
  same relative position no matter the size of the canvas:
  */

  // coordinates of first vertex – bottom left
  this.x1 = width * 9/20;
  this.y1 = height * 9/10;
  // coords of second vertex – top center
  this.x2 = width/2;
  this.y2 = height * 4/5;
  // coords of third vertex – bottom right
  this.x3 = width * 11/20;
  this.y3 = height * 9/10;
  // the shape is then called via the triangle() function:
  this.show = function() {
    triangle(this.x1, this.y1, this.x2, this.y2, this.x3, this.y3);
  };

Я написал оператор if внутри переменной, содержащей функцию, move, которая предназначена для соответствия функции keyPressed () в главном файле:

  // constructors.js
  this.move = function(dir) {
    if (key === 'a' || 'd') {
      if (this.x1 > 0 && this.x3 < width) {
        this.x1 += dir;
        this.x2 += dir;
        this.x3 += dir;
      }
    } else if (key === 'w' || 's') {
      if (this.y1 < height && this.y2 > 0) {
        this.y1 += dir;
        this.y2 += dir;
        this.y3 += dir;
      }
    }
  };

  // sketch.js
  function keyPressed() {
    // ship was initialised in setup() as an instance of Ship()
    let left = -5, right = 5,
        up = -2, down = 2;
    if (key === 'a') {
      ship.move(left);
    } else if (key === 'd') {
      ship.move(right);
    } else if (key === 'w') {
      ship.move(up);
    } else if (key === 's') {
      ship.move(down);
    }

Если я еще не уточнил это, предназначение для программы (программное обеспечение?) для обработки пользовательского ввода с клавиатуры и соответствующего перемещения объекта.

Я не совсем уверен, что происходит;по какой-то причине, когда я тестирую клавиши W и S, они заставляют корабль двигаться на два пикселя влево и вправо соответственно, а не вверх и вниз - ожидаемый результат.

Дело в том, что я могуне пользуюсь консолью разработчика - используемое мной устройство принадлежит организации, и у них ограничен доступ к инструментам разработки - но даже если бы я мог, я не совсем знаком с ним, чтобы использовать его намоментОднако я не знаю, получу ли я вообще сообщение об ошибке, учитывая, что код (как сейчас) никогда не приведет к сбою программы.Это основная причина, по которой я решил обратиться за помощью.

Все, что вы могли бы предложить, с точки зрения совета или предложения, или если вы можете определить части кода, которые я должен отредактировать,если таковые имеются, я был бы чрезвычайно признателен.

Большое вам спасибо.

(В качестве примечания, я надеюсь, что вы, ребята, понимаете, что я не запрашивая полное решение ; я тоже не собираюсь его получать, но из-за того, что кто-то может предложить какой-нибудь отлаженный код (и, опять же, я неожидая, что кто-нибудь изо всех сил сделает это [особенно для меня всех людей] ), я бы попросил вас дать подробное объяснение, которое в общих чертах описаны различия между двумя частями кода и деталями , где и , почему возникает ошибка . Я хотел бы сделать это как можно большеопыт обучения, насколько это возможно для меня, так как я обычно не ценю тех, кто пользуетсяее честность, чтобы вытащить быстрый ответ из воздуха.)

1 Ответ

0 голосов
/ 18 июня 2019

Это все из-за неверного утверждения if.Вы не можете использовать if( key === 'a' || 'd') В этом выражении кода проверяется, равен ли key символ 'a' или существует 'd' символ.Вот почему, даже если вы нажмете a d s w, во всех случаях 'd' существует и если утверждение верно.Если вы измените свой код на

   if (key === 'a' || key === 'd') {
      if (this.x1 > 0 && this.x3 < width) {
          this.x1 += dir;
          this.x2 += dir;
          this.x3 += dir;
      }
   } 
   else if (key === 'w' || key === 's') {
      if (this.y1 < height && this.y2 > 0) {
          this.y1 += dir;
          this.y2 += dir;
          this.y3 += dir;
      }
   }

, все будет работать как шарм.

...