Движение не работает после применения функций для рисования фигуры?

#function #processing

Вопрос:

Я пытаюсь создать простую космическую игру, используя обработку. Я нарисовал космический корабль и добавил к нему движения с помощью клавиш A, D, W, S. Вот код:

 float shipX=0;
float shipY=0; 


void setup(){
  size(500,500);

}

void draw(){
  background(0);
  stroke(0); //spaceship
  strokeWeight(2);
  fill(#F5F5F5);
  circle(shipX,shipY,50);
  fill(0);
  circle(shipX,shipY,20);
  triangle(shipX,shipY,shipX-8,shipY 25,shipX 8,shipY 25);
  fill(105,105,105);
  rect(shipX-20,shipY 20,40,5);
  rect(shipX-25,shipY 25,50,15);
  fill(255,255,0);
  triangle(shipX-25,shipY 25,shipX-40,shipY 35,shipX-25,shipY 40);
  triangle(shipX 25,shipY 25,shipX 40,shipY 35,shipX 25,shipY 40);
  fill(#F5F5F5);
  arc(shipX,shipY 40,50,20,0,PI, CHORD);  
  
}
  void keyPressed(){ //spaceship movement
    if(key == 's')
    shipY = shipY 10;
    if(key=='w')
    shipY = shipY-10;
    if(key =='a')
    shipX= shipX-5;
    if(key =='d')
    shipX= shipX 5;
  }
 

Позже я хочу позвонить void drawPlayer(float x, float y) , чтобы вместо этого нарисовать корабль.

Однако после розыгрыша игрока путем вызова drawPlayer(0,0); void draw() , движения больше не работают. Вот новый блок кода:

 float x=0;
float y=0;

void setup(){
  size(500,500);
 
}

void draw(){
  background(0);
  drawPlayer(50,50);
  }

  void drawPlayer(float x, float y){
  stroke(0); //spaceship
  strokeWeight(2);
  fill(#F5F5F5);
  circle(x,y,50);
  fill(0);
  circle(x,y,20);
  triangle(x,y,x-8,y 25,x 8,y 25);
  fill(105,105,105);
  rect(x-20,y 20,40,5);
  rect(x-25,y 25,50,15);
  fill(255,255,0);
  triangle(x-25,y 25,x-40,y 35,x-25,y 40);
  triangle(x 25,y 25,x 40,y 35,x 25,y 40);
  fill(#F5F5F5);
  arc(x,y 40,50,20,0,PI,CHORD);

  }

  void keyPressed(){ //spaceship movement
    if(key == 's')
    y = y   10;
    if(key =='w')
    y = y - 10;
    if(key =='a')
    x= x - 5;
    if(key =='d')
    x= x   5;
  }
 

Я новичок в программировании, поэтому все становится запутанным. Это потому, что глобальная переменная x, y не вызывается? Я попытался включить функцию перемещения void drawPlayer(float x, float y) , но корабль все еще не может двигаться. Было бы здорово, если бы кто-нибудь мог мне в этом помочь. Спасибо!

Ответ №1:

Эта строка:
drawPlayer(50,50);
отправляет 50 , 50 как значения для x и y в вашей drawPlayer функции. Таким образом, независимо от того, на какие глобальные значения x и y изменяются нажатием клавиши, значения внутри вашей функции всегда равны 50,50, поэтому корабль никогда не движется.

Просто измените его на
drawPlayer(x,y);
чтобы отправить глобальные значения в функцию, и она должна работать.

Чтобы избежать путаницы, вы можете изменить имена глобальных переменных, чтобы они отличались от локальных переменных, которые используются внутри функции:

 float shipX=0;
float shipY=0;

void setup(){
  size(500,500);
 
}

void draw(){
  background(0);
  drawPlayer(shipX, shipY);
}

void drawPlayer(float x, float y){
  stroke(0); //spaceship
  strokeWeight(2);
  fill(#F5F5F5);
  circle(x,y,50);
  fill(0);
  circle(x,y,20);
  triangle(x,y,x-8,y 25,x 8,y 25);
  fill(105,105,105);
  rect(x-20,y 20,40,5);
  rect(x-25,y 25,50,15);
  fill(255,255,0);
  triangle(x-25,y 25,x-40,y 35,x-25,y 40);
  triangle(x 25,y 25,x 40,y 35,x 25,y 40);
  fill(#F5F5F5);
  arc(x,y 40,50,20,0,PI,CHORD);
}

void keyPressed(){ //spaceship movement
  if(key == 's')
  shipY = shipY   10;
  if(key =='w')
  shipY = shipY - 10;
  if(key =='a')
  shipX = shipX - 5;
  if(key =='d')
  shipX = shipX   5;
}