在画布上更改时,不同的对象会相互影响。 (对象克隆问题?)

时间:2017-10-01 14:28:44

标签: javascript jquery scope sprite-sheet

基本上,我在javascript中从头创建了自己的spritesheet类。 It works perfectly when I only try to animate one of the same spritesheet at a time.(不是最好的GIF,但你可以看到它在行动)。 However, once I start animating the cloned spritesheet on other characters, weird stuff starts happening.当它正常工作时,每个方向有3个不同的帧(3个独特的帧,每个动画4个),当它被窃听时,它似乎主要被卡在第2帧上,有时会闪烁第1帧。尽管在$ .extend()中使用了jQuery的深层副本,但实际上听起来像是在某些地方使用ref克隆对象;

现在,我实际上并不确定这会出现什么问题,尽管它在逻辑上看起来很明显。我一直在调试器中,我找不到任何会导致/表明这种情况的破坏逻辑。事实上,当我在调试器中逐帧浏览时,我没有得到(视觉上)问题,所以它几乎看起来像是画布的图形错误。在Chrome和&amp ;;中获得相同的结果IE浏览器。我会尽可能地为你们隔离问题;如果您想要更多代码,请告诉我。我真的没有看到我的spritesheet / player类中的错误逻辑是什么,因为当只有一个时它可以正常工作。我认为克隆它们的方式有问题,因为它们根本不应该相互影响。我加倍检查我的Player和Spritesheet类很多,以确保我没有弄乱范围(例如创建一个全局变量而不是字段)。我将提供我尝试创建和克隆这些对象的代码...

我对JavaScript中的面向对象相当新,所以我在下面添加了一个小类片段,以防我在尝试创建字段的方式做得不好,并搞砸了范围。但是我对随机虚拟对象做了很多测试,我没有看到任何问题。

//image preload
var playerSpritesheetImg = new Image();
playerSpritesheetImg.src = "content/playerSpritesheet.png";


$(document).ready(function()
{
    // create main game canvas
    $("<canvas/>", {id: "gameCanvas"}).appendTo("body");
    $("#gameCanvas").attr("width", CANVAS_X);
    $("#gameCanvas").attr("height", CANVAS_Y);
    $("#gameCanvas").css("position", "relative");
    $("#gameCanvas").css("border", "1px solid black");

    // get context
    ctx = $("#gameCanvas")[0].getContext("2d");

    // Initialize player's spritesheet
    playerSpritesheet = new Spritesheet(playerSpritesheetImg, 32, 64, 1);    
    // (spritesheet's animations initialization ...)
    
    // duplicate player spritesheet to new objects in order for them to not use the same sprites/animations.
    ps2 = new Object();
    ps3 = new Object();
    $.extend(true, ps2, playerSpritesheet);
    $.extend(true, ps3, playerSpritesheet);

    player = new Player(playerSpritesheet, 128, 128, Elements.Fire);
    player2 = new Player(ps2, 256, 256, Elements.Water);
    player3 = new Player(ps3, 384, 384, Elements.Earth);
    
    //...more onload stuff..
}
    
// Example class fields; potential problem (not actual code)
function Spritesheet(img)
{
    // these properties should be normal class properties?
    this.animations = new Array();
    this.img = img;
  
    // private field used only within class?
    var isThisKindOfFieldBad? = 0;
    var currentFrame = 0;
    var currentAnimationIndex = 0;
    var currentAnimationPosition = 0;
    
    // function which changes both public properties and private fields
    this.Play = function(name)
    {
        // gets animation index from name, then in Update() increment currentAnimationPosition as needed                   
    }
    
    this.Update()
    {
        // (currentAnimationPosition++ or loop back to 0 if > animationFrames.length) then switch currentFrame:
        currentFrame = this.animations[currentAnimationIndex].animationFrames[currentAnimationPosition];
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

我尝试以不同的方式使用jQuery.extend(),没有深拷贝和直接赋值。我也试过复制玩家而不是spritesheets。我想补充一点,spritesheet类的主要功能是基于嵌套数组(如我的类片段中所述):SpritesheetName.animations[animation].animationFrames[frame];所以如果副本出现问题,可能与此有关。而且,它们都是从同一图像被绘制到画布上,可能会导致问题吗?对于这一切的模糊性我感到很抱歉,希望有人可以看到克隆的明确问题。任何帮助将不胜感激。

0 个答案:

没有答案