当前位置: 首页 > 知识库问答 >
问题:

Java2D平台重力

须鸿祯
2023-03-14

我目前正在Java制作一个2D平台游戏。我是初学者,所以放轻松。我对游戏中的重力有问题。我在跌倒和跳跃时使用不同的变量。我使用平铺地图。所以让我们言归正传。我的跌倒方法是这样工作的——

if(collisionDown == false) {
    characterY += fall;
    fall ++;
{

落差等于4。如果collisionDown为真,它将重置回4。

我的跳跃方法几乎一样:

if(key.E == true && collisionDown == true) {
   characterY -= jump;
   jump --;
}

跳转等于 16。如果合众坠落为真,它将重置回 16。

现在的问题是:想象角色正在跳跃。它在空中,下降时characterY=下降;假设characterY=250,此时fall等于-15。字符下方的下一个实心分片从Y位置255开始。字符位于250,并且未检测到冲突,因此下一帧将15添加到字符Y,即250 15=265。此时,字符已“进入”位于Y 255位置的实心分片。

我已经“修复”了这个问题,因此角色会重新回到实体图块的顶部(这是可见且恼人的。)这不是完美的解决方案,因为它会在每次进入实体图块时减慢角色1帧的速度(这是因为它检测到左右碰撞,并且角色无法移动)。如果我能这样说的话,这个角色显然会口吃。

我需要一个解决那个问题的办法,但是我想不出任何办法。所以如果你提出建议,我会很高兴。谢谢你。

共有2个答案

徐翔
2023-03-14

我通常处理这个的方法是预先检查运动:

private int moveDown(int fall){
        if (isSolidBlock(characterX, characterY + fall)){
            //Knowing the height of your block, calculate some kind of reduction. If your block height is 40, it's probably something like (characterY + fall)%40
            fall = 4;
            collisionDown = true;
            return maxFallUntilSolidBlockReached();
        }
        fall++;
        return fall;
    }

private boolean isSolidBlock(int x, int y){
        //Implement some kind of check if at (x,y) there's a solid block.
    }

然后,只需进行秋季计算:

if(collisionDown == false) {
            characterY += moveDown(fall);
        }
楚志强
2023-03-14

我可能会使用下面这样的东西。

if(collisionDown == false) {
    characterYnext = characterY + fall;          //Get Next Position
    if(NextMovementCollides()){                  //Basically if next position is too far. 
    characterYnext += difference_between(CharacterY,Ground);     //This should move the character to the ground state.
    fall = 0;                                                   //No longer falling so reset the value.
    }
    else{characterY += fall; fall++;}       //Otherwise continue falling like normal.
}

免责声明:我不是Java程序员,所以我的语法可能有点偏差。

这应该是可行的,只要在有意义的地方插入游戏逻辑即可。

 类似资料:
  • 我的问题是,我需要制作一个不断更新的GUI,因为我得到的值可以从数据库中更改,并且我在图形区域中遇到了一些问题。 我使用Graphics2D中的Drawline和Drawstring打印数据库中的值,这些字符串和线条移动并更改值,所以我需要调用repaint();使用计时器使它们出现在jpanel中,问题是repaint();不是在绘制之前移除背景中的旧绘画,而是当我完全调整所有更新的大小时。 我

  • 主要内容:$ionicPlatform$ionicPlatform $ionicPlatform 用来检测当前的平台,以及诸如在PhoneGap/Cordova中覆盖Android后退按钮。 方法 有硬件的后退按钮的平台,可以用这种方法绑定到它。 参数 类型 详情 callback 当该事件发生时,触发回调函数。 移除后退按钮的监听事件。 参数 类型 详情 callback 最初绑定的监视器函数。 注册硬件后退按钮动作。当点击按钮时,

  • 源码包准备 我们首先要在官网下载 OpenResty 的源码包。官网上会提供很多的版本,各个版本有什么不同也会有说明,我们可以按需选择下载。 笔者选择下载的源码包为 ngx_openresty-1.9.7.1.tar.gz。 相关依赖包的安装 首先你要安装 OpenResty 需要的多个库 请先配置好你的apt源,配置源的过程在这就不阐述了,然后执行以下命令安装OpenResty编译或运行时所需要

  • 从包管理安装 OpenResty 现在提供了 CentOS 上的 官方包。 你只需运行下面的命令: sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo sudo yum install openresty 如果一切顺利,OpenResty 应该已经安装好了。 接下来,我们就可以进

  • 1、下载 Windows 版的 OpenResty 压缩包,这里我下载的是 openresty_for_windows_1.7.10.2001_64bit ,你也可以选择 32bit 的版本。如果你对源码感兴趣,下面是源码地址 https://github.com/LomoX-Offical/nginx-openresty-windows。 2、解压到要安装的目录,这里我选择D盘根目录,你可以根据

  • 多平台支持 Mpx支持在多个小程序平台中进行增强,目前支持的小程序平台包括微信,支付宝,百度,qq和头条,不过自2.0版本后,Mpx支持了以微信增强语法为base的跨平台输出,实现了一套业务源码在多端输出运行的能力,大大提升了多小程序平台业务的开发效率,详情可以查看template增强特性 不同平台上的模板增强指令按照平台的指令风格进行设计,文档和代码示例为了方便统一采用微信小程序下的书写方式。