【问题标题】:Easiest way to do collision LWJGL JAVA最简单的碰撞方式 LWJGL JAVA
【发布时间】:2013-06-14 18:02:22
【问题描述】:

好的,所以我有一个 ArrayList,其中包含需要绘制到屏幕上的所有图块,并且我有用箭头键移动的播放器,但我不确定如何用它实现碰撞检测,会不会有效地检查当前图块是否已填满,如果是则停止,这是我第一次从头开始创建游戏,非常感谢任何帮助!

编辑: 这些图块是 32x32 图像,基本上保存在 ArrayList 中,如果你们可以帮助我解决 y 轴碰撞问题,我应该对其余部分没问题。 Tile 类包含 x、y 和 tile 类型

EDIT2:我还没有尝试过任何东西,我真的不知道从哪里开始,但基本上我需要在瓷砖上进行某种碰撞,例如当玩家移动时,如果在瓷砖上发生碰撞做某事但我不知道如何检查是否我有没有相撞

【问题讨论】:

  • 您能详细说明一下这个问题吗?你面板上的 ArrayList 是什么?瓷砖到底是什么?你能在你的问题中添加一些代码吗?
  • 嗨,欢迎来到 StackOverflow。您尝试了什么,出了什么问题?
  • 你想知道玩家(在 x,y 位置)是否碰撞到一个 tile(大小为 32*32)。您需要知道的第一件事是瓦片的位置在哪里,它由瓦片类中的 X 和 Y 表示。然后你可以将 32 添加到 X 和 Y 值,以获得图像的右下角
  • 好吧,这就是我刚刚尝试过的,但无济于事,它的作用是在你移动之前进行检查,如果它通过了你可以移动,但它总是通过:/ pastebin.com/BKS72b6y
  • 您的 t.id 始终等于 Title.TITLE_NORMAL。并且您的 return 语句正在测试事物,它实际上并没有返回任何东西。

标签: java 2d lwjgl collision


【解决方案1】:

下面我有一个弹跳球的例子,它将测试JPanel的结束,并做一些事情

  //x = X-Axis Location //This tests for a collision of the JPanel on the left side or the right side
public boolean isLeavingSideToSide(JPanel jp)
{
    if( x <=0 || x+ width >= jp.getWidth())
    {
        BounceEvent be = new BounceEvent(this);
        notifyListeners(be);            
        return true;
    }
    else
        return false;
}

创建 BounceEvent 是为了允许 notifyListener 调用被退回的方法。

public void notifyListeners(BounceEvent be)
{
    for(BounceListener bl : listeners)
    {
        bl.bounced(be);
    }
}

我的 Bounced 方法改变了球的颜色(做一些动作)

public void bounced(BounceEvent be) {
    Ball b = be.getBall();
    Color c = b.getColor();
    int x = 256;
    int newColor1 = (int) (Math.random() * x);
    int newColor2 = (int) (Math.random() * x);
    int newColor3 = (int) (Math.random() * x);
    b.setColor(new Color(newColor1,newColor2,newColor3));
}

希望这将帮助您入门。

【讨论】:

  • 谢谢,但这只能帮助我测试玩家是否离开屏幕:/我想测试一下玩家是否与瓷砖碰撞
  • 这为您提供了一个开始测试的地方,如果您可以为您的屏幕实现此功能,那么您应该了解碰撞的工作原理,然后您将能够提出更具体的问题。请记住,您的问题越笼统,人们就越不可能提供帮助。
【解决方案2】:

碰撞检测对于初学者来说并不重要,也不能在 Stackoverflow 帖子中完整解释;如果你还在纠结于数组,试着制作简单的游戏,通过计算像 circles 这样的对象之间的距离来检测碰撞。

处理碰撞检测的方法有很多,但您必须更具体:
您打算开发哪种基于图块的游戏?

我强烈建议您阅读 Katy Coe 的 this article,它提供了一些实现的摘要。上述博客中解释了以下方法。

最简单、最直观的方法是像素颜色方法,玩家可以在具有特定颜色值的图块上移动,但只能与有限的调色板一起使用。 蒙版方法本质上与 PCA 相同,但它在自定义图形后面隐藏了黑白层;后者计算量大,一般不推荐。

基于网格的方法可能是您正在寻找的。地图的每个元素对应于网格的一个图块(由 2D 数组描述)。玩家在离散空间中移动,尽管动画可能会假装流畅的移动。

像素平铺法通过用 n 个控制点围绕字符来描述碰撞;这种方法让开发人员可以在平铺的世界中使用非平方字符。 Bounding Box Method 是 PTM 的一种更简单的实现,其中玩家被包裹在一个矩形中。程序检查矩形的四个角中的任何一个是否与任何墙相交。

Discrete Collision Detection,或其改进版本,Speculative Contacts,用于更复杂的游戏,您现在肯定不需要这些。

不要试图一次全部学习,从你能想到的最简单的实现开始。 否则,您很快就会气馁,不会欣赏每种技术的优缺点。

我最近发现了this great tutorial 关于使用 Macromedia Flash 的基于图块的游戏,但您可以使用您选择的语言轻松应用这些技术。 阅读! 如果你想替代 Katy 的文章,Rodrigo Monteiro comes in help

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多