2012-04-03 2 views
14

Прежде чем спросить это, я сделал много поиска в сети. Я просто не могу этого сделать. Мне немного сложно понять. Итак, как я рисую изображения на правой позиции экрана, отвечающей органам в мировом положении? Thanx.Slick2D и JBox2D. Как нарисовать

Если кто-либо еще находит его перед тем же препятствием, я отправил КАК, спасибо за хорошее объяснение нормальности. Вы можете найти его здесь: http://romeo.akademx.ro/2012/04/06/slick-and-box2d/

Это функция визуализации:

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 найден по этой ссылке: http://slick.javaunlimited.net/viewtopic.php?f=19&t=3610&sid=69614ac53aaf5724b808b75173e8e48e

Но его DebugDraw рисует совершенно другую вещь, а затем мою функцию рендеринга. Я немного смущен.

+0

Можете ли вы опубликовать нам какой-то код, с которым вы столкнулись? Это поможет нам ответить на ваш вопрос. –

+0

Давай, никто не знает? Мне нужно это так плохо, поэтому я могу продолжить работу над своим проектом. – Romeo

ответ

64

Если все, что вы делаете, это рисование спрайтов в 2D-мире, тогда вам нужно в основном выполнить две вещи, чтобы решить, какие спрайты рисовать на экране и где на экране их рисовать. Вы должны думать о своих спрайтах как о существовании в определенном месте в мире, и о том, что вы видите на экране, как о единственном взгляде на мир, сосредоточив внимание на области.

Две вещи, которые необходимо отслеживать, являются:

  1. Каждый спрайт должен иметь свое местоположение в мире
  2. Ваш «камера» должна отслеживать свое местоположение по отношению к миру.

Итак, предположим, что у вас большой большой мир с пространством 2D координат (x, y), равным 1 000 000 x 1 000 000 пикселей (здесь я использую пиксели в качестве единицы измерения, но это произвольная выбор, и размер мира не имеет значения, я только что выбрал большой). Тогда, допустим, у вас есть «камера», которая указана в этом мире, и вид этой камеры - это то, что отображается на вашем экране. Дисплей, который дает вам камера, имеет размер 1024x768 пикселей.

Давайте также скажем, что вы используете клавиши со стрелками для перемещения этой камеры по всему миру.

Итак, ваш мир координатного пространства карты на экран, например:

(0, 0)  +x 
     +------------------> 
     | 
    +y | 
     |  * <= example sprite in your world @ coordinates (x=200, y=200) 
     | 
    \/

Когда спрайты двигаться «вправо» они увеличивают их x координаты. Когда они двигаются «влево», они уменьшают координату x. При движении «вверх» они уменьшить их y координат (потому что y увеличивается вниз, на Отображаемых), так и при движении «вниз» спрайты увеличения их координаты y.

Теперь, опять же, то, что вы видите на нашем экране, - это просто взгляд камеры на мир. Итак, давайте установим, что верхний левый угол камеры - (x=500, y=500).Это будет выглядеть примерно так:

(0, 0)  +x 
     +----------------------------------> 
     | 
    +y | 
     |  * <= example sprite in your world @ coordinates (x=200, y=200) 
     | 
     | 
     |   +===================+ 
     |   |  the area  | 
     |   | that the camera | 
     |   | "sees" and  | 
     |   | shows on your | 
     |   |  screen  | 
     |   +===================+ 
    \/

