1

私は pygame を使用して初めてのゲームを作成していますが、アニメーション化するために最も一般的な方法はビットブリットを使用することであることがわかりました。
ただし、これに関していくつか質問があります。

  1. 私が理解したことから、ビットブリットを使用する場合、正しく機能させるためには、以前に存在していたすべてのオブジェクトを画面上で「再描画」する必要があります。これは正しいです?

  2. もしそうなら...私は長方形(長方形)を使用して建物の「シーン」を描いています(建物はそれぞれ異なる色(ランダムに生成)、異なる高さ(ランダム)を持ち、2つの異なる交互の色の窓もあります)。建物クラスが建物とその窓のすべての色を記憶するための最良の方法は何でしょうか?

4

4 に答える 4

3

シンプルな Building クラスを作成できます。

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

もう 1 つのアプローチは、建物を画像に「プリレンダー」してから表示することです (建物がたくさんある場合は、これも高速になる可能性があります)。

そして、ゲームループは次のようになります

  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 1/2 の周囲の画面にある木を含む小さなリストを維持しています。1500 以上の「木」があります)。

編集: ウィンドウの色が異なる場合、2 つの解決策が考えられます。

建物ごとに異なる窓の色を使用する:

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)])
于 2009-10-12T10:41:12.103 に答える
1

はい、画面は絵を描くキャンバスのようなものだと考えてください。シーンが完成して視聴者に表示されたら、次のシーン (別名「フレーム」) をその上にペイントして、そこにあったすべてのものを置き換えて開始します。同じものを少しずつ違う場所に塗り重ねることで動きを表現しています。これは、映画の伝統的なアニメーションによく似ています。一連の微妙に異なる画像を表示して、動きの錯覚を表現します。通常、これを 1 秒間に数十回行います。

このように動作するのは、pygame/SDL のビットブリットだけではありません。ほぼすべてのリアルタイム コンピュータ グラフィックスがこのように動作します。ただし、一部のシステムでは、これが隠され、裏で実行される場合があります。

建物とその色については、画面に表示されるものをゲーム オブジェクトの表現にする必要があります。何かを描いてから、描いたものを「記憶」しようとするのは嫌です。レンダリングは、オブジェクトの単なるビューであり、権威のあるものであってはなりません。したがって、これらのランダムな高さと色を生成すると、描画段階のずっと前に行われます。おそらく作成時に、これらの値を建物オブジェクトの一部として保存します。次に、フレームごとに建物を描画すると、必要なすべての情報がすぐそこにあり、描画するたびに一貫性が保たれます。

于 2009-10-12T09:28:08.107 に答える
0

最初の質問に対する答えは、http: //en.wikipedia.org/wiki/Bit_blitで見つけることができます 。

于 2009-10-12T03:29:25.693 に答える
0
  1. はい。シーンを後ろから前に描くには、「画家のアルゴリズム」を使用する必要があります。

  2. したがって、アニメーションの各フレームでは、最初に背景を描画し、次に建物を描画し、次に建物の前にあるものを描画します。背景が画面全体を覆っている場合は、画面を「クリア」する必要はありません。

于 2009-10-12T03:37:24.713 に答える