Sprite 平滑的移动和根据移动的面向位置
Sprite Smooth movement and facing position according to movement
我正在尝试使用一些精灵与键盘进行这种交互以进行移动,但我遇到了两种情况。
1) 角色的移动不是根据动画本身进行的(它只是在一秒钟左右之后才开始移动,而它已经被动画化了)。我真正想让它做的是,在没有 "initial acceleration feeling" 的情况下移动,因为这个问题我得到了
2)我想不出一种方法让角色在释放键时面对它应该面对的位置。我将 post 代码放在这里,但由于它需要图像才能正常工作并且不是那么小,所以我在 link 提供了一个草图,如果你想查看的话: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; }
}
移动问题是由您的操作系统设置按键之间的延迟引起的。通过转到文本编辑器并按住一个键来试试这个。您会注意到一个字符会立即出现,随后会出现延迟,然后该字符会重复出现,直到您松开按键。
这种延迟也发生在对 keyPressed()
函数的调用之间。由于您在 keyPressed()
函数内移动角色(通过修改 x
变量),您会看到移动延迟。
这个问题的解决方案是检查按下了哪个键,而不是仅仅依赖keyPressed()
函数。您可以在 draw()
函数中使用 keyCode
变量,或者您可以使用一组 boolean
变量来跟踪按下哪个键。
请注意,您实际上已经在使用 isLeft
和 isRight
变量执行此操作。但是你只是在 keyPressed()
函数中检查它们,由于我上面概述的问题,这违背了它们的目的。
换句话说,将此块从 keyPressed()
函数中移出,使其位于 draw()
函数中:
if (isLeft ){
x -= speed;
}
if(isRight){
x += speed;
}
至于知道当角色不动时面向哪个方向,您可以使用另一个 boolean
值来跟踪您所面对的方向。
旁注:您真的应该尝试正确缩进代码,因为现在很难阅读。
无耻的自我推销:我在 Processing available 中写了一篇关于用户输入的教程 here。
我正在尝试使用一些精灵与键盘进行这种交互以进行移动,但我遇到了两种情况。 1) 角色的移动不是根据动画本身进行的(它只是在一秒钟左右之后才开始移动,而它已经被动画化了)。我真正想让它做的是,在没有 "initial acceleration feeling" 的情况下移动,因为这个问题我得到了 2)我想不出一种方法让角色在释放键时面对它应该面对的位置。我将 post 代码放在这里,但由于它需要图像才能正常工作并且不是那么小,所以我在 link 提供了一个草图,如果你想查看的话: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; }
}
移动问题是由您的操作系统设置按键之间的延迟引起的。通过转到文本编辑器并按住一个键来试试这个。您会注意到一个字符会立即出现,随后会出现延迟,然后该字符会重复出现,直到您松开按键。
这种延迟也发生在对 keyPressed()
函数的调用之间。由于您在 keyPressed()
函数内移动角色(通过修改 x
变量),您会看到移动延迟。
这个问题的解决方案是检查按下了哪个键,而不是仅仅依赖keyPressed()
函数。您可以在 draw()
函数中使用 keyCode
变量,或者您可以使用一组 boolean
变量来跟踪按下哪个键。
请注意,您实际上已经在使用 isLeft
和 isRight
变量执行此操作。但是你只是在 keyPressed()
函数中检查它们,由于我上面概述的问题,这违背了它们的目的。
换句话说,将此块从 keyPressed()
函数中移出,使其位于 draw()
函数中:
if (isLeft ){
x -= speed;
}
if(isRight){
x += speed;
}
至于知道当角色不动时面向哪个方向,您可以使用另一个 boolean
值来跟踪您所面对的方向。
旁注:您真的应该尝试正确缩进代码,因为现在很难阅读。
无耻的自我推销:我在 Processing available 中写了一篇关于用户输入的教程 here。