Как нарисовать прямоугольник из одной цели рендеринга в другую без потери данных? - PullRequest
0 голосов
/ 10 марта 2012

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

После отрисовки полноразмерного рендерацель (1280x1024), я переключаю активную цель рендеринга на меньшую (59X47 - размер столкновения моих игроков) и пытаюсь нарисовать участок большой цели рендера, который падает под игроком, на меньшую цель.Сначала я думал, что это сработало, но потом я заметил, что столкновения иногда бывают совершенно неточными.

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

            // Render rectangle under player from foreground to collision layer
            Rectangle sourceRectangle = new Rectangle(sourceX, sourceY,
                                                       (int)sizeX, (int)sizeY);
            gd.SetRenderTarget(collisionLayer[i]);
            gd.Clear(Color.Transparent);
            spriteBatch.Draw(foregroundLayer, collisionLayer[i].Bounds,
                                                sourceRectangle, Color.White);
            gd.SetRenderTarget(null);

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

            // Render full target onto collision layer
            gd.SetRenderTarget(collisionLayer[i]);
            gd.Clear(Color.Transparent);
            spriteBatch.Draw(foregroundLayer,new Vector2(0.0f),Color.White);
            gd.SetRenderTarget(null);

На рисунке ниже показана большая цель с маленькой целью, наложенной в верхнем левом углу.Полные данные большой цели, похоже, отображаются правильно.

1 Ответ

2 голосов
/ 10 марта 2012

Вы не показываете свои звонки spriteBatch.Begin и spriteBatch.End, но похоже, что вам нужно их переместить. В частности, вы устанавливаете цель рендеринга в null перед вызовом spriteBatch.End, или, по крайней мере, это выглядит так из вашего примера кода.

Я настроил пример проекта, и когда я делаю следующее, все работает как положено ...

  GraphicsDevice.SetRenderTarget(target);
  GraphicsDevice.Clear(Color.Transparent);
  spriteBatch.Begin();
  spriteBatch.Draw(texture, target.Bounds, new Rectangle(50, 500, 100, 100), Color.White);
  spriteBatch.End();

  GraphicsDevice.SetRenderTarget(null);
  GraphicsDevice.Clear(Color.CornflowerBlue);
  spriteBatch.Begin();
  spriteBatch.Draw(texture, new Rectangle(0, 0, 640, 480), texture.Bounds, Color.White);
  spriteBatch.Draw(target, Vector2.Zero, target.Bounds, Color.White);
  spriteBatch.End();

Но если я перейду spriteBatch.End после SetRenderTarget(null), моя цель рендеринга будет пустой.

...