python
1class GridScreen(object): 2 SCREEN_RECT = Rect(0, 0, 640, 480) 3 ROW, COL = 15, 20 4 GRID_SIZE = 32 5 6 def __init__(self): 7 self._screen = pygame.display.set_mode(GridScreen.SCREEN_RECT.size) 8 pygame.display.set_caption('test') 9 10 def draw(self, image, column, row): 11 self._screen.blit( 12 image, 13 (column * GridScreen.GRID_SIZE, 14 row * GridScreen.GRID_SIZE)) 15 16class Image(object): 17 def __init__(self, filename, colorkey=None): 18 filename = os.path.join("data", filename) 19 try: 20 self._image = pygame.image.load(filename) 21 self._image = self._image.convert() 22 except pygame.error: 23 print('failed to load image = {}'.format(filename)) 24 raise 25 26 if colorkey is not None: 27 if colorkey is -1: 28 colorkey = self._image.get_at((0, 0)) 29 self._image.set_colorkey(colorkey, RLEACCEL) 30 31 def image(self): 32 return self._image 33class Map(object): 34 def __init__(self, grid_screen): 35 self._grid_screen = grid_screen 36 self._grass_image = Image('grass.png') 37 self._water_image = Image('water.png') 38 39 def draw(self): 40 for row in range(self._grid_screen.ROW): 41 for column in range(self._grid_screen.COL): 42 if map[row][column] == 0: 43 self._grid_screen.draw( 44 self._grass_image.image(), column, row) 45 if map[row][column] == 1: 46 self._grid_screen.draw( 47 self._water_image.image(), column, row) 48 49class Character(object): 50 def __init__(self, grid_screen, filename): 51 self._grid_screen = grid_screen 52 self._image = Image(filename, -1) 53 54 def draw(self, column, row): 55 self._grid_screen.draw(self._image.image(), column, row) 56 57 58class Game(object): 59 def __init__(self): 60 pygame.init() 61 self._grid_screen = GridScreen() 62 self._map = Map(self._grid_screen) 63 self._character = Character(self._grid_screen, 'player1.png') 64 65 def run(self): 66 while True: 67 self._map.draw() 68 self._character.draw(5, 5) 69 pygame.display.update() 70 for event in pygame.event.get(): 71 if event.type == QUIT: 72 sys.exit() 73 74if __name__ == '__main__': 75 game = Game() 76 game.run() 77```### 前提・実現したいこと 78 79オブジェクト指向の勉強を兼ねてpythonでゲームを作ろうと思っています。 80しかし、例えばスクリーンを描画するようなクラスを作ったとして、 81それをすべての関連クラスにリレーして渡していくのが少し微妙に感じています。 82 83pygameで言うと、 84screen = pygame.display.set_mode(GridScreen.SCREEN_RECT.size) 85で得られたscreenを描画関連のクラス全てにリレー(コンストラクタ引数で渡して、 86プライベートメンバに保持)していく形です。 87 881.描画に関連するクラスそのものを少なく設計すればよい、が正解なのか、 892. screenオブジェクトを必要なタイミングで渡すと何か仕事をしてくれる 90 ワーカー的なオブジェクトを用意するのが正解なのか。 91 92漠然とした質問で申し訳ありませんが、現場でオブジェクト指向されてる人は 93おおむね1で設計するものでしょうか? 94 95### 発生している問題・エラーメッセージ 96### 該当のソースコード 97こちらのサイト様のプログラムからオブジェクト化させて頂いています。 98http://aidiary.hatenablog.com/ 99 100プログラム中の「self._grid_screen」をその他クラスへいちいち渡すのが 101合っているのか、もっと良い設計があるのか・・ 102 103### 試したこと 104### 補足情報(FW/ツールのバージョンなど)
質問欄にコードを貼れますか?コードが長くなってしまうようであれば、今のクラス設計がどうなっているか概要を記載できますでしょうか?
回答3件
あなたの回答
tips
プレビュー