这是我看网上视频教程时候跟着学的程序,是一个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);
}
}
}谢谢了
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);
}
}
}谢谢了
是的,是这个课程中提供的一个游戏开发引擎,我把整个项目文件打包上来了
http://download.csdn.net/detail/codegirl2016/9650692
谢谢帮忙
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多一点,这样反方向的加速度就少了一个. 也算是离散产生的误差吧
我的gif是使用“gif录像机”做的
我的代码只是方便把数据导出来进行分析而已. 用文件流存到了D:\\test1.txt这个文件,然后用excel做了一个图... 代码本身没什么好看的..
其实就是因为你的"地面"不够""坚固"", 现实中的球遇到地面的时候就开始反弹了,而你的球运动到了地面的下方,才开始获得反向的加速度.
可以试着增加一个反向的速度补偿 if (y > 300) {
v = -v;// 如果碰地面,则反弹,反弹就是速度反向
v = v - 10 * t;// 瞬时速度 v1=v0+at
}