#html #dom #user-input #p5.js
#HTML #dom #пользовательский ввод #p5.js
Вопрос:
Дизайн этого интерфейса заключается в том, что (1) есть прямоугольник; (2) Нажатие стрелок влево и вправо должно регулировать его ширину; (3) Нажатие стрелок вверх и вниз должно изменять его высоту; (4) Нажатие МЫШИ должно изменять его цвет; (5) Нажатие КНОПКИ должно постепенно увеличивать егоскорость вращения.
Поэтому я в основном воссоздал такие функции, как mousePressed()
и KeyPressed()
из ссылок, предоставленных p5.js официальный сайт компании. Тем не менее, я понял, что эскиз будет нарисован только один раз и не получит пользовательских вводов. Я знаю, что есть проблема, но в чем может быть причина?
let width; // Controlled by LEFT_ARROW and RIGHT_ARROW
let height; // Controlled by UP_ARROW and DOWN_ARROW
let color; // Controlled by MOUSE
let degree; // Controlled by BUTTON
function setup()
{
// Create title, subtitle and button
createCanvas(windowWidth, windowHeight);
var title = createElement('h1', 'Use ARROW buttons to resize the rectangle.')
var subtitle = createElement('h2', 'Click MOUSE to change the color.')
var button = createButton('Press Me to rotate the rectangle.')
title.position(windowWidth/2-310, windowHeight/3-100);
subtitle.position(windowWidth/2-180, windowHeight/3);
button.position(windowWidth/2-100, windowHeight*3/4);
button.mousePressed(buttonPressed);
rectMode(CENTER);
angleMode (DEGREES);
}
function draw()
{
background(200);
translate(windowWidth/2, windowHeight/2);
width = 10;
height = 10;
color = 0;
degree = 0;
fill(color);
rotate(degree);
// Draw a rectangle, set to default
rect(0, 20, width, height);
}
// This should rotate the object
function buttonPressed()
{
degree = degree 10;
}
// This should change the color
function mousePressed()
{
color = random(255);
}
function keyPressed()
{
// This should change the width, using left and right arrow
if (keyCode === LEFT_ARROW)
{
width = width - 10;
}
else if (keyCode === RIGHT_ARROW)
{
width = width 10;
}
// This should change the height, using up and down arrow
if (keyCode === UP_ARROW)
{
height = height - 10;
}
else if (keyCode === DOWN_ARROW)
{
height = height 10;
}
}
function windowResized()
{
resizeCanvas(windowWidth, windowHeight);
}
Ответ №1:
У вас простая логическая ошибка в вашем коде. Инициализируйте ширину, высоту, цвет и степень в setup
функции, а не в draw
, чтобы обновления в обработчиках не перезаписывались.
let width; // Controlled by LEFT_ARROW and RIGHT_ARROW
let height; // Controlled by UP_ARROW and DOWN_ARROW
let color; // Controlled by MOUSE
let degree; // Controlled by BUTTON
function setup()
{
// Create title, subtitle and button
createCanvas(windowWidth, windowHeight);
var title = createElement('h1', 'Use ARROW buttons to resize the rectangle.')
var subtitle = createElement('h2', 'Click MOUSE to change the color.')
var button = createButton('Press Me to rotate the rectangle.')
title.position(windowWidth/2-310, windowHeight/3-100);
subtitle.position(windowWidth/2-180, windowHeight/3);
button.position(windowWidth/2-100, windowHeight*3/4);
button.mousePressed(buttonPressed);
rectMode(CENTER);
angleMode (DEGREES);
// initialize variables here
width = 10;
height = 10;
color = 0;
degree = 0;
}
function draw()
{
background(200);
translate(windowWidth/2, windowHeight/2);
// don't overwrite the changes from the handlers
// instead move initialization to setup
// width = 10;
// height = 10;
// color = 0;
// degree = 0;
fill(color);
rotate(degree);
// Draw a rectangle, set to default
rect(0, 20, width, height);
}
// This should rotate the object
function buttonPressed()
{
degree = degree 10;
}
// This should change the color
function mousePressed()
{
color = random(255);
}
function keyPressed()
{
// This should change the width, using left and right arrow
if (keyCode === LEFT_ARROW)
{
width = width - 10;
}
else if (keyCode === RIGHT_ARROW)
{
width = width 10;
}
// This should change the height, using up and down arrow
if (keyCode === UP_ARROW)
{
height = height - 10;
}
else if (keyCode === DOWN_ARROW)
{
height = height 10;
}
}
function windowResized()
{
resizeCanvas(windowWidth, windowHeight);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.8.0/p5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.8.0/addons/p5.dom.min.js"></script>
Комментарии:
1. В вашем вопросе также упоминается скорость вращения. Во фрагменте нажатие кнопки изменяет переменную degree . Чтобы заставить прямоугольник вращаться со скоростью, вам нужно будет добавить еще одну переменную, которую вы можете назвать speed . Затем отрегулируйте скорость в обработчике нажатия кнопки и установите degree = degree speed в draw .
2. Еще одна вещь, которую я замечаю, это то, что вы, вероятно, хотите, чтобы прямоугольник вращался вокруг своего центра. Вы можете использовать translate для перемещения к центру прямоугольника, а затем повернуть. Если вам нужна помощь с вращением вокруг центра, задайте другой вопрос.
3. Это решает проблему. Спасибо, Чарли! Да, вращение было еще одной проблемой, которую я не осознавал, когда публиковал этот вопрос. Но мне удалось изменить эту часть самостоятельно, как только я реализовал взаимодействия. Тем не менее, спасибо, что указали на это!
Ответ №2:
Привет, я не очень опытный, но я не вижу .adEventlistner(), который отслеживает любые входные данные на сайте. Вот некоторый код, который я использовал для элементов управления, которые я использовал в недавнем курсе, где я создавал игру snake. Я использовал коды клавиш для стрелок (стрелка влево: 37, стрелка вверх: 38, стрелка вправо: 39, стрелка вниз: 40)
function control(e) {
if (e.keyCode === 39) {
direction = 1
} else if (e.keyCode === 38) {
direction = - width
} else if (e.keyCode === 37) {
direction = -1
} else if (e.keyCode === 40) {
direction = width
}
}
document.addEventListener('keydown', control)
Комментарии:
1. Спасибо, что поделились своим кодом, хотя я считаю
.addEventlistner()
, что это не обязательно для этой конкретной цели. Все это было из-за простой логической ошибки. Ввод переменных в draw() вместо setup() решит эту проблему.2. Спасибо, всегда приятно учиться у таких сообщений и людей, которые знают больше об этом предмете