Нужен совет о том, как работает битблит - PullRequest
1 голос
/ 12 октября 2009

Я создаю свою первую игру, когда-либо использующую pygame, и обнаружил, что для оживления вещей наиболее популярным методом является использование бит-блит.
Однако у меня есть несколько вопросов по этому поводу:

  1. Из того, что я понял, когда вы используете битовый блиц, вы должны "перерисовывать" на экране каждый отдельный объект, который присутствовал ранее, чтобы он работал правильно. Это правильно?

  2. Если это так ... Я рисую «сцену» зданий, используя ректы (прямоугольники) (каждое из зданий имеет разные цвета (случайным образом), разную высоту (случайное), и у них также есть окна, которые имеют 2 разных чередующихся цвета). Каков был бы лучший способ для моего класса Здания запомнить каждый цвет, который у него был для здания и его окон, чтобы, когда я немного ослеплялся, здание не получало разные цвета, чтобы сделать его более реалистичным?

Ответы [ 4 ]

3 голосов
/ 12 октября 2009

Вы можете иметь простой класс здания:

class Building:
  def __init__(self, x, y, w, h, color):
    self.x = x
    self.y = y
    self.w = w
    self.h = h
    self.color = color


  def draw(self):
    // code for drawing the rect at self.x,self.y 
    // which is self.w wide and self.h high with self.color here

Что касается окон, вы можете указать каждое из них в списке, например [(x, y, w, h)], для каждого здания или просто создать класс здания, который выглядит следующим образом:

class Building:
  def __init__(self, x, y, w, h, color, wx, wy):
    self.x = x
    self.y = y
    self.w = w
    self.h = h
    self.color = color
    self.wx = wx
    self.wy = wy


  def draw(self):
    // code for drawing the rect at self.x,self.y 
    // which is w wide and h high with self.color here

    // Draw wx windows horizontally and wy windows vertically
    for y in range(0, self.wy):
      for x in range(0, self.wx):
        // draw Window code here

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

И ваш геймпул может выглядеть примерно так

  buildingList = [Building(0, 0, 15, 50, RED), Building(0, 0, 40, 30, BLUE)]
  while gameIsRunning:
        // Clear screen code here

        // Show Building
        for b in buildingList:
          b.draw()

        // More stuff

Это в значительной степени самый основной подход для рисования чего-либо, вы можете рисовать символы таким образом, ключи или даже плитки, которые должны быть выше вашего персонажа, например водяные плитки в платформер, как Tuff . Деревья здесь также находятся в одном большом списке (хорошо, на самом деле я поддерживаю меньший список с деревьями, которые находятся на 1 1/2 окружающих экранах по соображениям производительности. Есть более 1500 «деревьев»).

EDIT: В случае разных цветов окна, есть два возможных решения.

Использование разных цветов окон для здания:

class Building:
  def __init__(self, x, y, w, h, color, wx, wy, windowColor):
    self.x = x
    self.y = y
    self.w = w
    self.h = h
    self.color = color
    self.wx = wx
    self.wy = wy
    self.windowColor = windowColor


  def draw(self):
    // code for drawing the rect at self.x,self.y 
    // which is self.w wide and self.h high with self.color here

    // Draw wx windows horizontally and wy windows vertically
    for y in range(0, self.wy):
      for x in range(0, self.wx):
        // draw Window code here using self.windowColor

Возможность 2, с разными цветами на окно:

   class Building:
      def __init__(self, x, y, w, h, color, windows):
        self.x = x
        self.y = y
    self.w = w
    self.h = h
        self.color = color
        self.wx = wx
        self.wy = wy
        self.windows = windows


      def draw(self):
        // code for drawing the rect at self.x,self.y 
        // which is self.w wide and self.h high with self.color here

        // Draw all windows
        for w in windows:
          // draw Window at w[0] as x, w[1] as y with w[2] as color

// Create a building at 0,0 that is 20 wide and 80 high with GRAY color and two windows, one at 2,2 which is yellow and one at 4, 4 that's DARKBLUE.
b = Building(0, 0, 20, 80, GRAY, [(2, 2, YELLOW), (4, 4, DARKBLUE)])
1 голос
/ 12 октября 2009

Да, считайте, что экран похож на холст, на который вы рисуете. Как только сцена закончена и показана зрителю, вы начинаете следующую сцену (также называемую «рамкой»), рисуя поверх нее, заменяя все, что там было. Движение представлено многократным рисованием одной и той же вещи в немного разных местах. Это похоже на традиционную анимацию в фильме - показать серию тонко разных картинок, чтобы представить иллюзию движения. Обычно вы делаете это несколько десятков раз в секунду.

Так работает не только бит-блины Pygame / SDL - практически вся компьютерная графика в реальном времени для такой работы. Однако некоторые системы могут скрывать это от вас и делать это под прикрытием.

Для ваших зданий и их цветов вы хотите, чтобы то, что выходит на экран, было отображением ваших игровых объектов. Вы не хотите что-то рисовать, а затем попытаться «вспомнить», что вы нарисовали. Рендеринг должен быть просто представлением объектов, а не чем-то авторитетным. Поэтому, когда вы генерируете эти случайные высоты и цвета, это будет сделано задолго до фазы рисования. Сохраните эти значения как часть ваших строительных объектов, вероятно, во время создания. Затем, когда вы приходите рисовать здание в каждом кадре, вся необходимая вам информация находится там и будет оставаться неизменной каждый раз, когда вы ее рисуете.

0 голосов
/ 12 октября 2009
  1. Да. Вам нужно использовать « алгоритм художника », чтобы нарисовать вашу сцену сзади вперед

  2. Итак, для каждого кадра анимации сначала нужно нарисовать фон, затем здания, а затем что-нибудь перед зданиями. Вам не нужно «очищать» экран, если фон покрывает весь экран.

0 голосов
/ 12 октября 2009

Вы можете найти ответ на свой первый вопрос здесь:
http://en.wikipedia.org/wiki/Bit_blit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...