年末开了Java实训大作业

想了好几天决定选择马里奥小游戏

发现即使做出来但是跳跃功能是很“笨拙”的,和我们玩的游戏不一样,没有跳跃速度的快慢什么的,后来才知道这个叫做游戏里面重力的模拟。

组队做系统当然也有一分收获,但我觉得要做就做一个能让自己收获更大的,所以做游戏23333

发现重力模拟和碰撞检测都有很深的学问和算法在里面

那么先研究一下重力模拟

我要先采集一下大概的信息哈

//****自定义绘图函数*********************************
// 1.窗口贴图
// 2.计算小球速度,坐标以及判断是否碰到窗口下缘
void MyPaint(HDC hdc)
{
SelectObject(bufdc,bg);
BitBlt(mdc,,,,,bufdc,,,SRCCOPY); SelectObject(bufdc,angrybird);
BitBlt(mdc,x,y,,,bufdc,,,SRCAND);
BitBlt(mdc,x,y,,,bufdc,,,SRCPAINT); BitBlt(hdc,,,,,mdc,,,SRCCOPY); x += vx; //计算X轴方向贴图坐标,每调用一次MyPiant(),x坐标就加上一个恒定不变的vx,相当于匀速运动 vy = vy + gy/; //计算Y轴方向速度分量,vy随着每一次MyPiant()函数的调用就加上一个gy(重力加速度),因为50毫秒刷新一次
y += vy; //计算Y轴方向贴图坐标,每调用一次MyPiant(),y坐标就加上一个刚改变过后的vy,相当于加速运动 //判断是否触地,如果触碰到窗口边界,vy调整为相反方向
if(y >= rect.bottom-)
{
y = rect.bottom - ;
vy = -vy;
} tPre = GetTickCount(); //记录上次的绘图时间
}

重力系统涉及到的一些常见问题及解决方案如下:

1.给球体一个释放初速度,如何实现越向下运动且在接触边缘之前,竖直方向上的速度speedY越大的效果?

答案:可以在计时器中,每及时一次,竖直方向上的速度speedY自增一个固定值来实现,例如:speedY += 6;

2.球体接触地面(此例中指浏览器下边缘)后,如何实现速度反向效果?

答案:接触地面后,将方向速度置为当前速度的反方向即可,代码if (iW >= w||iW <= 0){speedX = -speedX;}if中条件表示如果超出运动范围,实现水平方向接触边缘后运动方向相反,代码if (iH >= h||iH <= 0){speedY = -speedY;}则表示Y方向接触边缘后速度变反。

3.球体接触地面反弹后,如何实现再次上升的高度低于上一次高度的效果?

答案:在接触地面后,速度变为负值,计时器开始执行下一个间隔,立即执行了speedY += 6,弹起速度立刻减小了6,其大小相对接触地面前一瞬间小,因此球体不会弹跳到原来的高度。

4.如何实现球体竖直方向上的速度绝对值越来越小直至逼近于0的效果?

答案:事实上,仅利用speedY += 6;此例中竖直方向上速度speedY不可能达到0,因为在该函数设置好了初速度的前提下,某一次落地速度不可能为6(通过后来打印速度每次执行结果可以确定),所以下一次执行不可能为0,那么究竟是怎样实现落到地面静止的效果的呢?实际上,当把speedY增加值设置为6时,当球体某一次落地瞬间它的速度是1,2,3,4,5中的任何一个值是,经加上6后反弹瞬时速度分别为-5,-4,-3,-2,-1,经过一个计时器周期(此例中为30毫秒),速度再加6立刻变为1,2,3,4,5,下一次速度变为-5,-4,-3,-2,-1......,由于speedY += 6在计时器的头处,因此最终结果将总是在加6之前,停留在-5,-4,-3,-2,-1.中的任何一个数值,且计时器始终处于动态,最终球体显示在底部。

