在点之间绘制线条,每条线条随机移动

时间:2016-08-20 08:30:15

标签: java opengl lwjgl lines points

我正在使用LWJGL开发Java游戏。我制作了一个粒子系统,希望获得与本网站相同的结果:http://play.cubedpixels.de

这是我到目前为止所得到的:

Picture

我尽我所能,问题是它停止了,他们只是向一个方向移动。这条线也不像这个网站。在网站上它更顺畅,更好。他们也在使用OpenGL。

如何解决这些问题并使我的实施更好,更像是一个网站?

下面的代码显示了两个类:ParticleGalaxy和Pa​​rticle。后者是前者的内部类,但为了清楚起见,我将它们拆分成单独的片段。

ParticleGalaxy

public class ParticleGalaxy
{
    private int count;
    private int width;
    private int height;
    private int mousex;
    private int mousey;
    public ArrayList<Particle> particles = new ArrayList();
    private Random random = new Random();
    private TimerUtil timer = new TimerUtil();
    int state = 0;
    int a = 255;
    int r = 255;
    int g = 0;
    int b = 0;

    public ParticleGalaxy(int count, int width, int height)
    {
        this.count = count;
        this.width = width;
        this.height = height;

        for(int i = 0; i < count; i++)
        {
            this.particles.add(
                new Particle(this.random.nextInt(width),
                this.random.nextInt(height)));
        }
    }

    public void drawParticles(int mousex, int mousey)
    {
        this.mousex = mousex;
        this.mousey = mousey;

        for(Particle p : this.particles)
        {
            if(p.reset)
            {
                p.resetPosSize();
                p.reset = false;
            }

            int x = Math.abs(p.getX() - mousex);

            int y = Math.abs(p.getY() - mousey);

            if((x < 40 && x > -40) && (y<35 && y>-40))
            {
                p.setConnect(true);
            }
            else
            {
                p.setConnect(false);
            }

            p.draw();
        }
    }
}

粒子

public class Particle
{
    private int x;
    private int y;
    private int k;

    private int movey;
    private int movex;

    private int starty;
    private int startx;


    private int locationy;
    private int locationx;
    private float size;
    private boolean reset;
    private boolean connect;
    private Random random = new Random();
    private TimerUtil timer = new TimerUtil();

    private boolean moving = false;
    private boolean start = false;

    public Particle(int x, int y)
    {
        this.x = x;
        this.y = y;
        this.startx = x;
        this.starty = y;
        this.size = genRandom(0.57F, 0.71F);
    }

    public void setConnect(boolean bool)
    {
        connect = bool;
    }

    public int getX()
    {
        return x;
    }

    public int getY()
    {
        return y;
    }

    private void drawLine(int xto, int yto, int xfrom, int yfrom)
    {
        GL11.glLineWidth(1.2f);
        GL11.glColor3f(1.0f, 1.0f, 1.0f);
        GL11.glBegin(GL11.GL_LINE_STRIP);
        GL11.glVertex2d(xto, yto);
        GL11.glVertex2d(xfrom, yfrom);
        GL11.glEnd();
    }

    public void draw()
    {
        if(!start)
        {
            start = true;
            movex = height - random.nextInt(height);
            movey = width - random.nextInt(width);
            move(startx, starty, movex, movey);
        }

        float speed = 1;
        float elapsed = 0.01f;

        // On starting movement
        float distance = (float)Math.sqrt(Math.pow(movex - startx, 2) +
                                          Math.pow(movey - starty, 2));
        float directionX = (movex - startx) / distance;
        float directionY = (movey - starty) / distance;

        if(moving == true)
        {
            x += directionX * speed * elapsed;
            y += directionY * speed * elapsed;

            if(Math.sqrt(Math.pow(x - startx, 2) + Math.pow(y - starty, 2)) >= distance)
            {
                x = (int)movex;
                y = (int)movey;
                resetPosSize();
                this.reset = true;
                moving = false;
            }
        }

        this.k += 1;

        int xx = 0;
        int yy = 0;

        this.locationx = this.x + xx;
        this.locationy = this.y + yy;

        if(locationx < 0 || locationy < 0)
            this.reset = true;

        if(locationx > width || locationy > height)
            this.reset = true;

        GuiUtils.drawCircle(this.x + xx, this.y + yy, this.size, -1);

        if(connect)
        {
            for(Particle p : particles)
            {
                if(p.connect)
                    drawLine(locationx, locationy, p.locationx, p.locationy);
            }
        }
    }

    public void move(int startX, int startY, int endX, int endY)
    {
        x = (int)startX;
        y = (int)startY;
        moving = true;
    }

    public void resetPosSize()
    {
        this.x = this.random.nextInt(ParticleGalaxy.this.width);
        this.y = this.random.nextInt(ParticleGalaxy.this.height);
        startx = x;
        starty = y;
        movex = height - random.nextInt(height);
        movey = width - random.nextInt(width);
        move(startx, starty, movex, movey);
    }

    public float genRandom(float min, float max)
    {
        return (float)(min + Math.random() * (max - min + 1.0F));
    }
}

0 个答案:

没有答案