粒子的代码不起作用。绘图时出错?

时间:2014-08-19 09:58:47

标签: javascript canvas drawing draw particles

嗨那里:)只是试图用粒子完成这个小测试,但我得到了一些"外推"行为。我会告诉你两个"版本"的代码。它的工作原理如下: - 我创建一个粒子,传递一个"粒子设置",它意味着生命体,颜色,spawntype等的粒子配置。现在,我只有一个粒子类型" AcidQuads"。它们的意图是它们的工作(它工作正常)但是随机的初始颜色如果" rndiColor" value设置为true。如果是,则通过传递" iRed"," iGreen"中包含的列表来生成颜色。和" iBlue" (同样代表iAlpha)到一个函数(rndbtw)。它工作正常(或者我所看到的)。具有"列表"的PARTICLES_SETTINGS属性作为一个值,意味着粒子值将由rndbtw()生成,它返回属性的1个元素和0之间的值(iRed:[255,0]将返回0到255之间的数字)。我已经发出警报,看看为每个粒子生成的值,它们都没问题。颜色值是正确的(在0到255之间)并且一切看起来都很好......但是,我可以获得粒子的唯一方法是通过设置iRed / iGreen / iBlue来设置[0,255],它会始终生成白色粒子,具有不同的alpha值。 "工作"代码是下一个:

    </head>
<body>
    <canvas ID="test" width="640" height="480"></canvas>
    <script>

var QUAD    = 1,
    GRAVITY = 0.3;  

var mouse;
    mouse = {x: 0, y: 0};
document.addEventListener('mousemove', function(e){ 
                           mouse.x = e.clientX - 12; 
                           mouse.y = e.clientY - 23 //Fix poco decente! no hagan esto en casa.
                         }, false);

function rndbtw(range)       { return (Math.random()*range[0])+range[1] }
function getRGBA(R, G, B, A) { return 'rgba('+R+','+G+','+B+','+A+')' }




var PARTICLES_SETTINGS = {
    'AcidQuads': {
        //Shape and size related
        shape: QUAD,
        rndSize: true,
        size: {width:  [10, 2],
               height: [10, 2]
              },
        //Color related
        rndiColor: true,
        iRed:   [0, 255], //Here are the color values
        iGreen: [0, 255],
        iBlue:  [0, 255],
        // Alpha
        rndiAlpha: true,
        iAlpha: [1, 0.1],
        // Velocity related
        rndVelocityX: true,
        rndVelocityY: true,
        iVelx: [10, -5],
        iVely: [10, -5],
        // Position related
        xfollowMouse: true,
        yfollowMouse: true,
        // Life related
        rndLiferate: true,
        liferate: [100, 30]
    }
}

var Particle = function(settings, spawnPosition) {
    this.settings = PARTICLES_SETTINGS[settings]
    if (this.settings.rndiColor) {
        //Get random initial color
        //If the color must be random, call rndbtw() passing the two-values list
        this.R = rndbtw(this.settings.iRed);
        this.G = rndbtw(this.settings.iGreen);
        this.B = rndbtw(this.settings.iBlue);
    } else {
        //Or get the specified initial color
        this.R = this.settings.iRed;
        this.G = this.settings.iGreen;
        this.B = this.settings.iBlue;
    }
    this.A = (this.settings.rndiAlpha) ? rndbtw(this.settings.iAlpha):this.settings.iAlpha;
    this.color = getRGBA(this.R, this.G, this.B, this.A); //rgba string for canvas.
    //
    this.velx = (this.settings.rndVelocityX) ? rndbtw(this.settings.iVelx):this.settings.iVelx;
    this.vely = (this.settings.rndVelocityY) ? rndbtw(this.settings.iVely):this.settings.iVely;
    //
    this.x = (this.settings.xfollowMouse) ? mouse.x:spawnPosition[0];
    this.y = (this.settings.yfollowMouse) ? mouse.y:spawnPosition[1];
    //
    this.maxLife = (this.settings.rndLiferate) ? rndbtw(this.settings.liferate):this.settings.liferate;
    //-
    this.shape = this.settings.shape;
    this.size = (this.settings.shape == QUAD) ? {
                                                     width:  (this.settings.rndSize) ? rndbtw(this.settings.size.width):this.settings.size.width,
                                                     height: (this.settings.rndSize) ? rndbtw(this.settings.size.height):this.settings.size.height
                                                  }:(this.settings.shape.POINT)  ? 
                                                    {radius: (this.settings.rndSize) ? rndbtw(this.settings.size.radius):this.settings.size.radius}:'Another shapetype';
    //-
    this.life = 0;
    //
    this.id = particleIndex;
    particles[particleIndex] = this;
    particleIndex++;
    test = 'Color: '+this.color+' /vel(x,y) '+this.velx+','+this.vely+' /type '+this.shape+' /size '+this.size+' /settings '+this.settings+' /id '+this.id;
    alert(test);
}
Particle.prototype.live = function() {
    //Kill?
    if (this.life == this.maxLife) {
        delete particles[this.id];
    }
    //Draw
    ctx.fillStyle = this.color;
    alert(this.color);
    switch (this.shape) {
        case QUAD:
            ctx.fillRect(this.x, this.y, this.size.width, this.size.height);
            break;
    }

    //Update
    this.x += this.velx;
    this.y += this.vely;
    this.vely += GRAVITY;
    this.life++;
    return
}


//--------------------------------------------------//
var particles,
    particleIndex,
    canvas,
    ctx;

canvas = document.getElementById('test');
ctx    = canvas.getContext('2d');
particles = [];
particleIndex = 0;

setInterval(function() {
    for (var i=0; i<=10; i++) {
        new Particle('AcidQuads');
    }
    ctx.fillStyle = '#000000';
    ctx.fillRect(0, 0, 640, 480);
    for (var i in particles) {
        particles[i].live();
    }
}, 30)

    </script>


</body>
</html>

仅绘制具有随机alpha的白色粒子。您可以在警报中看到,值仅为(255,255,255,随机)。为了更改它,并生成0到255之间的随机值,代码将改变它:

rndiColor: true,
iRed:   [0, 255],
iGreen: [0, 255],
iBlue:  [0, 255],

到此:         rndiColor:是的,         iRed:[255,0],         iGreen:[255,0],         iBlue:[255,0],

在警报中,您将看到值正常,R,G,B介于0到255之间,而alpha介于0.1和1之间......但如果我改变了这一点,我就不会看到任何粒子绘制。几天前,我通过设置例如iRed:function(){return Math.random()* 255 + 0}并调用&#34; settings.iRed();&#34来制作具有随机颜色的粒子;获得红色的随机值,但制作新粒子的方式有点乏味......我更喜欢只列出一系列值的列表。 为什么,如果生成值ok(0到255之间)没有绘制,而如果我放[min,max]它们只是每个粒子的一种颜色?所有其他东西都工作得很好(速度,寿命,alpha和大小)。

高级感谢您的帮助,请原谅我的英语不好。

顺便说一句......我将替换RequestAnimation的setInterval,如果我打开另一个网页,它会冻结我的浏览器xD

谢谢! :)

1 个答案:

答案 0 :(得分:0)

首先:在阅读之前,让你的头远离任何墙壁;-)

您正在使用广告DOM&#39; rgb(,,)&#39;用于定义颜色的字符串:它需要整数 R,G,B在0..255中。

所以只需将rndbtw改为:

function rndbtw(range) { return  Math.floor((Math.random()*range[0])+range[1]) ; }

应该带回颜色!!