【问题标题】:I was wondering if someone could help me re-format my code to fix the loop I made我想知道是否有人可以帮助我重新格式化我的代码以修复我制作的循环
【发布时间】:2022-01-07 10:23:02
【问题描述】:

我想知道我在格式为“''”的行中犯了什么错误,因为我想知道为什么我的代码不会移回右侧以在墙壁之间来回反弹。我将需要帮助的代码放在单引号中。这是我第一次在堆栈上,所以任何提示将不胜感激。

PImage invader, invader2, invader3, invader4, invader5, space, tank;
int tankX = 400;
PImage [] picArray = new PImage [7];
int invaderState = 2;
int timer = 0;
int lap = 0;
int [] alienXPos = {100, 180, 260, 340, 420, 500, 580, 660, 740, 820};
//had to add a few zeros on alienYPos otherwise the loop would bug out and wouldn't work
int[] alienYPos  =  {40, 140, 240, 340, 0, 0, 0, 0, 0, 0};
boolean moveLeft, moveRight;
int paddleSpeed = 3;
int gameState = 1;
String message1 = "Welcome to space invaders!";
String message2 = "Click space to start!";
boolean movingLeft, movingRight;

void setup() {
  size(1000, 1000);
  invader = loadImage("invader.jpg");
  invader.resize(70, 50);
  invader2 = loadImage("invader2.png");
  invader2.resize(70, 50);
  space = loadImage("space.png");
  space.resize(1000, 1000);
  tank = loadImage("tank.png");
  tank.resize(150, 100);
}

void draw() {

  background(space);

  timer = millis();

  if (timer-lap>800) {
    lap = timer;

   ' **for (int m=0; m <10; m++) {

      if (movingRight == false) {
        alienXPos[m] += 40;
      } else {
        alienXPos[m] -= 40;
      }
      if (alienXPos [m] > 900 && movingRight == false) {
        movingRight = true;
        for (int l=0; l<10; l++) {
          alienYPos[l] += 75;
                       println("movingleft : " + movingLeft);
                       println("Moving right : " + movingRight);
        }
       // if(movingLeft == false){
        // alienXPos[m] -= 55;
        //}
         //else{
          // alienXPos [m] += 40;
         //}

         
 if (movingLeft == false) {
        //alienXPos[m] -=55;
      } /*else {
        alienXPos[m] ;
      }*/
        if (alienXPos[m] < 100 && movingLeft == true) {
          movingLeft = false;
          movingRight = true;
         /*for (int l=0; l<10; l++) {
          alienYPos[l] += 75;
        }** '
             println("movingLeft : " + movingLeft);
*/
        }
      }
    }
    /* if (alienXPos[m] > 0 && movingLeft == true) {
     alienXPos[m] -= 55;
     
     }*/





    if (invaderState == 1) {

      invaderState = 2;
    } else {

      invaderState = 1;
    }
  }

  if (tankX > width) {
    tankX = 0;
  }
  if (tankX < 0) {
    tankX = 1000;
  }
  if (gameState == 1) {
    drawGameState1();
  } else if (gameState == 2) {
    drawGameState2();
  }
}



void drawGameState1() {
  background(#222222);
  fill(#000000);
  textSize(36);
  fill(130, 130, 130);
  text(message1, 300, 450);
  textSize(20);
  text(message2, 430, 600);
}
void drawGameState2() {
  background(space);
  drawSpaceInvader1();
  drawTank();
  drawTankMovement();
}


void drawSpaceInvader1() {
  for (int i=0; i< 10; i++) {
    if (invaderState == 1) {
      image(invader, alienXPos[i], alienYPos[0]);
      image(invader, alienXPos[i], alienYPos[1]);
      image(invader, alienXPos[i], alienYPos[2]);
      image(invader, alienXPos[i], alienYPos[3]);
    } else if (invaderState == 2) {

      image(invader2, alienXPos[i], alienYPos[0]);
      image(invader2, alienXPos[i], alienYPos[1]);
      image(invader2, alienXPos[i], alienYPos[2]);
      image(invader2, alienXPos[i], alienYPos[3]);
    }
  }
}

void drawTank() {
  image(tank, tankX, 700);
}
void drawTankMovement() {
  if (moveLeft) {
    tankX -= 25;
  }
  if (moveRight) {
    tankX += 25;
  }
}
void keyPressed() {
  if (gameState == 1) {
    if (keyCode == 32) {
      gameState = 2;
    }
  }
  if (gameState == 2) {
    if (keyCode == LEFT) {
      moveLeft = true;
    }
    if (keyCode == RIGHT) {

      moveRight = true;
    }
  }
}
void keyReleased() {
  if (keyCode == LEFT) { // Left Key
    moveLeft = false;
  }

  if (keyCode == RIGHT) { // Right Key
    moveRight = false;
  }
}

【问题讨论】:

    标签: processing


    【解决方案1】:

    一些事情:

    • 下次,请尝试提供minimal, reproducible example,您就快到了,但您忘记附加用于绘制游戏的图像文件。运行此代码给了我错误,说我丢失了一些文件。我冒昧地导入了一些无意义的图像并将其重新用作您丢失的资产。
    • 您的回答中还缺少一个更隐含的标题。我认为您误解了术语“重新格式化”代码,因为它通常指的是formatting of code。为了使其他有相同问题的人可能找到您的答案,请考虑将标题更改为您的问题的实际内容:您无法弄清楚为什么您的代码不会反转您的太空入侵者行的移动。下次请阅读this guide,了解如何写出正确的问题。

    现在回答你的问题:

    我运行了你的代码,发现movingLeft 是假的,而movingRight 是真的。然而,您的入侵者似乎正在向屏幕左侧运行。您的错误之一可能是被这些变量弄糊涂了。

    在你的代码中

    if (movingRight == false) {
      alienXPos[m] += 40;
    } else {
      alienXPos[m] -= 40;
    }
    

    这实际上与您想要的相反。坐标的方向是这样的,假设我们有一个 800x400 的画布:

    所以如果你想让你的入侵者向右移动,你应该在 bool 为真时添加坐标,而不是当它为假时。您翻转入侵者方向的逻辑应该是合理的:

    if (alienXPos[m] < 100 && movingLeft == true) {
       movingLeft = false;
       movingRight = true;
    }
    

    但是由于在你的程序中由于上述逻辑错误,movingLeft 永远不会为真,所以这条语句永远不会运行。

    一个建议是,在太空入侵者的简单情况下,您实际上并不需要为每个方向跟踪两个单独的移动变量,毕竟,入侵者要么:

    • 向右移动

    • 向左移动

    因此,您可以放弃使用两个变量,而只检查 movingRight。如果是真的,入侵者应该向右移动,如果是错误的,他们应该向左移动。

    【讨论】:

    • 非常感谢您对我的帮助
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2019-04-17
    • 2014-01-25
    • 2023-01-29
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多