我正在制作一款 2D 平台游戏。我为平台创建了一个纹理,这意味着要一遍又一遍地重复以填充整个平台,而不会过度。我的第一次尝试是手动从位图中绘制所有像素,但这导致背景在移动平台时闪烁(运动和绘图线程是分开的,因此运动可以以特定速度运行,而 FPS 则不然)不需要受苦)。我发现这种技术效果更好:
// Init
bitmap = new BitmapDrawable(res, Texture.PLATFORM.getBitmap());
bitmap.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
// Drawing loop
int x = getX() + (isStill() ? 0 : (int)MainActivity.offsetX);
int y = getY() + (isStill() ? 0 : (int)MainActivity.offsetY);
bitmap.setBounds(x, y, x + getWidth(), y + getHeight());
bitmap.draw(canvas);
但是,当平台充当“查看孔”以透视位图时,位图似乎保持静态。我能想到的唯一解决方法是以某种方式“偏移”静态位图:
bitmap.offset(x, y);
显然,这不是一个函数。在浏览文档时,我找不到一个可以完成我想要的操作。
总而言之,BitmapDrawable 导致背景不随平台移动,使其看起来非常奇怪。
提前致谢!
最佳答案
在您的代码中尝试这些提示:(我假设游戏在水平方向上向前移动)
- 该人应该只上下移动(使用适当的触摸输入),并且不能向前和向后移动,因为您希望焦点(或相机)仅位于GUY。我注意到,当 GUY 从墙的最初较高位置移动到稍后的较低位置时,墙在您的视频中向上移动,请纠正此问题,因为 GUY 应该向下移动(尝试实现重力效果)。
- 墙应该只向前(大部分)和向后(我猜不太常见)移动。墙不应该正常上下移动。不要应用重力对它的影响。您可以为屏幕创建至少 2 个
BitmapDrawable
WALL 实例。它们将按顺序重用(例如:如果第一个完全超出屏幕,请使用 setBounds() 方法将其重新显示在所需位置),并在整个游戏中继续对其他人进行相同的操作。 - 当前的蓝色背景,如果是较大 map 的一部分,则需要适当偏移。
- 在撰写本文时,我能想到的障碍之一是向下移动墙,直到它超出屏幕,从而导致 GUY 死亡。
- 在那些我使用了“移动”一词的地方,您需要使用
setBounds(a, b, c, d)
方法来进行必要的基于位置的调整更改,因为我没有找到其他方法来更新 BitmapDrawable 实例的位置。我认为,您需要使用像 libGdx 这样的游戏框架来获取像setOffset(x, y)
或类似类型的豪华方法。
抱歉,我只能向您展示想法,而没有具体的代码,因为我过去没有在这样的项目中工作的经验。希望它能尽可能地帮助您。
关于java - 在 x 和 y 方向重复时设置 BitmapDrawable 的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62077726/