5.当球体释放后,也具备有个横向速度speedX,如何使横向速度也逐渐减小值0?

答案:此例中不需要考虑x方向的碰撞,因此每次计时可将speedX乘以一个小于1的数,最终的speedX值将无限趋近于0,显示为静止。

当拖动窗口时如何实现不出现滚动条的效果?

答案:拖动后浏览器窗口后,对球体设置新的运动范围即可。

参考博客:https://blog.csdn.net/weixin_34151004/article/details/87964263

https://blog.csdn.net/weixin_36185028/article/details/53015790

用Java模拟游戏重力的实现(弹跳)的更多相关文章

  1. [转] java开源游戏

    收藏一下   triplea  Triplea是一个开放源码的boardgame.它允许玩家选择各种各样的战略版图游戏(如:轴心国或同盟军).TripleA引擎支持联网对战,支持声音,支持使用XML文 ...

  2. java模拟post请求发送json

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...

  3. java 模拟qq源码

    java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip

  4. java模拟开锁

    java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...

  5. java俄罗斯方块游戏代码

    java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...

  6. Jsoup实现java模拟登陆

    Jsoup实现java模拟登陆 2013-10-29 14:52:05|  分类: web开发|举报|字号 订阅     下载LOFTER我的照片书  |     1:如何获取cookies. 1.1 ...

  7. [Java] 模拟HTTP的Get和Post请求

    在之前,写了篇Java模拟HTTP的Get和Post请求的文章,这篇文章起源与和一个朋友砍飞信诈骗网站的问题,于是动用了Apache的comments-net包,也实现了get和post的http请求 ...

  8. Java模拟登录系统抓取内容【转载】

    没有看考勤的习惯,导致我的一天班白上了,都是钱啊,系统也不发个邮件通知下....     为了避免以后还有类似状况特别写了个java模拟登录抓取考勤内容的方法(部分代码来自网络),希望有人修改后也可以 ...

  9. Java模拟登陆02【转载】

    在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢?     方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时 ...

随机推荐

  1. 全网最全Docker命令详解

    由于最近在学习Docker,在这里把有关Docker的命令做一个集合,方便后面查看: # docker --help Usage: docker [OPTIONS] COMMAND [arg...] ...

  2. 「雕爷学编程」Arduino动手做(25)——MQ2气敏检测模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  3. node响应头缓存设置

    我把react项目分成4个板块,在路由的顶层 今天在手机上打开react项目的时候,发现平级路由跳转时某一个图片较多的板块图片总是渲染得很慢,这分明是重新发起请求了. 然后我先查一下react-rou ...

  4. 快速配置Samba服务

    1.安装samba 这里以CenOS 7为例,其他系统类似 yum install samba samba-client samba-common   2.修改smb.conf 最好先备份原文件,以防 ...

  5. mysql小白系列_03 体系结构-线程池

    thread pool的原理是什么? 为什么用double write就能解决page坏的问题? Innodb redo log 与 binlog有什么区别?有了Innodb redo log为什么还 ...

  6. 每次找Internet选项感到抓狂?一键打开!

    WIN+R运行,输入inetcpl.cpl,就可以打开了!

  7. Spring JSR-250 注释

    Spring还使用基于 JSR-250 注释,它包括 @PostConstruct 注释 @PreDestroy 注释 @Resource 注释 @PostConstruct 和 @PreDestro ...

  8. Spring Boot 教程 (4) - swagger-ui

    Spring Boot 教程 - swagger-ui 1. 什么是Swagger? Swagger™的目标是为REST APIs 定义一个标准的,与语言无关的接口,使人和计算机在看不到源码或者看不到 ...

  9. NPM的由来——为什么要使用NPM

    原文:https://blog.csdn.net/qq_37696120/article/details/80507178 https://blog.csdn.net/hong10086/articl ...

  10. spring的各种注入

    java package cn.ioc.student; import java.util.List; import java.util.Map; import java.util.Set; publ ...