Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Slick2D和JBox2D。如何画_Java_Physics Engine_Slick2d_Jbox2d - Fatal编程技术网

Java Slick2D和JBox2D。如何画

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

在问这个问题之前,我在网上做了很多搜索。我就是做不到。这对我来说有点难理解。那么,我如何在正确的屏幕位置绘制图像,以响应处于世界位置的身体?塔克斯

如果有人在我贴出的“如何”的同一个障碍物前发现了他,thanx向Normalcocity做出了很好的解释。你可以在这里找到它:

这是渲染函数:

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世界中绘制精灵,那么为了决定在屏幕上绘制哪些精灵以及在屏幕上的何处绘制精灵,基本上有两件事需要跟踪。你必须把你的精灵想象成存在于世界的某个特定位置,而你在屏幕上看到的只是世界的一个视图,聚焦于某个区域

您需要跟踪的两件事是:

  • 每个精灵都需要在世界上有自己的位置
  • 你的“相机”需要追踪它相对于世界的位置
  • 假设你有一个很大的世界,二维坐标(x,y)空间为1000000 x 1000000像素(我在这里使用像素作为度量单位,但这是一个任意选择,世界的大小无关紧要,我只是选择了一个大的)。然后,假设你有一个指向那个世界的“摄像机”,摄像机的视图就是你屏幕上显示的。相机显示的尺寸为1024x768像素

    假设您使用箭头键在世界各地移动相机

    因此,您的世界坐标空间映射到屏幕上,如下所示:

    (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)