如何在Processing中完成这个Ender的游戏脚本?

时间:2016-11-17 18:08:47

标签: processing

   /* Draw a laser beam from the start point in the direction of the end point
 but have it stop if it bumps into a rock.*/

int laserColor = color(255, 0, 0);
int rockColor = color(0, 255, 0) ;
int startX = (1);
int startY = (1);
int laserX = (10);
int laserY = (20);
int laserDX = (30);
int laserDY = (40);

float r = 100;
float g = 150;
float b = 200;
float a = 200;
float f = 100;

float diam = 20;
float dim = 70;

float x = 100;
float y = 100;
float z = 20;
int t = 100;
int s = 100;
int w = 60;
int h = 60;
int eyeSize = 16;

void setup() {
  size(400, 400);
  background(239, 276, 238);
}

void draw() {
  drawPlayer();
  drawRocks();
  drawWall();
  drawBeam();
  background(255);
  if (mousePressed) {
    a--;
    fill(0);
    text("Score" + a, 325, 10);
  }
  {
  void drawPlayer(){
      // Draw player's head
  fill(255);
  ellipse(x,y,w,h);

  // Draw player's eyes
  fill(0);
  ellipse(x-w/3+1,y,eyeSize,eyeSize*2);
  ellipse(x+w/3-1,y,eyeSize,eyeSize*2);
  }

  void drawRocks(){
    //draw rocks
    fill(255);
    ellipse(x, y+(x/2), diam, diam);

    fill(255);
    ellipse(x+(3*x), y+(.5*x), diam, diam);

    fill (255);
    ellipse(x+(2*x), y+y, diam, diam);

    fill(255);
    ellipse(x+y, y+y, diam, diam);
  }

  void drawWall(){
    // draw the wall 
  stroke(0);
    fill(f, w, f, a);
  rect(x+(1.5*x), (y-(.05*z)), dim, diam);
  }

  void drawBeam(int startX, int startY, int endX, int endY) {
    float laserX, laserY, laserDX, laserDY;
    stroke(156, 255, 0);
    strokeWeight(5);
    float distance = dist(endX, endY, startX, startY);
  }
  }
}
{

// expand the reach of the beam about 1 pixel per loop iteration
// so it doesn't skip over anything

laserDX = (endX-startX)/distance;
laserDY = (endY-startY)/distance;

// make sure both laserDX and laserDY aren't zero or the loop will never end
if (laserDX == 0 && laserDY == 0) {
  return; // don't draw anything
}

// lx,ly track where the beam will end
float lx = startX; 
float ly = startY;

// move along in the direction of the beam until you hit the edge or an object
while (get((int)lx, (int)ly) != rockColor && lx > 0 && lx < width && ly > 0 && ly < height) {
  lx = lx + laserDX;
  ly = ly + laserDY;
}
// found the end of the laser beam - draw it
line(startX, startY, lx, ly);
}

由于某种原因,这出现了错误。我不知道为什么功能不起作用,我也不知道如何申报激光器等等。我必须用这个代码做更多的事情,但现在我只是想清理我所拥有的东西,因为我知道这是我必须做的基本概要。

1 个答案:

答案 0 :(得分:1)

Stack Overflow并非真正针对一般&#34;我如何做到这一点&#34;输入问题。它设计用于更具体的&#34;我试过X,期望Y,但是得到了Z而不是#34;输入问题。关于代码的事情是,有一百万种方法可以做任何一件事,你采取哪种方法更多地依赖于你而不是我们。因此,如果您没有具体问题,可能很难提供帮助。话虽如此,我会尝试在一般意义上提供帮助:

首先,您的代码无法编译。您的drawRocks()drawBeam()函数在您的draw()函数中定义为 ,这是无效的语法。你不能在其他功能中拥有这些功能。换句话说,这是错误的:

void draw(){

   void drawRocks(){
      //draw rocks
   }

   void drawBeam(){
      //draw beam
   }
}

您需要在同一级别定义所有功能,如下所示:

void draw(){
   drawRocks();
   drawBeam();
}

void drawRocks(){
   //draw rocks
}

void drawBeam(){
   //draw beam
}

注意我如何在同一级别定义函数,然后从drawRocks()函数调用drawBeam()draw()函数。

但是只需将drawBeam()函数移到draw()函数之外就行了,因为你在该函数中有变量,你试图在它之外使用它。这并没有多大意义。

我能给你的最好的建议就是从小处开始。你似乎咬得比你现在应该咀嚼的多,这是一个非常常见的错误,新手(和非新手)制作。

从一个更基本的草图开始,只做一件事。只需在屏幕上移动一个圆圈即可。在继续前进之前要完美地工作。然后使其圆圈从屏幕边缘反弹。然后制作它,使圆圈从屏幕中间的正方形反弹。

以这样的小步骤向上迈进。 从小处着手。比您想象的要小一些。不要试图一次性完成整个游戏。在小型示例程序中工作,这样一来,如果您遇到困难,您就可以发布MCVE以及特定问题。祝你好运。