Игра Лунная посадка. Элементы управления не работают - PullRequest
1 голос
/ 30 марта 2019

Я должен воссоздать лунную посадочную игру в процессе выполнения задания. Элементы управления вообще не работают, и я не могу найти ошибку в своем коде. Кроме того, я новичок в обработке и Java.

int posx, posy;
//initial velocity
float vx,vy;
// gravity
float gravity = 0.05; 
boolean moveLeft, moveRight, moveUp;

void setup() {
   size(500, 500);
   background(0);
     //inital position
    posx =int(random(width)); //position of the left vertex of our ship
    posy =20; // position of the bottom vertex of our ship
    moveLeft = moveRight = moveUp= false;
    //initial velocity
    vx=vy=1;
}

void draw() {
  noStroke();
  background(0);

fill(255,255,255);
rect(0,470,width,30);
fill(255,0,0);
rect(200,470,100,30);

moveKeys();
moveShip();
drawShip();
}

void drawShip() {

fill(169,169,169);
rect(posx,posy,50,25);

fill(255,255,255);
rect(posx+20,posy-10,10,10);

fill(105,105,105);
rect(posx+20,posy+25,10,5);

 stroke(255,255,255);
 strokeWeight(2);
 line(posx+2,posy+25,posx+2, posy+40);

 stroke(255,255,255);
 strokeWeight(2);
 line(posx+48,posy+25,posx+48, posy+40);
}

void moveShip() {

 // Detecting collisions
     if (posx + 25 > width - 1 ||
       posx - 25 < 0)
       vx *= -1;
     if ( posy - 12.5 < 0)
       vy *= -1;
    if ( posy + 50 > height-1) 
       vx=vy=0;

 //update position      
    posx += vx;
    posy += vy;

}

void update() {
   posx += vx;
   posy += vy;
}

void keyPressed() {
 if (key==CODED) {
    switch (keyCode) {
       case UP:
        moveUp = true; break;
      case LEFT:
       moveLeft = true; break;
      case RIGHT:
        moveRight = true;  break;    
    }
  }  
}

void moveKeys() {
    if (moveLeft) translate(posx-= vx, 0);     
    if (moveRight) translate(posx+= vx, 0);
    if (moveUp) { thrust(); }
}

void thrust() {
   if (vy  < 1) vy += 0.1;
}

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

1 Ответ

2 голосов
/ 30 марта 2019

Я вижу несколько проблем в вашем коде.

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

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

Некоторые другие плохие вещи, которые я вижу в вашем коде, это, например, числа posx и posy.Они должны быть числами с плавающей запятой, чтобы работать правильно.Чертеж корабля не совсем точен - на самом деле я не думаю, что posx и posy - это левая и нижняя вершины корабля, как и предполагалось.Посмотрите методы рисования на сайте обработки , чтобы увидеть, что они делают.

Вот код переделки:

// ship position
float posx, posy;
// ship velocity
float vx,vy;
// gravity
float gravity;
// user input
boolean moveLeft, moveRight, moveUp;
// time
float timelast = 0, timenow, timeelapsed;

void setup() {

    size(500, 500);
    background(0);

    //inital position
    posx = 225;//int(random(width - 50)); //position of the left vertex of our ship
    posy = 200; // position of the bottom vertex of our ship
    // initial user input
    moveLeft = moveRight = moveUp= false;
    // initial velocity
    vx = vy = 10;
    // gravity
    gravity = 10;
    timelast = millis();
}

void draw() {

    noStroke();
    background(0);

    fill(255,255,255);
    rect(0,470,width,30);
    fill(255,0,0);
    rect(200,470,100,30);

    updateTime();
    userInput();
    moveShip();
    drawShip();
}

void updateTime() {

    timelast = timenow;
    timenow = millis();
    timeelapsed = timenow - timelast;
}

void drawShip() {

    fill(169,169,169);
    rect(posx,posy,50,25);

    fill(255,255,255);
    rect(posx+20,posy-10,10,10);

    fill(105,105,105);
    rect(posx+20,posy+25,10,5);

    stroke(255,255,255);
    strokeWeight(2);
    line(posx+2,posy+25,posx+2, posy+40);

    stroke(255,255,255);
    strokeWeight(2);
    line(posx+48,posy+25,posx+48, posy+40);
}

void userInput() {

    if (moveLeft)
        vx -= 100 * timeelapsed / 1000;
    if (moveRight)
        vx += 100 * timeelapsed / 1000;
    if (moveUp)
        vy -= 100 * timeelapsed / 1000;
}

void moveShip() {

    vy += gravity * timeelapsed / 1000;

    posx += vx * timeelapsed / 1000;
    posy += vy * timeelapsed / 1000;

    // Detecting collisions
    if (posx + 50 >= width || posx <= 0)
        vx *= -1;
    if (posy - 25 <= 0)
        vy *= -1;
    if (posy + 50 >= height) 
        vx=vy=0;
}

void keyPressed() {

    if (key==CODED) {
        switch (keyCode) {
            case UP:
                moveUp = true;
                break;
            case LEFT:
                moveLeft = true;
                break;
            case RIGHT:
                moveRight = true;
                break;    
        }
    }  
}

void keyReleased() {

    if (key==CODED) {
        switch (keyCode) {
            case UP:
                moveUp = false;
                break;
            case LEFT:
                moveLeft = false;
                break;
            case RIGHT:
                moveRight = false;
                break;    
        }
    }  
}
...