Java 如何在Overlapp2d和libgdx中检测播放器与地面的碰撞

Java 如何在Overlapp2d和libgdx中检测播放器与地面的碰撞,java,libgdx,collision-detection,overlap2d,Java,Libgdx,Collision Detection,Overlap2d,我正在关注Youtube上的一个视频教程,名为“使用Overlapp2D和libGDX制作简单的侧滚器-tutorial-003”。 我在视频中看到他使用光线投射来检测碰撞。但是当我试着跟随时,播放器从地上掉下来,而在视频中播放器可以停在地上。 这是要下载的链接,供您检查。 下面是Player.java的代码 package com.test.superninja; import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.

我正在关注Youtube上的一个视频教程,名为“使用Overlapp2D和libGDX制作简单的侧滚器-tutorial-003”。 我在视频中看到他使用光线投射来检测碰撞。但是当我试着跟随时,播放器从地上掉下来,而在视频中播放器可以停在地上。 这是要下载的链接,供您检查。 下面是Player.java的代码

package com.test.superninja;

import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.uwsoft.editor.renderer.scripts.IScript;
import com.uwsoft.editor.renderer.components.TransformComponent;
import com.uwsoft.editor.renderer.components.DimensionsComponent;
import com.uwsoft.editor.renderer.utils.ComponentRetriever;
import com.uwsoft.editor.renderer.physics.PhysicsBodyLoader;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.RayCastCallback;
import com.badlogic.gdx.physics.box2d.World;

public class Player implements IScript {

  private Entity player;
  private TransformComponent transformComponent;
  private DimensionsComponent dimensionsComponent;
  private Vector2 speed;
  private float gravity = -500f;
  private float jumpSpeed = 170f;
  private World world;

  public Player(World world) {
    this.world = world;
  }

  @Override
  public void init(Entity entity) {
    player = entity;
    transformComponent = ComponentRetriever.get(entity, TransformComponent.class);
    dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class);
    speed = new Vector2(50, 0);
  }
  @Override
  public void act(float delta) {
    //transformComponent.scaleY = 0.5;
    if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
      transformComponent.x -= speed.x * delta;
      transformComponent.scaleX = -1f;
    }
    if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
      transformComponent.x += speed.x * delta;
      transformComponent.scaleX = 1f;
    }
    if (Gdx.input.isKeyJustPressed(Input.Keys.SPACE)) {
      speed.y = jumpSpeed;
    }
    speed.y += gravity * delta;
    transformComponent.y += speed.y * delta;
    /*
    if (transformComponent.y < 16f){
      speed.y = 0;
      transformComponent.y = 16f;
    }
    */
  }
  private void rayCast() {
    float rayGap = dimensionsComponent.height / 2;

    // Ray size is the exact size of the deltaY change we plan for this frame
    float raySize = -(speed.y) * Gdx.graphics.getDeltaTime();

    //if(raySize < 5f) raySize = 5f;

    // only check for collisions when moving down
    if (speed.y > 0) return;

    // Vectors of ray from middle middle
    Vector2 rayFrom = new Vector2((transformComponent.x + dimensionsComponent.width / 2) * PhysicsBodyLoader.getScale(), (transformComponent.y + rayGap) * PhysicsBodyLoader.getScale());
    Vector2 rayTo = new Vector2((transformComponent.x + dimensionsComponent.width / 2) * PhysicsBodyLoader.getScale(), (transformComponent.y - raySize) * PhysicsBodyLoader.getScale());
    // Cast the ray
    world.rayCast(new RayCastCallback() {
      @Override
      public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 normal, float fraction) {
        // Stop the player
        speed.y = 0;

        // reposition player slightly upper the collision point
        transformComponent.y  = point.y / PhysicsBodyLoader.getScale() + 0.1f;

        return 0;
      }
    }, rayFrom, rayTo);
  }
  public float getX() {
    return transformComponent.x;
  }
  public float getY() {
    return transformComponent.y;
  }
  public float getWidth() {
    return dimensionsComponent.width;
  }
  @Override
  public void dispose() {

  }
}
这里是UIStage.java

package com.uwsoft.platformer;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.uwsoft.editor.renderer.data.CompositeItemVO;
import com.uwsoft.editor.renderer.data.ProjectInfoVO;
import com.uwsoft.editor.renderer.resources.IResourceRetriever;
import com.uwsoft.editor.renderer.scene2d.CompositeActor;

/**
 * Created by azakhary on 8/5/2015.
 */
public class UIStage extends Stage {

    public UIStage(IResourceRetriever ir) {

        Gdx.input.setInputProcessor(this);

        ProjectInfoVO projectInfo = ir.getProjectVO();

        CompositeItemVO menuButtonData = projectInfo.libraryItems.get("menuButton");
        CompositeActor buttonActor = new CompositeActor(menuButtonData, ir);

        addActor(buttonActor);

        buttonActor.setX(getWidth() - buttonActor.getWidth());
        buttonActor.setY(getHeight() - buttonActor.getHeight());

        buttonActor.addListener(new ClickListener() {
            @Override
            public void clicked (InputEvent event, float x, float y) {
                System.out.println("Hi");
            }
        });
    }
}

在Xeon的帮助下,我解决了我的问题。我只是忘了调用rayCast()函数。 我这样调用raycast()函数:

  @Override
  public void act(float delta) {
    ...
    rayCast();
  }

它是有效的。非常感谢Xeon。

您在哪里调用了rayCast函数?我不知道。我总共有3个java文件。我将发布所有有问题的文件。当您按下该键时,请尝试调用您的rayCast函数。我不理解您的建议。请告诉我更多。
如果(Gdx.input.isKeyPressed(input.Keys.LEFT)){rayCast();transformComponent.x-=speed.x*delta;transformComponent.scaleX=-1f;}
技术上你自己解决了它,仍然欢迎你。
  @Override
  public void act(float delta) {
    ...
    rayCast();
  }