具有不间断反射的精灵图像

Posted

技术标签:

【中文标题】具有不间断反射的精灵图像【英文标题】:Sprite image having non-stop reflection 【发布时间】:2014-07-27 06:10:10 【问题描述】:

当我在画布上绘制我的精灵图像时,假设它会从画布的侧面反射出来。但是在我在画布上绘制了更多的精灵图像之后,当我碰到画布的一侧时,它们会不停地反射,使其成为单独的画布一侧的双图像。这是使它改变方向的代码:

Fish.prototype.changeDirection = function () 
    speedXSign = this.speedX > 0 ? 1 : -1;
    speedYSign = this.speedY > 0 ? 1 : -1;
    this.speedX = speedXSign * (1 + Math.random() * 2);
    this.speedY = speedYSign * (1 + Math.random() * 2);
; 

我在绘制多个精灵图像后检查错误:http://jsfiddle.net/Bernard_9/8gTNk/7/

【问题讨论】:

【参考方案1】:

当鱼撞到一边时,它应该会反射。但是,您并没有检查鱼何时在向侧面移动时。例如,鱼往右走,撞到了右边的墙上。 speedX 翻转,因此他正在以相反的方式行驶。下一次检查位置时,他仍然在跑到墙上(即使他正在远离它),所以 speedX 再次翻转(现在再次向右移动)所以他跑到墙上,并重复该过程。

固定代码(注意对 speedX 和 speedY 的检查):

if ((this.xPos + this.frameWidth * this.frameScale / 2) >= canvas.width && this.speedX > 0 || 
    (this.xPos - this.frameWidth * this.frameScale / 2) <= 0 && this.speedX <= 0) 
    this.speedX = -this.speedX;


this.yPos += this.speedY;
if ((this.yPos + this.frameHeight * this.frameScale / 2) >= canvas.height && this.speedY > 0 || 
    (this.yPos - this.frameHeight * this.frameScale / 2) <= 0 && this.speedY <= 0) 
    this.speedY = -this.speedY;

http://jsfiddle.net/8gTNk/8/

【讨论】:

用一个工作示例更新了我的答案。请重新阅读我的解释。它拥抱墙壁,因为它在接近和远离墙壁时会与侧面“碰撞”。 另外,“重复”的鱼是相同的鱼每帧翻转方向非常快(左-右-左-右-左-右-左-右)

以上是关于具有不间断反射的精灵图像的主要内容,如果未能解决你的问题,请参考以下文章

平面反射

如何向 GLTF 模型添加光泽度/镜面反射纹理?

没有 UIImageView 的 UIImage 的反射

vary 菲涅尔反射参数

vary 菲涅尔反射参数

分割/区分图像中的反射表面