0

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

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

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

4

2 回答 2

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));
}

希望这将帮助您入门。

于 2013-06-14T18:27:30.733 回答
1

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

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

我强烈建议您阅读Katy Coe 撰写的这篇文章,其中总结了一些实现。上述博客中解释了以下方法。

最简单和最直观的方法是像素颜色方法,玩家可以在具有特定颜色值的图块上移动,但它只能用于有限的调色板。Mask 方法本质上与 PCA 相同,但它在自定义图形后面隐藏了黑白层;后者的计算成本很高,通常不推荐。

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

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

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

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

我最近发现了这个关于使用 Macromedia Flash 的基于图块的游戏的很棒的教程,但是您可以使用您选择的语言轻松应用这些技术。阅读! 如果您想要替代 Katy 的文章,Rodrigo Monteiro 可以提供帮助

于 2013-06-14T19:22:18.517 回答