Java Slick2D和JBox2D。如何画
在问这个问题之前,我在网上做了很多搜索。我就是做不到。这对我来说有点难理解。那么,我如何在正确的屏幕位置绘制图像,以响应处于世界位置的身体?塔克斯 如果有人在我贴出的“如何”的同一个障碍物前发现了他,thanx向Normalcocity做出了很好的解释。你可以在这里找到它: 这是渲染函数:Java Slick2D和JBox2D。如何画,java,physics-engine,slick2d,jbox2d,Java,Physics Engine,Slick2d,Jbox2d,在问这个问题之前,我在网上做了很多搜索。我就是做不到。这对我来说有点难理解。那么,我如何在正确的屏幕位置绘制图像,以响应处于世界位置的身体?塔克斯 如果有人在我贴出的“如何”的同一个障碍物前发现了他,thanx向Normalcocity做出了很好的解释。你可以在这里找到它: 这是渲染函数: public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickExcepti
public void render(GameContainer container, StateBasedGame game, Graphics g)
throws SlickException {
g.setBackground(Color.white);
g.pushTransform();
g.translate(worldToScreen(body.getPosition()).x, worldToScreen(body.getPosition()).y);
g.rotate(15, 15, (float) Math.toDegrees(body.getAngle()));
part.draw();
g.popTransform();
g.drawString("Count: " + cont, 5, 40);
//world.drawDebugData();
}
这些是我用来转换世界屏幕协调的函数:
public Vec2 screenToWorld(Vec2 screenV) {
return new Vec2((screenV.x - offset.x) / scaleFactor, yFlip
* (screenV.y - offset.y) / scaleFactor);
}
public Vec2 worldToScreen(Vec2 worldV) {
return new Vec2(worldV.x * scaleFactor + offset.x, yFlip * worldV.y
* scaleFactor + offset.y);
}
我还碰巧使用了此链接中的SlickDebugDraw:
但是他的DebugDraw绘制了一个完全不同的东西,然后是我的渲染函数。我有点困惑。如果你所做的只是在2D世界中绘制精灵,那么为了决定在屏幕上绘制哪些精灵以及在屏幕上的何处绘制精灵,基本上有两件事需要跟踪。你必须把你的精灵想象成存在于世界的某个特定位置,而你在屏幕上看到的只是世界的一个视图,聚焦于某个区域 您需要跟踪的两件事是:
(0, 0) +x
+------------------>
|
+y |
| * <= example sprite in your world @ coordinates (x=200, y=200)
|
\ /
通过这种设置,我们假设相机位于(500500)(即,相机视图的左上角,如本例所示,位于世界坐标(500500)处)。由于相机显示的区域大小为1024x768,则相反的右下角为(500+1024500+768)=(x=1524,y=1268)
请注意,在我们的世界中,精灵是而不是在相机的视图区域内。这意味着,当我们在屏幕上渲染相机的视图时,我们将看不到精灵
相反,如果相机移动到(200200),那么相机的视图区域将覆盖从左上角(200200)到右下角(1224968)的世界坐标,如下所示:
(0, 0) +x
+---------------------------------->
|
+y | +===================+
| | |
| | * <= sprite |
| | |
| | | <= camera's view of the world
| +===================+
|
|
|
|
\ /
在这种情况下,精灵的位置@(500500)在相机的视图内
如果你需要更多的例子,我有一个名为的二维技术演示,里面有你可以查看的代码。有关如何计算应该渲染的世界面积的详细信息,请查看里面的render
方法,并特别注意startX
,startY
,stopX
,stopY
variables,对我来说,它控制着我将要绘制的精灵的区域。还应该注意的是,我的精灵(或“行人”)存在于TileMap
上,所以它们不是1像素大小-它们有自己的宽度和高度。这给如何决定绘制什么增加了一点复杂性,但基本上归结为,“绘制相机视图中的内容,并在边缘周围多画一点。”
在您自己的机器上克隆Pedestrians存储库,通过向项目添加与任何其他Slick2D项目相同的依赖项使其工作,并播放/修改渲染代码,直到您了解发生了什么。只有通过实践和研究,您才能了解其工作原理。好消息是,一旦您了解了解如何使用这个基本的2D world vs.camera方法进行渲染,您将非常了解如何为所有2D应用程序渲染图形,因为这些概念可以转换为所有语言
我也有各种各样的行人跑步视频(最相关的视频可能是,它显示了我的基本行人被渲染,以及摄像机四处移动),这样你就可以看到这一切是什么样子,而不必先构建项目。你能给我们发一些你遇到问题的代码吗?这将帮助我们回答你的问题。拜托,没人知道?我非常需要这个,这样我就可以继续我的项目。这是我读过的最好的、信息更丰富的答案之一。很好的帖子。你刚刚ecome我的偶像。我现在非常爱你。我了解所有这些。非常感谢。从现在起,我是你最大的粉丝。再次感谢你!不客气。仅供参考,还有-这是另一个StackExchange网站,但致力于游戏开发。虽然我一直在关注这个网站上的
slick2d
标签,因为你要求更多游戏开发人员ic问题当您在项目中工作时,gamedev网站可能会被证明是一个很好的地方来尝试回答这些问题。@Growler-您所描述的是相机视图的绘制位置,而不是相机。相机只是一个矩形区域,带有(x,y)
和(宽度,高度)
。这定义了相机的窗口“看”的世界和它的尺寸往往反映屏幕的分辨率。旁注:JPanel是一个Swing组件,您不需要(也不想要)通过Swing进行游戏。Slick提供渲染和输入捕获所需的一切。请参阅:@Growler-最后一点注意,Slick2D已被放弃作为一个项目,我在网上看到的人推荐作为替代品。
(0, 0) +x
+---------------------------------->
|
+y | +===================+
| | |
| | * <= sprite |
| | |
| | | <= camera's view of the world
| +===================+
|
|
|
|
\ /
(200, 200) (1224, 200)
+===================+
| |
| * |
| |
| |
+===================+
(200, 968) (1224, 968)