/* 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);
}
由于某种原因,这出现了错误。我不知道为什么功能不起作用,我也不知道如何申报激光器等等。我必须用这个代码做更多的事情,但现在我只是想清理我所拥有的东西,因为我知道这是我必须做的基本概要。
答案 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以及特定问题。祝你好运。