С этой установкой, скажем, что камера находится в точке (500, 500) (то есть, верхний левый угол зрения камеры, как показано в этом примере, является (500, 500). И поскольку камера показывает, что вы занимаете площадь 1024x768, тогда противоположный нижний правый угол равен (500 + 1024, 500 + 768) = (x=1524, y=1268).

Примечание. что спрайт в нашем мире составляет , а не внутри области просмотра этой камеры. Это означает, что, когда мы визуализируем вид камеры на экране, мы не увидим спрайт.

Если вместо этого камера переместилась на (200, 200), тогда область обзора камеры будет покрывать мировые координаты слева и слева (200, 200) до нижнего правого @ (1224, 968) и что-то вроде этого:

(0, 0)  +x 
     +----------------------------------> 
     | 
    +y | +===================+ 
     | |     | 
     | | * <= sprite  | 
     | |     | 
     | |     | <= camera's view of the world 
     | +===================+ 
     | 
     | 
     | 
     | 
    \/

Когда камера находится в этом положении, спрайт виден. Если спрайт равен @ (500, 500), а камера находится на отметке (200, 200), тогда, когда мы нарисуем спрайт на экране, появится спрайт, на нашем экране в координатах 300, 300.

Почему?

Потому что, и это на самом деле ответ на ваш вопрос, где вы рисуете вещи на экране мир местоположение спрайта (500, 500), минус камеры расположение (200, 200), который равен (300, 300).

Итак, для проверки:

Вы перемещаете положение камеры по всему миру с помощью клавиш со стрелками (или мышь, или любой другой схемы управления вы хотите), и вы визуализации спрайтов расположение относительно камеры положение, взяв положение спрайта и , вычитая позицию камеры, а также то, что вы получаете, - это координаты экрана, где должен появиться спрайт.

Но есть еще одна вещь ...

Это действительно неэффективно рисовать каждый спрайт в мире. Вам нужно всего лишь нарисовать спрайты, которые находятся в пределах камеры, иначе вы рисуете вещи, которые вы не увидите на экране, и, следовательно, тратите время рендеринга/CPU/GPU.

Итак, когда вы визуализируете представление камеры, вам нужно пройти через ваши спрайты, проверяя, являются ли они «на камере» (то есть, независимо от того, находятся они или нет в пределах камеры) , и только рисовать их, если они находятся в этом представлении.

Для того, чтобы сделать это, вы должны принять размеров вашей камеры (1024x768, в нашем примере), и проверьте, чтобы увидеть, если положение спрайта внутри прямоугольника зрения камеры - что позиция верхнего левого угла камеры, а также ширины и высоты камеры.

Так что, если наша камера показывает нам вид, что это 1024x768 пикселей в размерах, и это верхний левый угол в точке (200, 200), то вид прямоугольник:

(200, 200)      (1224, 200) 
      +===================+ 
      |     | 
      | *    | 
      |     | 
      |     | 
      +===================+ 
(200, 968)      (1224, 968) 

положение спрайта @ (500, 500) находится в пределах камеры, в этом случае.

Если вам нужно больше примеров, у меня есть рабочая демонстрация технологии Slick2D под названием Pedestrians, в которой есть код, на который вы можете посмотреть. Для получения подробной информации о том, как я вычисляю область мира, которая должна быть оказана, посмотрите на метод render внутри this file и обратите особое внимание на переменные, которые для меня контролируют область спрайтов. Я обращаю особое внимание на переменные , stopX, stopY. собираюсь рисовать. Следует также отметить, что мои спрайты (или «пешеходы») существуют на TileMap, поэтому они не имеют размера 1 пиксель - у них есть их ширина и высота. Это добавляет небольшую сложность в том, как решить, что делать, но в основном это сводится к тому, чтобы «рисовать то, что находится внутри камеры, плюс немного больше по краям».

Клонировать хранилище пешеходов на вашей собственной машине, заставить его работать, добавив те же зависимости к проекту, что и любой другой проект Slick2D, и воспроизведите/измените код рендеринга, пока не поймете, что происходит. Только с помощью практики и учебы вы получите все незначительные выводы о том, как это работает. Хорошей новостью является то, что как только вы поймете, как сделать рендеринг с помощью этого базового метода 2D-мира против камеры, вы в значительной степени знаете, как визуализировать графику для всех 2D-приложений, потому что эти концепции переводятся на все языки.

Я также различные видео Пешеходов выполняются на my YouTube channel (наиболее актуальные видео, вероятно this one, который показывает мои основные пешеходов визуализируемый, и камера двигается вокруг), так что вы можете увидеть, что все это выглядит как без сначала создать проект.

+8

Один из лучших и более информативных ответов, которые я прочитал о SO. Отличный пост. –

+1

Ты просто стал моим кумиром. Я очень люблю тебя сейчас. Я все понимаю. Огромное спасибо. С этого момента я - ваш самый большой поклонник. Тонкс снова! – Romeo

+0

Добро пожаловать. FYI, есть также http://gamedev.stackexchange.com/ - это еще один сайт StackExchange, но посвященный разработке игр. Хотя я слежу за тегом 'slick2d' на этом сайте, так как вы задаете больше вопросов, связанных с дизайном игры, так как вы работаете над своим проектом, сайт gamedev может оказаться хорошим местом, чтобы попытаться ответить им. – jefflunt