Вы должны сделать следующее:
нарисовать прямоугольник пули таким образом, чтобы его центр находился в (0, 0):
rect(0, 0, 10, 10);
повернуть прямоугольник в направлении движения:
rotate(ang);
перевести прямоугольник в новое положение:
translate(x, y);
Поскольку такие операции, как translate
и rotate
определяют новую матрицу и умножают текущую матрицу на новую матрицу, матричные операции имеютэто должно быть сделано в обратном порядке.
Обратите внимание, что угол в sin()
и 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
и порождайте (добавляйте) новую пулю, когда ПРОБЕЛ нажата:
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;
}
}
Обновить (переместить) все маркеры в массиве в обновлении. Держите только пули, которые все еще в окне. Сохраните маркеры, которые находятся в окне, в новый массив и замените массив маркеров новым массивом:
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();
}