这是我看网上视频教程时候跟着学的程序,是一个java写的弹跳小球程序,弹跳都很正常,不过运行一段时间之后小球越跳越低,怎么回事呀?我也没处理摩擦力呀。代码如下:
package com.rupeng.test;import com.rupeng.game.GameCore;public class BouncingBall implements Runnable
{
public static void main(String[] args)
{
GameCore.start(new BouncingBall());
} @Override
public void run()
{
int ball = 0;
GameCore.createSprite(ball, "ball1");
GameCore.playSpriteAnimate(ball, "rotate", true);
GameCore.setSpritePosition(ball, 100, 0); double v = 0;// 初始速度
double y = 0;// 初始总坐标
double t = 0.1;// 单位时间
for (;;)
{
v = v + 9.8 * t;// 瞬时速度 v1=v0+at
y = y + v * t;// v*t就是单位时间的位移。y就是单位之间后纵坐标
if (y > 300)
{
v = -v;// 如果碰地面,则反弹,反弹就是速度反向
}
GameCore.setSpritePosition(ball, 100, (int) y);
GameCore.pause(20);
}
}
}谢谢了

解决方案 »

  1.   

    com.rupeng.game.GameCore  这个应该是你自己(或者是课程)的包吧.. 可能还有一些其他的素材 不太清楚里面是什么样的东西..问题应该出在double的精度丢失上.. 但是应该很久才会发现吧..  呃.顺便问一下,你的图片是怎么做的,是GIF ?
      

  2.   

    谢谢大哥回复
    是的,是这个课程中提供的一个游戏开发引擎,我把整个项目文件打包上来了
    http://download.csdn.net/detail/codegirl2016/9650692
    谢谢帮忙
      

  3.   

    咋连接点不了,我再一遍代码下载地址 http://download.csdn.net/detail/codegirl2016/9650692
      

  4.   

    仔细看了一下,首先精度的问题肯定是有的. 建议练习的时候还是尽量选取整数坐标吧. 反复计算的时候(连续的乘除,尤其是除不尽的情况)会把计算误差放大当然主要问题是反弹位置的处理上. 我做了一个比较简化的模型
    package test;import java.io.*;public class BouncingBall implements Runnable {
    public static void main(String[] args) {
    Thread t = new Thread(new BouncingBall());
    t.start();
    } @Override
    public void run() {
    int ball = 0; int v = 0;// 初始速度
            int y = 0;// 初始总坐标
            int t = 1;// 单位时间
            File f = new File("D:\\test1.txt");
            OutputStream is=null;
            try {
                 is = new FileOutputStream(f);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return;
            }
            for (int i = 0;i<1000;i++) {
    v = v + 10 * t;// 瞬时速度 v1=v0+at
    y = y + v * t;// v*t就是单位时间的位移。y就是单位之间后纵坐标
    if (y > 300) {
    v = -v;// 如果碰地面,则反弹,反弹就是速度反向
    }
                try {
                    is.write("y,".getBytes());
                    is.write(Double.toString(y).getBytes());
                    is.write("\n".getBytes());
                    is.write("v,".getBytes());
                    is.write(Double.toString(v).getBytes());
                    is.write("\n".getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
    }然后稍微处理了一下数据, 这是速度曲线,这样就很明显了吧
    因为接触地面的时候并不是"恰好"300,而是300多一点,这样反方向的加速度就少了一个.   也算是离散产生的误差吧
      

  5.   

    谢谢,我再研究一下你的代码
    我的gif是使用“gif录像机”做的
      

  6.   


    我的代码只是方便把数据导出来进行分析而已. 用文件流存到了D:\\test1.txt这个文件,然后用excel做了一个图...  代码本身没什么好看的..
    其实就是因为你的"地面"不够""坚固"", 现实中的球遇到地面的时候就开始反弹了,而你的球运动到了地面的下方,才开始获得反向的加速度.
    可以试着增加一个反向的速度补偿 if (y > 300) {
    v = -v;// 如果碰地面,则反弹,反弹就是速度反向
    v = v - 10 * t;// 瞬时速度 v1=v0+at
    }