Greenfoot 播放器控件中的逻辑错误
Logic Error in Player Controls in Greenfoot
最近一直在用Greenfoot,想做一个简单的top-down/bullet-hell射击游戏。一切都进行得很顺利,直到我尝试了一些动作。使用旧 "arrow keys to move, space to shoot" 很简单,但是当我尝试沿对角线左上或右下移动并同时射击时,问题就出现了。我一次只能做一个。我注意到方向与它们在 else-if 调用中的位置有关,但这让我无处可去。我也试过移动代码,替换 fire() 调用;完全使用 if 检查,但没有任何改变。
import greenfoot.*;
/**
* Write a description of class PlayerShip here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class PlayerShip extends SmoothMover
{
private int stepSize = 4;
private boolean tiltLeft = false;
private boolean tiltRight = false;
private int tiltFrame = 1;
private int flameFrame = 0;
private final int COOLDOWN = 20;
private int armsCool = 0;
public PlayerShip()
{
}
/**
* Act - do whatever the PlayerShip wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
setImage();
if(Greenfoot.isKeyDown("left") && Greenfoot.isKeyDown("right"))
{
tiltFrame = 1;
}
move();
fire();
armsCool ++;
}
public void setImage()
{
if(Greenfoot.isKeyDown("up"))
{
setLocation(getX(), getY() - stepSize - 2);
}
else if(Greenfoot.isKeyDown("down"))
{
setLocation(getX(), getY() + stepSize + 2);
}
if (Greenfoot.isKeyDown("left")) {
setLocation(getX() - stepSize, getY());
tiltLeft = true;
if(tiltFrame == 1)
{
setImage("LeftTilt1.png");
tiltFrame ++;
}
else if(tiltFrame == 2)
{
setImage("LeftTilt2.png");
tiltFrame++;
}
else if(tiltFrame == 3)
{
setImage("LeftTilt3.png");
tiltFrame++;
}
else
{
if(flameFrame == 1)
{
setImage("LeftTilt.png");
flameFrame --;
}
else
{
setImage("LeftTiltAlt.png");
flameFrame ++;
}
}
}
else if (Greenfoot.isKeyDown("right")) {
setLocation(getX() + stepSize,getY());
tiltRight = true;
if(tiltFrame == 1)
{
setImage("RightTilt1.png");
tiltFrame ++;
}
else if(tiltFrame == 2)
{
setImage("RightTilt2.png");
tiltFrame++;
}
else if(tiltFrame == 3)
{
setImage("RightTilt3.png");
tiltFrame++;
}
else
{
if(flameFrame == 1)
{
setImage("RightTilt.png");
flameFrame --;
}
else
{
setImage("RightTiltAlt.png");
flameFrame ++;
}
}
}
else
{
tiltFrame = 1;
tiltLeft = false;
tiltRight = false;
if(flameFrame == 1)
{
setImage("PlayerShip2.png");
flameFrame --;
}
else
{
setImage("PlayerShip.png");
flameFrame ++;
}
}
}
private void fire()
{
if(Greenfoot.isKeyDown("space") && (armsCool >= COOLDOWN))
{
getWorld().addObject(new PlayerBasicBullet(new Vector(12, 5), 251), this.getX(), this.getY());
Battleground.bulletsOnScreen ++;
armsCool = 0;
}
}
}
移动(); method 和 Vector class 是分开的,只是为了更平滑的移动。我也可以提供这些,但是里面不应该有任何干扰控件的东西。
稍加修改的代码版本在我的机器上运行良好。我能想到的有两种可能性:
您的 setImage 调用(我将其注释掉,因为我没有这些图像)可能会引发异常,在这种情况下,将无法访问 fire() 方法。不过,这似乎不太可能,因为即使没有对角线移动也会发生这种情况,并且您会在终端中看到异常。所以,更有可能:
您的键盘可能无法注册那些特定的三键组合。三种测试方法:
一个。尝试this keyboard ghosting demo(单击页面顶部的键盘),看看是否可以注册所有键。
b。从 book examples 加载小行星场景,看看您是否可以在加速和转向时发射子弹。
c。您可以将代码中的 "space" 更改为 "x" 并查看是否适用于该密钥。
否则,我很茫然,除非场景中其他地方的代码导致了问题。
最近一直在用Greenfoot,想做一个简单的top-down/bullet-hell射击游戏。一切都进行得很顺利,直到我尝试了一些动作。使用旧 "arrow keys to move, space to shoot" 很简单,但是当我尝试沿对角线左上或右下移动并同时射击时,问题就出现了。我一次只能做一个。我注意到方向与它们在 else-if 调用中的位置有关,但这让我无处可去。我也试过移动代码,替换 fire() 调用;完全使用 if 检查,但没有任何改变。
import greenfoot.*;
/**
* Write a description of class PlayerShip here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class PlayerShip extends SmoothMover
{
private int stepSize = 4;
private boolean tiltLeft = false;
private boolean tiltRight = false;
private int tiltFrame = 1;
private int flameFrame = 0;
private final int COOLDOWN = 20;
private int armsCool = 0;
public PlayerShip()
{
}
/**
* Act - do whatever the PlayerShip wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
setImage();
if(Greenfoot.isKeyDown("left") && Greenfoot.isKeyDown("right"))
{
tiltFrame = 1;
}
move();
fire();
armsCool ++;
}
public void setImage()
{
if(Greenfoot.isKeyDown("up"))
{
setLocation(getX(), getY() - stepSize - 2);
}
else if(Greenfoot.isKeyDown("down"))
{
setLocation(getX(), getY() + stepSize + 2);
}
if (Greenfoot.isKeyDown("left")) {
setLocation(getX() - stepSize, getY());
tiltLeft = true;
if(tiltFrame == 1)
{
setImage("LeftTilt1.png");
tiltFrame ++;
}
else if(tiltFrame == 2)
{
setImage("LeftTilt2.png");
tiltFrame++;
}
else if(tiltFrame == 3)
{
setImage("LeftTilt3.png");
tiltFrame++;
}
else
{
if(flameFrame == 1)
{
setImage("LeftTilt.png");
flameFrame --;
}
else
{
setImage("LeftTiltAlt.png");
flameFrame ++;
}
}
}
else if (Greenfoot.isKeyDown("right")) {
setLocation(getX() + stepSize,getY());
tiltRight = true;
if(tiltFrame == 1)
{
setImage("RightTilt1.png");
tiltFrame ++;
}
else if(tiltFrame == 2)
{
setImage("RightTilt2.png");
tiltFrame++;
}
else if(tiltFrame == 3)
{
setImage("RightTilt3.png");
tiltFrame++;
}
else
{
if(flameFrame == 1)
{
setImage("RightTilt.png");
flameFrame --;
}
else
{
setImage("RightTiltAlt.png");
flameFrame ++;
}
}
}
else
{
tiltFrame = 1;
tiltLeft = false;
tiltRight = false;
if(flameFrame == 1)
{
setImage("PlayerShip2.png");
flameFrame --;
}
else
{
setImage("PlayerShip.png");
flameFrame ++;
}
}
}
private void fire()
{
if(Greenfoot.isKeyDown("space") && (armsCool >= COOLDOWN))
{
getWorld().addObject(new PlayerBasicBullet(new Vector(12, 5), 251), this.getX(), this.getY());
Battleground.bulletsOnScreen ++;
armsCool = 0;
}
}
}
移动(); method 和 Vector class 是分开的,只是为了更平滑的移动。我也可以提供这些,但是里面不应该有任何干扰控件的东西。
稍加修改的代码版本在我的机器上运行良好。我能想到的有两种可能性:
您的 setImage 调用(我将其注释掉,因为我没有这些图像)可能会引发异常,在这种情况下,将无法访问 fire() 方法。不过,这似乎不太可能,因为即使没有对角线移动也会发生这种情况,并且您会在终端中看到异常。所以,更有可能:
您的键盘可能无法注册那些特定的三键组合。三种测试方法:
一个。尝试this keyboard ghosting demo(单击页面顶部的键盘),看看是否可以注册所有键。
b。从 book examples 加载小行星场景,看看您是否可以在加速和转向时发射子弹。
c。您可以将代码中的 "space" 更改为 "x" 并查看是否适用于该密钥。
否则,我很茫然,除非场景中其他地方的代码导致了问题。