使形状朝 angular 方向移动
Make a shape go in an angular direction
我正在制作小行星,我正在尝试制作子弹机制。子弹应该朝向船的方向(一个角度),但我不知道如何让子弹进入 angular 方向。相反,它会上升、下降或 right/left。
我试过但不起作用的代码:
class Bullet
{
float x,y,vx,vy;
Bullet()
{
rectMode(CENTER);
x = 0;
y = 0;
vx = 100 * cos(ang);
vy = 100 * sin(ang);
}
void draw2()
{
vx = 100 * cos(ang);
vy = 100 * sin(ang);
x += vx;
y += vy;
pushMatrix();
translate(width/2,height/2);
translate(5,0);
rotate(ang);
rect(x,y,10,10);
popMatrix();
}
}
其余代码:
float ang = 0;
boolean spara = false;
Bullet b;
void setup()
{
size(800,600);
rectMode(CENTER);
frameRate(60);
asteroidi = new Asteroide[10];
b = new Bullet();
}
void update()
{
}
void draw()
{
update();
background(200,200,200);
fill(255);
pushMatrix();
translate(width/2,height/2);
translate(25,0);
rotate(ang);
rect(0,0,50,50);
popMatrix();
if(spara)
b.draw2();
}
void keyPressed()
{
switch (keyCode)
{
case RIGHT:
ang += 0.1;
break;
case LEFT:
ang -= 0.1;
break;
case 32:
if (spara) spara = false;
if (!spara); spara = true;
break;
}
}
我调用了draw2()
函数,当boolean spara
是true
时。
您必须执行以下操作:
以这种方式绘制子弹矩形,它的中心位于 (0, 0):
rect(0, 0, 10, 10);
沿移动方向旋转矩形:
rotate(ang);
将矩形转换到新位置:
translate(x, y);
由于像translate
and rotate
这样的操作定义了一个新的矩阵,并将当前矩阵乘以新矩阵,所以矩阵操作必须以相反的顺序进行。
请注意 sin()
and cos()
的角度必须以弧度而不是度数为单位设置。
对了,你确定速度100不会太远吗?
class Bullet
{
float x, y, v, ang;
Bullet(float x, float y, float v, float ang)
{
this.x = x;
this.y = y;
this.v = v;
this.ang = ang;
}
void update() {
x += v * cos(ang);
y += v * sin(ang);
}
void draw()
{
pushMatrix();
// transalte rectangle to new position
translate(x, y);
// rotate rectangle in direction of move
rotate(ang);
// draw rectangle around center
rect(0, 0, 10, 10);
popMatrix();
}
}
管理 ArrayList
中的子弹并在按下 SPACE 时产生(添加)一颗新子弹:
ArrayList<Bullet> bullets = new ArrayList<Bullet>();
float ang = 0.7;
void keyPressed()
{
switch (keyCode)
{
case RIGHT:
ang += 0.1;
break;
case LEFT:
ang -= 0.1;
break;
case 32:
bullets.add(new Bullet(width/2, height/2, 2, ang));
break;
}
}
在更新中更新(移动)数组中的所有项目符号。只保留仍在 window 中的子弹。将 window 中的项目符号存储到新数组中,并用新数组替换项目符号数组:
void update()
{
// array for bullets which ar still in window
ArrayList<Bullet> bulletsInWindow = new ArrayList<Bullet>();
for( int i = 0; i < bullets.size(); ++i ) {
Bullet b = bullets.get(i);
// move bullet
b.update();
// evaluate eif bullet is still in window
if ( b.x >= 0 && b.y >= 0 && b.x <= width && b.y <= height ) {
bulletsInWindow.add(b);
}
}
// keep the bullets which are still in the window
bullets = bulletsInWindow;
}
在 draw()
中循环绘制子弹:
void draw()
{
update();
background(200,200,200);
rectMode(CENTER);
fill(255);
for( int i = 0; i < bullets.size(); ++i ) {
Bullet b = bullets.get(i);
b.draw();
}
pushMatrix();
translate(width/2,height/2);
rotate(ang);
rect(0, 0, 50, 50);
popMatrix();
}
我正在制作小行星,我正在尝试制作子弹机制。子弹应该朝向船的方向(一个角度),但我不知道如何让子弹进入 angular 方向。相反,它会上升、下降或 right/left。 我试过但不起作用的代码:
class Bullet
{
float x,y,vx,vy;
Bullet()
{
rectMode(CENTER);
x = 0;
y = 0;
vx = 100 * cos(ang);
vy = 100 * sin(ang);
}
void draw2()
{
vx = 100 * cos(ang);
vy = 100 * sin(ang);
x += vx;
y += vy;
pushMatrix();
translate(width/2,height/2);
translate(5,0);
rotate(ang);
rect(x,y,10,10);
popMatrix();
}
}
其余代码:
float ang = 0;
boolean spara = false;
Bullet b;
void setup()
{
size(800,600);
rectMode(CENTER);
frameRate(60);
asteroidi = new Asteroide[10];
b = new Bullet();
}
void update()
{
}
void draw()
{
update();
background(200,200,200);
fill(255);
pushMatrix();
translate(width/2,height/2);
translate(25,0);
rotate(ang);
rect(0,0,50,50);
popMatrix();
if(spara)
b.draw2();
}
void keyPressed()
{
switch (keyCode)
{
case RIGHT:
ang += 0.1;
break;
case LEFT:
ang -= 0.1;
break;
case 32:
if (spara) spara = false;
if (!spara); spara = true;
break;
}
}
我调用了draw2()
函数,当boolean spara
是true
时。
您必须执行以下操作:
以这种方式绘制子弹矩形,它的中心位于 (0, 0):
rect(0, 0, 10, 10);
沿移动方向旋转矩形:
rotate(ang);
将矩形转换到新位置:
translate(x, y);
由于像translate
and rotate
这样的操作定义了一个新的矩阵,并将当前矩阵乘以新矩阵,所以矩阵操作必须以相反的顺序进行。
请注意 sin()
and cos()
的角度必须以弧度而不是度数为单位设置。
对了,你确定速度100不会太远吗?
class Bullet
{
float x, y, v, ang;
Bullet(float x, float y, float v, float ang)
{
this.x = x;
this.y = y;
this.v = v;
this.ang = ang;
}
void update() {
x += v * cos(ang);
y += v * sin(ang);
}
void draw()
{
pushMatrix();
// transalte rectangle to new position
translate(x, y);
// rotate rectangle in direction of move
rotate(ang);
// draw rectangle around center
rect(0, 0, 10, 10);
popMatrix();
}
}
管理 ArrayList
中的子弹并在按下 SPACE 时产生(添加)一颗新子弹:
ArrayList<Bullet> bullets = new ArrayList<Bullet>();
float ang = 0.7;
void keyPressed()
{
switch (keyCode)
{
case RIGHT:
ang += 0.1;
break;
case LEFT:
ang -= 0.1;
break;
case 32:
bullets.add(new Bullet(width/2, height/2, 2, ang));
break;
}
}
在更新中更新(移动)数组中的所有项目符号。只保留仍在 window 中的子弹。将 window 中的项目符号存储到新数组中,并用新数组替换项目符号数组:
void update()
{
// array for bullets which ar still in window
ArrayList<Bullet> bulletsInWindow = new ArrayList<Bullet>();
for( int i = 0; i < bullets.size(); ++i ) {
Bullet b = bullets.get(i);
// move bullet
b.update();
// evaluate eif bullet is still in window
if ( b.x >= 0 && b.y >= 0 && b.x <= width && b.y <= height ) {
bulletsInWindow.add(b);
}
}
// keep the bullets which are still in the window
bullets = bulletsInWindow;
}
在 draw()
中循环绘制子弹:
void draw()
{
update();
background(200,200,200);
rectMode(CENTER);
fill(255);
for( int i = 0; i < bullets.size(); ++i ) {
Bullet b = bullets.get(i);
b.draw();
}
pushMatrix();
translate(width/2,height/2);
rotate(ang);
rect(0, 0, 50, 50);
popMatrix();
}