2013-01-28 2 views
0

Мне нужно добавить второй видовой экран (= как splitscreen), чтобы игрок мог видеть событие где-то еще на текущем уровне.Есть ли другой способ избежать перерисовки для второго окна просмотра?

Есть ли возможность рисовать область событий без перерисовки всех вещей, которые уже нарисованы?

[EDIT] RenderTarget2D - это ключ. Thx User1459910 для всех.

Это почти сработало.

Новые вопросы:

  1. Я искал какое-то время и до сих пор не найти учебник о «XNA 2D камеры с исходной и целевой прямоугольник», если у вас есть ссылка, я хотел бы увидеть его, пожалуйста ♥
  2. в настоящее время код рисования выглядит следующим образом:

    protected override void Draw(GameTime gameTime) 
    { 
    
        /* 
        ... 
        here is the code to "draw" in the renderTarget2D renderAllScene object 
        ... 
        */ 
    
        //Let's draw into the 2 viewports 
        spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, null, null, null, camera1.transform); 
        spriteBatch.Draw(renderAllScene, viewport1.Bounds, Color.White); 
        spriteBatch.End(); 
        if (EventIsRunning) 
        { 
         spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, null, null, null, camera2.transform); 
         spriteBatch.Draw(renderAllScene, viewport2.Bounds, Color.White); 
         spriteBatch.End(); 
        } 
    

* The Viewport 1 велика. Камера следует за персонажем, но после перемещения камеры на короткое расстояние карта резана на 1280 пикселей, я думаю. поэтому он рисовал всего 1280 пикселей всей карты. Я не знаю почему. Возможно, потому что я потерпел неудачу, когда создал renderAllScene = новый RenderTarget2D. : x

 renderAllScene = new RenderTarget2D(GraphicsDevice, GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight); 

* Для видового экрана 2: мне нужен исходный прямоугольник. Я попробую это завтра.

+0

Некоторые люди сказали, что вы можете переместить область просмотра вместо того, чтобы перемещать все объекты в мире, хотя я еще не пробовал это сам. Я предполагаю, что в основном вам нужно выяснить, какие объекты можно увидеть в обоих видовых экранах, привлечь их все с помощью spritebatch, а затем сделать что-то с вашими окнами. Или нарисуйте материал для первого видового экрана, затем материал для другого, я не уверен. – user1306322

ответ

1

Предполагаю, что вы делаете 2D-игру с НИЧЕГО 3D вообще.

Вот что вы можете сделать:

Вам нужно сделать всю карту, и все игровые объекты, которые появляются на нем, на текстуры. Если вы не знаете, как сделать в текстуры, здесь процедура:

  1. Создание объекта RenderTarget2D
  2. О функции Draw, прежде чем вынести что-либо, вы должны вызвать graphicsDevice.SetRenderTarget() и установите созданный RenderTarget2D.
  3. После выполнения рендеринга вызовите функцию graphicsDevice.SetRenderTarget (null), чтобы сбросить цель рендеринга до значения по умолчанию. Вы должны это сделать или у вас будут проблемы!
  4. Для рендеринга RenderTarget2D просто используйте SpriteBatch.Draw ((Texture2D) renderTarget2D, положение, цвет), будучи «renderTarget2D», конечно, имя созданного RenderTarget2D.

Затем вы используете две 2D-камеры. Будет отображаться, где находится герой, а другой отображает область событий.

2D-камера в основном представляет собой трюк с прямоугольниками источника и назначения. Трюк состоит в том, чтобы использовать Source Rectangle для определения области, в которой отображается герой и область вокруг него, и использовать главный видовой экран в качестве целевого прямоугольника и использовать другой прямоугольник источника для определения области события и другого целевого прямоугольника как второго видового экрана.

Если у вас есть сомнения, google о «2D-камере XNA» и исследование прямоугольников Source и Destination в статье MSDN для SpriteBatch.Draw().

+0

THX для ответа! я немного устал и не очень хорошо по-английски (так что завтра перечитаю ваш ответ). Вот еще информация: 1-это 2D-игра, но 2-я использую матрицу (с Vector3), будет ли ваш ответ по-прежнему работать? – Sharpnel

+0

Вы используете Matrix для чего? Вы имеете в виду матрицу преобразования на SpriteBatch.Begin()? Если да, мой ответ будет по-прежнему работать, если вы должным образом учитываете положение и размеры исходного прямоугольника. – UBSophung

+0

Да, преобразование матрицы камеры, используемое в spritebatch.begin(). Thx много, я попробую это через несколько часов. ♥ – Sharpnel

Смежные вопросы