栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Slick2D矩形碰撞检测

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Slick2D矩形碰撞检测

您不会自己更新点击框位置。

您正在绘制此:

g.drawRect(playX, playY, playW, playH); //draws player boundsg.drawRect(enemyX, enemyY, enemyW, enemyH); //draws enemy bounds

但这不是实际的Hitbox,只是播放器/敌人的位置,此处绘制的矩形将位于正确的位置,而Hitboxs本身不在。

我建议您执行以下操作:

public void update(GameContainer container, int delta){    playerUpdate(delta);    player.rect.setLocation(playX, playY);    enemy.rect.setLocation(enemyX, enemyY); // update the hitboxes to the new positions    if (player.rect.intersects(enemy.rect))    {        System.out.println("INTERSECT!");    }}public void playerUpdate(int delta){    if (playerForward == true)    {       playX -= delta * 0.4f;       if (playX <= 140)        {  playX = 140;  playerForward = false;  playerBackward = true;       }    }    if (playerBackward == true)     {         playX += delta * 0.4f;         if (playX >= 700)          {  playX = 700;  playerBackward = false;  delay = 1250;         }    }}public void keyReleased(int key, char c) {   if (key == Input.KEY_ENTER)   {      playerForward = true;   }}

此外,由于您似乎不熟悉Java游戏开发,因此为您提供了一些技巧:

  • 正确格式化代码

始终将{…}放在是否,否则,切换,切换等之后;适当的行缩进。

  • Think OO(面向对象)

这一点很重要。您的敌人和玩家类都应该扩展某种实体类,因为他们都非常想获得相似的行为(避免代码重复!)。总结与超类相似的行为,简化行为并通过一些可调参数进行控制等等。

例如,您将敌人和玩家的位置存储为主类中的静态整数。这不是OO。将职位移动到实体类,您可以在其中以所需的任何方式实现它。

  • 不要无缘无故抛出异常

即使从不需要,您的update(…)方法也会引发SlickException。

  • 注意封装

这是许多初学者要做的事情:只需获取一些参数,将它们作为私有类(甚至是公开类)放入类中,并为其生成getter和setter。这 不是
封装。这几乎和首先公开它们一样糟糕。

但是,为什么我们不公开一切呢?

我们不希望任何人(甚至我们自己)依赖一些恰好存在的参数,因为某些特定的实现可能会在以后更改。不要只是将所有可能的值更改在那里,封装的意义是与我们最终使用哪种实现方式无关,并通过保护可以设置/更改的内容来保护代码的可用性。

  • 表现很重要

对于任何类型的软件,这都是您应注意的方面之一,但是您通常可以最彻底地看到游戏中的后果。性能很重要!这样一来,我并不是说您必须当心每个细节,而只是牢记概述如何改进和固定您的代码,尤其是使用诸如update(..)和在Slick2D中渲染(..)。

更新资料

作为注释中讨论的另一个问题的解决方案:

public class Enemy {    private int startX, startY, width, height;    public Shape rect = new Rectangle(startX, startY, width, height);    // plus getters and setters}

width和height只能为0,因为它们从未被分配整数,默认情况下其值为0,因此敌方矩形Hitbox的宽度为0,并且永远不会触发。

尝试类似的方法:

 public class Enemy {    private int startX, startY, width = 50, height = 70;    public Shape rect = new Rectangle(startX, startY, width, height);    // plus getters and setters }

这应该可行,但是您可能应该将所有这些属性移到敌方类中,并将它们放入构造函数中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/428782.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号