小女求教:编写java弹跳小球程序时候遇到问题

codegirl2016 2016-10-11 12:37:22
这是我看网上视频教程时候跟着学的程序,是一个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);
}
}
}

谢谢了
...全文
377 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗泥丸的平方 2016-10-11
  • 打赏
  • 举报
回复
引用 6 楼 cownew 的回复:
谢谢,我再研究一下你的代码 我的gif是使用“gif录像机”做的
我的代码只是方便把数据导出来进行分析而已. 用文件流存到了D:\\test1.txt这个文件,然后用excel做了一个图... 代码本身没什么好看的.. 其实就是因为你的"地面"不够""坚固"", 现实中的球遇到地面的时候就开始反弹了,而你的球运动到了地面的下方,才开始获得反向的加速度. 可以试着增加一个反向的速度补偿
			if (y > 300) {
				v = -v;// 如果碰地面,则反弹,反弹就是速度反向
				v = v - 10 * t;// 瞬时速度 v1=v0+at
			}
cownew 2016-10-11
  • 打赏
  • 举报
回复
引用 5 楼 qq_35209952 的回复:
仔细看了一下,首先精度的问题肯定是有的. 建议练习的时候还是尽量选取整数坐标吧. 反复计算的时候(连续的乘除,尤其是除不尽的情况)会把计算误差放大 当然主要问题是反弹位置的处理上. 我做了一个比较简化的模型
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录像机”做的
逗泥丸的平方 2016-10-11
  • 打赏
  • 举报
回复
仔细看了一下,首先精度的问题肯定是有的. 建议练习的时候还是尽量选取整数坐标吧. 反复计算的时候(连续的乘除,尤其是除不尽的情况)会把计算误差放大 当然主要问题是反弹位置的处理上. 我做了一个比较简化的模型
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多一点,这样反方向的加速度就少了一个. 也算是离散产生的误差吧
codegirl2016 2016-10-11
  • 打赏
  • 举报
回复
引用 3 楼 codegirl2016 的回复:
谢谢大哥回复 是的,是这个课程中提供的一个游戏开发引擎,我把整个项目文件打包上来了 http://download.csdn.net/detail/codegirl2016/9650692 谢谢帮忙
咋连接点不了,我再一遍代码下载地址 http://download.csdn.net/detail/codegirl2016/9650692
codegirl2016 2016-10-11
  • 打赏
  • 举报
回复
谢谢大哥回复 是的,是这个课程中提供的一个游戏开发引擎,我把整个项目文件打包上来了 http://download.csdn.net/detail/codegirl2016/9650692 谢谢帮忙
逗泥丸的平方 2016-10-11
  • 打赏
  • 举报
回复
引用 1 楼 qq_35209952 的回复:
com.rupeng.game.GameCore 这个应该是你自己(或者是课程)的包吧.. 可能还有一些其他的素材 不太清楚里面是什么样的东西.. 问题应该出在double的精度丢失上.. 但是应该很久才会发现吧.. 呃.顺便问一下,你的图片是怎么做的,是GIF ?
不对 应该不是精度丢失 也有可能是边界的问题, 我仔细看一下
逗泥丸的平方 2016-10-11
  • 打赏
  • 举报
回复
com.rupeng.game.GameCore 这个应该是你自己(或者是课程)的包吧.. 可能还有一些其他的素材 不太清楚里面是什么样的东西.. 问题应该出在double的精度丢失上.. 但是应该很久才会发现吧.. 呃.顺便问一下,你的图片是怎么做的,是GIF ?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