- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在用 SFML 制作一个 2D 游戏,我正在尝试弄清楚如何与瓦片 map 中的瓦片发生碰撞。我已经编写了一些代码,但问题是我卡在了正在碰撞的方 block 中,如下图所示。我无法向任何方向移动,播放器的大约 5 个像素在墙上。
这是我的碰撞/移动代码
void Player::update(float delta, std::vector<Tile>& tiles) {
canMove = true;
for (int i = 0; i < tiles.size(); i++) {
if (Collision::PixelPerfectTest(sprite, tiles[i].sprite) && tiles[i].collision) {
canMove = false;
}
}
if (canMove) {
move(delta);
}
}
void Player::move(float delta) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) || sf::Keyboard::isKeyPressed(sf::Keyboard::Up) || sf::Joystick::getAxisPosition(0, sf::Joystick::Y) < -20) {
movement.y -= speed * delta;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A) || sf::Keyboard::isKeyPressed(sf::Keyboard::Left) || sf::Joystick::getAxisPosition(0, sf::Joystick::X) < -20) {
movement.x -= speed * delta;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) || sf::Keyboard::isKeyPressed(sf::Keyboard::Down) || sf::Joystick::getAxisPosition(0, sf::Joystick::Y) > 20) {
movement.y += speed * delta;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D) || sf::Keyboard::isKeyPressed(sf::Keyboard::Right) || sf::Joystick::getAxisPosition(0, sf::Joystick::X) > 20) {
movement.x += speed * delta;
}
sprite.setPosition(movement);
}
这是 PixelPerfectTest 函数(不是我的)
bool PixelPerfectTest(const sf::Sprite& Object1, const sf::Sprite& Object2, sf::Uint8 AlphaLimit) {
sf::FloatRect Intersection;
if (Object1.getGlobalBounds().intersects(Object2.getGlobalBounds(), Intersection)) {
sf::IntRect O1SubRect = Object1.getTextureRect();
sf::IntRect O2SubRect = Object2.getTextureRect();
sf::Uint8* mask1 = Bitmasks.GetMask(Object1.getTexture());
sf::Uint8* mask2 = Bitmasks.GetMask(Object2.getTexture());
// Loop through our pixels
for (int i = Intersection.left; i < Intersection.left + Intersection.width; i++) {
for (int j = Intersection.top; j < Intersection.top + Intersection.height; j++) {
sf::Vector2f o1v = Object1.getInverseTransform().transformPoint(i, j);
sf::Vector2f o2v = Object2.getInverseTransform().transformPoint(i, j);
// Make sure pixels fall within the sprite's subrect
if (o1v.x > 0 && o1v.y > 0 && o2v.x > 0 && o2v.y > 0 &&
o1v.x < O1SubRect.width && o1v.y < O1SubRect.height &&
o2v.x < O2SubRect.width && o2v.y < O2SubRect.height) {
if (Bitmasks.GetPixel(mask1, Object1.getTexture(), (int)(o1v.x) + O1SubRect.left, (int)(o1v.y) + O1SubRect.top) > AlphaLimit &&
Bitmasks.GetPixel(mask2, Object2.getTexture(), (int)(o2v.x) + O2SubRect.left, (int)(o2v.y) + O2SubRect.top) > AlphaLimit)
return true;
}
}
}
}
return false;
}
编辑:这就是我让它工作的方式,以防 future 的任何人需要帮助
void Player::update(float delta, std::vector<Tile>& tiles) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) || sf::Keyboard::isKeyPressed(sf::Keyboard::Up) || sf::Joystick::getAxisPosition(0, sf::Joystick::Y) < -20) {
newPos.y -= speed * delta;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A) || sf::Keyboard::isKeyPressed(sf::Keyboard::Left) || sf::Joystick::getAxisPosition(0, sf::Joystick::X) < -20) {
newPos.x -= speed * delta;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) || sf::Keyboard::isKeyPressed(sf::Keyboard::Down) || sf::Joystick::getAxisPosition(0, sf::Joystick::Y) > 20) {
newPos.y += speed * delta;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D) || sf::Keyboard::isKeyPressed(sf::Keyboard::Right) || sf::Joystick::getAxisPosition(0, sf::Joystick::X) > 20) {
newPos.x += speed * delta;
}
sf::Vector2f oldPos = sprite.getPosition();
sprite.setPosition(newPos);
for (int i = 0; i < tiles.size(); i++) {
if (Collision::PixelPerfectTest(sprite, tiles[i].sprite) && tiles[i].collision) {
sprite.setPosition(oldPos);
newPos = oldPos;
}
}
}
最佳答案
你的问题本质上是这样的:
如果您的玩家不在墙上,他可以向任何方向移动。这包括会让他撞墙的 Action 。如果您的玩家在墙上,他根本无法移动。因此,如果他撞到墙上(因为你允许他这样做),他将永远无法摆脱。
因此,最明显的解决方法是不要让玩家移动到墙上。一种简单的方法是尝试移动玩家,然后检查是否与墙壁发生碰撞。如果发生碰撞,将播放器移回其原始位置。
这应该可以解决卡在墙上的基本问题。尽管这可能会给您带来其他问题,例如无法紧靠墙壁。为此,您可以做的是检查碰撞发生时墙的确切位置,然后将玩家移动到它旁边。
关于c++ - SFML 瓦片 map 碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27790433/
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在制作一个游戏,世界地图将由称为 Tiles 的 block 创建。所有图 block 都保存在单个 PNG 文件中,类似于下面发布的文件: 我需要分割这个图像并将所有这些 block 分别存储在
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Android custom control to display map tiles 我是 Java 的新
我使用 raster2pgsql 将栅格文件导入到 PostGIS 中,我设置了 -t 50x50,它生成了大约 500 行。我知道这些 -t 将光栅分成小块,并且 rid 可以为它们编制索引。我看到
我正在我的移动应用(Cordova 应用)中使用 Google map 。其中我在 map 上制作一些多边形作为边界。我希望用户也可以在离线模式下查看边界/多边形。对于离线 map ,我正在使用 Le
我现在有这个代码:http://jsfiddle.net/DK67k/2/这里是 2D 瓦片 map ,当你点击瓦片时,你会得到坐标。但是要获得精确坐标,您需要单击左上图 block (图 block
我正在开发一款 Mario 游戏,需要有关如何为图 block map 创建命中检测的帮助和建议。 目前,玩家可以步行/跳跃穿过方 block 。我现在在地面上添加了一个固定检测,我希望用常规的命中检
我正在尝试以灰度显示通过 Cartopy 的 img_tiles 模块下载的图 block 。那是因为我想覆盖彩色编码的卫星数据,并且我更喜欢背景尽可能不分散注意力。 source code 中记录的
问题来了。我有大小为 1 的矩形 Canvas 。因此它的坐标系为 (0.0 ... 1.0 - x 和 0.0 ... 1.0 - y)。 我也有一些瓷砖。瓷砖也是矩形的。它们有不同的大小,瓷砖的数
由于 - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 在从缓存中加载图 block 时未调用,是否有办法知道何时加载了所有图 block
我阅读了 google android api 并且对 map 图 block 是什么感到困惑,因为该 api 描述了 google map 如何处理“下载 map 图 block ”。(来源)- h
我一直在尝试在我的 flutter 应用程序的卡片最左边放置一个线条指示器。我尝试了很多东西但没有用。 有一个确切的问题here ,这实际上是我一直试图解决的同一个问题。 公认解决方案的问题是它限制了
最近我正在使用 Phaser.js 开发一个游戏,我开始需要我的瓦片 map 对象,我来看看这个 video . 唯一的问题是看到这个的“ Sprite 制造对象”example ,这个方法用到了ma
我对 libgdx 瓦片 map 中单位比例的实现感到很困惑。例如,如果我将我的单位比例指定为 1/16f,并让一个 Actor 在我的逻辑世界中从 (0,0) 移动到 (0,1),那么 Sprite
我已经为此工作好几天了。我在关卡编辑器中创建了一个瓦片 map 。它可以很好地加载到我的代码中,但是当我遍历这些图 block 时,它们都没有显示为具有定义。不确定我做错了什么。 一切运行正常,但它不
所以我正在尝试构建一个由图 block 组成的基于 3D 的世界。 我已经使用平面几何形状和高度值等成功地做到了这一点。但现在我已经到了可能不得不改变一切的地步。 问题是我想要一个图 block 具有
我遵循将瓦片 map 转换为视网膜显示的指南,方法是将宽度和高度的大小更改为对象的大小和位置的两倍。但正常显示的结果与视网膜显示不同 正常显示正确但视网膜显示不正确 这是非视网膜瓦片 map 这是视网
我正在用 SFML 制作一个 2D 游戏,我正在尝试弄清楚如何与瓦片 map 中的瓦片发生碰撞。我已经编写了一些代码,但问题是我卡在了正在碰撞的方 block 中,如下图所示。我无法向任何方向移动,播
我正在创建一个 HTML5 平台游戏,使用对象进行碰撞检测并使用 2d 图 block map 来渲染关卡。这就是全部工作。 我想使用相同的二维数组动态构建对象数组,以允许玩家根据需要构建 map ,
我正在尝试使用 libgdx 为我的家人制作一个简短的圣诞节游戏,当向前穿过关卡时,屏幕边缘会闪烁,但当向后移动时,没有闪烁,这很烦人。 Here是我的意思的演示。 此外,这是我的代码: if (di
我是一名优秀的程序员,十分优秀!