我正在努力学习如何制作没有游戏引擎的2D游戏,无论如何我已经创建了一个背景滚动,现在我的目标是让我的角色跳跃。但问题是每当我启动我的应用程序时,角色会上下旋转,它就会消失在后台。
这是我的角色代码
public class Deer extends GameCharacter {
private Bitmap spritesheet;
private double dya;
private boolean playing;
private long startTime;
private boolean Jump;
private Animate Animation = new Animate();
public Deer(Bitmap res, int w, int h, int numFrames) {
x = 20;
y = 400;
dy = 0;
height = h;
width = w;
Bitmap[] image = new Bitmap[numFrames];
spritesheet = res;
for (int i = 0; i < image.length; i++)
{
image[i] = Bitmap.createBitmap(spritesheet, i*width, 0, width, height);
}
Animation.setFrames(image);
Animation.setDelay(10);
startTime = System.nanoTime();
}
public void setJump(boolean b){
Jump = b;
}
public void update()
{
long elapsed = (System.nanoTime()-startTime)/1000000;
if(elapsed>100)
{
}
Animation.update();
if(Jump){
dy = (int)(dya+=5.5);
}
else{
dy = (int)(dya+=5.5);
}
if(dy>14)dy = 14;
if(dy>14)dy = -14;
y += dy*2;
dy = 0;
}
public void draw(Canvas canvas)
{
canvas.drawBitmap(Animation.getImage(),x,y,null);
}
public boolean getPlaying(){return playing;}
public void setPlaying(boolean b){playing = b;}
public void resetDYA(){dya = 0;}
}
x - 角色的水平位置 y - 角色的垂直位置 dx - 角色的水平加速度 dy - 角色的垂直加速度
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN) {
if(!deer.getPlaying()) {
deer.setPlaying(true);
}
deer.setJump(true);
return true;
}
return super.onTouchEvent(event);
}
答案 0 :(得分:0)
我无法确定这是否是唯一的问题,因为您有其他可疑代码,但看起来无论如何都会跳转。
if(Jump){
dy = (int)(dya+=5.5);
} else {
dy = (int)(dya+=5.5);
}
如果Jump
为true
,则设置垂直加速度。但如果Jump
为false
,您还可以将垂直加速度设置为相同的值。您也不会在代码中显示Jump
设置为false
的内容。
另一个奇怪的代码是:
if(dy>14)dy = 14;
if(dy>14)dy = -14;
此处,如果您将dy>14
设置为14.然后立即检查dy>14
。当然,这次是false
。但是因为这两个条件是相同的,所以第二个条件永远不会通过,因为前一个条件确保它不会被激活。唯一的另一种选择是他们都失败了。我,你永远无法进入第二个if
。
<小时/> 除此之外, 我不确定您为什么采用这种方法。您可以简单地依靠具有恒定加速度的物理方程,给出初始速度,检查与地面的碰撞(或至少是原始高度),然后让它运行。例如:
// These are the variables you need.
int x = 200, y0 = 0, y = 0, velocity = 15;
double t = 0.0, gravity = -9.8;
// This is the statement that should run when you update the GUI.
// It is the fundamental equation for motion with constant acceleration.
// The acceleration is the gravitational constant.
y = (int) (y0 + velocity * t + .5 * gravity * t * t);
if (y < 0) {
y = y0 = 0;
//Stop jumping!
Jump = false;
} else {
// Swap the y values.
y0 = y;
// Increase the time with the frame rate.
t += frameRate;
}
// Draw the character using the y value
关于这一点最好的部分是你不必担心何时达到最大高度,因为等式会自动降低你。它看起来更自然,好像机械是真实的。尝试一下。
你可以玩的一个简单的Swing示例 。请注意,值不同,以处理组件绘制到屏幕的方式。通常情况下,您可以通过转换处理它,但这样做可以完成任务。
public class Main {
static Timer timer;
Main() {
JFrame frame = new JFrame("Hello sample");
frame.setSize(new Dimension(550, 550));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel = new MyPanel();
frame.add(panel);
frame.setVisible(true);
timer = new Timer(5, (e) -> panel.repaint());
timer.start();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(Main::new);
}
class MyPanel extends JPanel {
int x = 200, y0 = 300, y = 0, w = 200, h = 200, v = -8;
double t = 0.0, gravity = 9.8;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
y = (int) (y0 + v * t + .5 * gravity * t * t);
if (y > 300) {
y = y0 = 300;
// To prevent it from stopping comment the timer.stop() and
// uncomment the t = 0.0 statements.
//t = 0.0;
timer.stop();
} else {
y0 = y;
t += .025;
}
g.drawOval(x, y, w, h);
}
}
}