2017-07-13 12 views
0

我想使与一些精灵的运动与键盘的这种互动,我被困在两种情况。 1)角色移动不会根据动画本身进行(它只在动画已经过一秒钟左右后才开始移动)。我真正想要做的是移动时没有因为这个问题而得到的“初始加速感觉” 2)我无法想出一种方法来让角色面对当键时应该面对的位置发行了。我会在这里发布的代码,但由于它需要的图像才能正常工作,如果你想看看是不是这么小我在这个环节提供一个skecth:https://www.openprocessing.org/sketch/439572雪碧平滑的运动,并根据运动面对的位置

PImage[] reverseRun = new PImage [16]; 

PImage[] zeroArray = new PImage [16]; 

void setup(){ 
    size(800,600); 
    //Right Facing 
    for(int i = 0; i < zeroArray.length; i++){ 
    zeroArray[i] = loadImage (i + ".png"); 
    zeroArray[i].resize(155,155); 
    } 
    //Left Facing 
    for(int z = 0; z < reverseRun.length; z++){ 
    reverseRun[z] = loadImage ("mirror" + z + ".png"); 
    reverseRun[z].resize(155,155); 
    } 
    } 

void draw(){ 
    frameRate(15); 
    background(255); 
    imageMode(CENTER); 

    if(x > width+10){ 
    x = 0; 
    } else if (x < - 10){ 
    x = width;} 






if (i >= zeroArray.length){ 
    i = 3;} //looping to generate constant motiion 

if (z >= reverseRun.length){ 
    z = 3;} //looping to generate constant motiion 

if (isRight) { 
    image(zeroArray[i], x, 300); 
    i++; 
    } //going through the images at the array 
else if (isLeft) { 
    image(reverseRun[z],x,300); 
    z++; 
    } going through the images at the array 

else if(!isRight){ 
    image(zeroArray[i], x, 300); 
    i = 0; } //"stoped" sprite 
    } 
} 




//movement 
float x = 300; 
float y = 300; 
float i = 0; 
float z = 0; 
float speed = 25; 
boolean isLeft, isRight, isUp, isDown; 
void keyPressed() { 




setMove(keyCode, true); 

if (isLeft){ 
    x -= speed; 
} 
if(isRight){ 
    x += speed; 
} 
} 

void keyReleased() { 
    setMove(keyCode, false); 

} 

boolean setMove(int k, boolean b) { 
    switch (k) { 
    case UP: 
    return isUp = b; 

    case DOWN: 
    return isDown = b; 

    case LEFT: 
    return isLeft = b; 

    case RIGHT: 
    return isRight = b; 

    default: 
    return b; } 
} 

回答

0

运动问题是由操作系统在按键之间设置延迟引起的。通过转到文本编辑器并按住一个键试试这个。您会注意到一个字符立即显示,然后是一个延迟,然后是字符重复,直到您释放该键。

延迟也发生在调用keyPressed()函数之间。并且由于您在keyPressed()函数中移动角色(通过修改x变量),您看到移动延迟。

解决此问题的方法是检查按下哪个键,而不是仅依赖于keyPressed()函数。您可以使用draw()函数中的keyCode变量,也可以使用一组boolean变量跟踪哪个键被按下。

请注意,您实际上已经在使用isLeftisRight变量。但是你只能在keyPressed()函数中检查它们,因为我上面提到的问题,这个函数会失败它们的目的。

换句话说,从keyPressed()功能移到此块所以它的draw()功能,而不是内部:

if (isLeft){ 
    x -= speed; 
} 
if(isRight){ 
    x += speed; 
} 

至于明知要面对当字符不动哪种方式,你可能用另一种boolean值可以跟踪您所面对的方向。

附注:你应该真的尝试正确缩进你的代码,因为现在很难阅读。

无耻的自我推销:我写了一个关于用户输入的教程,可用here

+0

再次感谢凯文工人,你救了我的一天。顺便说一句,你的网站真棒,我会用它来研究更多。 –