BallMovable(一)
物体下落运动在游戏中经常运用,本文在Android2.2上开发BallMovable,具体实现如下:
分析:物体下落运动的参数:初始X坐标、初始Y坐标、实时X坐标、实时Y坐标、初始竖直方向的速度、初始水平方向的速度、实时竖直方向的速度、实时水平方向的速度、物体的半径、X方向运动的时间、Y方向运动的时间、可移动物体的图片、物体移动的线程等等。
package wyf.wpf; //声明包语句
import android.graphics.Bitmap; //引入相关类
import android.graphics.Canvas; //引入相关类
//代表可移动物体的Movable类
public class Movable{
int startX=0; //初始X坐标
int startY=0; //初始Y坐标
int x; //实时X坐标
int y; //实时Y坐标
float startVX=0f; //初始竖直方向的速度
float startVY=0f; //初始水平方向的速度
float v_x=0f; //实时水平方向速度
float v_y=0f; //实时竖直方向速度
int r; //可移动物体半径
double timeX; //X方向上的运动时间
double timeY; //Y方向上的运动时间
Bitmap bitmap=null; //可移动物体图片
BallThread bt=null; //负责小球移动时
boolean bFall=false;//小球是否已经从木板上下落
float impactFactor = 0.25f; //小球撞地后速度的损失系数
//构造器
public Movable(int x,int y,int r,Bitmap bitmap){
this.startX = x; //初始化X坐标
this.x = x; //初始化X坐标
this.startY = y; //初始化Y坐标
this.y = y; //初始化Y坐标
this.r = r; //初始化
this.bitmap = bitmap; //初始化图片
timeX=System.nanoTime(); //获取系统时间初始化
this.v_x = BallView.V_MIN + (int)((BallView.V_MAX-BallView.V_MIN)*Math.random());
bt = new BallThread(this);//创建并启动BallThread
bt.start();
}
//方法:绘制自己到屏幕上
public void drawSelf(Canvas canvas){
canvas.drawBitmap(this.bitmap,x, y, null);
}
}
其中 public static final int V_MAX=35; //小球水平速度的最大值
public static final int V_MIN=15; //小球竖直速度的最大值
this.v_x = BallView.V_MIN + (int)((BallView.V_MAX-BallView.V_MIN)*Math.random());这行代码表明小球将取V_MIN和V_MAX之间的值作为运动的速度。
Math.random():
Returns a pseudo-random number between 0.0 (inclusive) and 1.0 (exclusive).产生一个0.0-1.0之间的随机数,包括0.0,但是不包括1.0。
timeX=System.nanoTime(); //获取系统时间初始化
public static long nanoTime ()
Returns the current timestamp of the most precise timer available on the local system. This timestamp can only be used to measure an elapsed period by comparing it against another timestamp. It cannot be used as a very exact system time expression.
Returns
the current timestamp in nanoseconds (纳秒 十亿分之一秒)
该类继承自Thread,在程序中每个Movable都将有一个BallThread,主要用于改变小球的运动轨迹。
为零判断:在小球上升和碰撞地面后都需要判断小球的速度是否为零,但是不同于真是情况,在程序中小球的各个物理量都是离散的,这种情况还是以为零判断小球的速度就会出错,比如:前一次计算小球的速度为正,后一次计算小球的速度为负,跳过了为零这个点,那么小球的速度永远不能为零。本程序使用阀值,当速度小于某一阀值时,就认为是为零。
package wyf.wpf; //声明包语句
//继承自Thread的线程类,负责修改球的位置坐标
public class BallThread extends Thread{
Movable father; //Movable对象引用
boolean flag = false; //线程执行标志位
int sleepSpan = 30; //休眠时间
float g = 200; //球下落的加速度
double current; //记录当前时间
//构造器:初始化Movable对象引用及线程执行标志位
public BallThread(Movable father){
this.father = father;
this.flag = true; //设置线程执行的标志位为true
}
//方法:负责根据物理公式修改小球位置
public void run(){
while(flag){
current = System.nanoTime();//获取当前时间,单位为纳秒
double timeSpanX = (double)((current-father.timeX)/1000/1000/1000);//获取从玩家开始到现在水平方向走过的时间
//处理水平方向上的运动
father.x = (int)(father.startX + father.v_x * timeSpanX);
//处理竖直方向上的运动
if(father.bFall){//判断球是否已经移出挡板
double timeSpanY = (double)((current - father.timeY)/1000/1000/1000);
father.y = (int)(father.startY + father.startVY * timeSpanY + timeSpanY*timeSpanY*g/2);
father.v_y = (float)(father.startVY + g*timeSpanY);
//判断小球是否到达最高点
if(father.startVY < 0 && Math.abs(father.v_y) <= BallView.UP_ZERO){
father.timeY = System.nanoTime(); //设置新的运动阶段竖直方向上的开始时间
father.v_y = 0; //设置新的运动阶段竖直方向上的实时速度
father.startVY = 0; //设置新的运动阶段竖直方向上的初始速度
father.startY = father.y; //设置新的运动阶段竖直方向上的初始位置
}
//判断小球是否撞地
if(father.y + father.r*2 >= BallView.GROUND_LING && father.v_y >0){//判断撞地条件
//改变水平方向的速度
father.v_x = father.v_x * (1-father.impactFactor); //衰减水平方向上的速度
//改变竖直方向的速度
father.v_y = 0 - father.v_y * (1-father.impactFactor); //衰减竖直方向上的速度并改变方向
if(Math.abs(father.v_y) < BallView.DOWN_ZERO){ //判断撞地后的速度,太小就停止
this.flag = false;
}
else{ //撞地后的速度还可以弹起继续下一阶段的运动
//撞地之后水平方向的变化
father.startX = father.x; //设置新的运动阶段的水平方向的起始位置
father.timeX = System.nanoTime(); //设置新的运动阶段的水平方向的开始时间
//撞地之后竖直方向的变化
father.startY = father.y; //设置新的运动阶段竖直方向上的起始位置
father.timeY = System.nanoTime(); //设置新的运动阶段竖直方向开始运动的时间
father.startVY = father.v_y; //设置新的运动阶段竖直方向上的初速度
}
}
}
else if(father.x + father.r/2 >= BallView.WOOD_EDGE){//判断球是否移出了挡板
father.timeY = System.nanoTime(); //记录球竖直方向上的开始运动时间
father.bFall = true; //设置表示是否开始下落标志位
}
try{
Thread.sleep(sleepSpan); //休眠一段时间
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
double timeSpanX = (double)((current-father.timeX)/1000/1000/1000);//获取从玩家开始到现在水平方向走过的时间,
这句代码可把水平方向的时间(纳秒)转换为(秒)。
father.x = (int)(father.startX + father.v_x * timeSpanX);其中
father.v_x=BallView.V_MIN + (int)((BallView.V_MAX-BallView.V_MIN)*Math.random()); 这句代码计算水平运动的位置。
father.y = (int)(father.startY + father.startVY * timeSpanY + timeSpanY*timeSpanY*g/2); //(S=v0*t + 1/2*a*t^2 位移计算公式)
father.v_y = (float)(father.startVY + g*timeSpanY);(vt=v0+a*t)速度计算公式。
分享到:
相关推荐
基于springboot教育资源共享平台源码数据库文档.zip
linux开发篇,配套视频:https://www.bilibili.com/list/474327672?sid=4493702&spm_id_from=333.999.0.0&desc=1
ReadEra 这个阅读应用能够打开下列任何格式的文档: EPUB, PDF, DOC, RTF, TXT, DJVU, FB2, MOBI, 和 CHM. 基本上来说,你可以用它阅读你的设备内存中的任何书籍或者文本文档。 这个应用与划分成章节的文档兼。,有一个书签功能,可以在你阅读的时候,自动保存你的进度。另外,它让你更改页面模式,从几种不同的主题中进行挑选(夜间,白天,棕黑色调,还有控制台)。
软件环境:KEIL4 硬件环境:STM32单片机+舵机 控制原理:通过控制输出信号的占空比调节舵机旋转的角度
基于springboot仓库管理系统源码数据库文档.zip
酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 酒店管理系统源码C++实现的毕业设计项目源码.zip,酒店管理系统源码C++实现的毕业设计项目源码.zip个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕
58商铺全新UI试客试用平台网站源码
springboot vue3前后端分离 基于SpringBoot+Vue的轻量级定时任务管理系统.zip
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
4D毫米波雷达点云数据处理方法研究.caj
S M 2 2 5 8 X T 量产工具供大家下载使用
基于springboot的文物管理系统源码数据库文档.zip
基于springboot的电影院售票管理系统源码数据库文档.zip
基于Java web 实现的仓库管理系统源码,适用于初学者了解Java web的开发过程以及仓库管理系统的实现。
美容美发项目,使用django框架,前后端一体化项目
在线票务:2023年中国在线票务行业市场规模约为24.99亿元,挖掘市场蓝海新机遇 在数字浪潮的席卷下,传统的票务销售模式正经历着前所未有的变革。纸质门票逐渐淡出人们的视野,取而代之的是便捷、高效的数字和移动票务。这一转变不仅为消费者带来了前所未有的购票体验,更为在线票务平台开辟了广阔的发展空间和市场机遇。随着国民经济的持续增长和文体娱乐行业的蓬勃发展,中国在线票务行业正站在时代的风口浪尖,等待着每一位有志之士的加入。那么,这片蓝海市场究竟蕴藏着怎样的潜力?又该如何把握机遇,实现突破?让我们一同探索。 市场概况: 近年来,中国在线票务行业市场规模持续扩大,展现出强劲的增长势头。据QYResearch数据显示,2023年中国在线票务行业市场规模约为24.99亿元,尽管受到宏观经济的影响,市场规模增速放缓,但整体趋势依然向好。这一增长主要得益于国民人均收入的不断提高、电影及演出行业的快速发展以及政府政策的支持。例如,2023年财政部、国家电影局发布的《关于阶段性免征国家电影事业发展专项资金政策的公告》,为电影行业注入了强劲动力,进而推动了在线票务市场规模的扩大。 技术创新与趋势: 技术进步
基于SpringBoot的养老院管理系统源码数据库文档.zip
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
内容概要:本文档是一份详细的Go语言教程,从基础概念介绍到高级主题均有覆盖。主要内容包括Go语言的基础语法、数据类型、控制结构、函数、结构体、接口和并发编程等方面。通过具体示例介绍了如何使用Go语言进行开发。 适合人群:初学者和有一定经验的程序员都可以从这篇教程中受益,特别是那些想要快速掌握Go语言并应用于实际项目的开发者。 使用场景及目标:适用于初学者系统学习Go语言的基础知识和常用功能;也可以作为已有开发经验者的参考资料,帮助他们解决具体的编程问题,提高开发效率。 其他说明:本教程不仅包含了Go语言的基本知识点,还重点讲解了其独特的并发编程模型。读者在学习过程中应该注重理论与实践相结合,通过实际编写代码来加深理解和记忆。
基于springboot计算机基础网上考试系统源码数据库文档.zip