teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コードをみやすくした・・はず

2018/10/05 11:21

投稿

websoler
websoler

スコア39

title CHANGED
File without changes
body CHANGED
@@ -1,29 +1,4 @@
1
- ### 前提・実現したいこと
2
-
3
- オブジェクト指向の勉強を兼ねてpythonでゲームを作ろうと思っています。
4
- しかし、例えばスクリーンを描画するようなクラスを作ったとして、
5
- それをすべての関連クラスにリレーして渡していくのが少し微妙に感じています。
6
-
7
- pygameで言うと、
1
+ ```python
8
- screen = pygame.display.set_mode(GridScreen.SCREEN_RECT.size)
9
- で得られたscreenを描画関連のクラス全てにリレー(コンストラクタ引数で渡して、
10
- プライベートメンバに保持)していく形です。
11
-
12
- 1.描画に関連するクラスそのものを少なく設計すればよい、が正解なのか、
13
- 2. screenオブジェクトを必要なタイミングで渡すと何か仕事をしてくれる
14
- ワーカー的なオブジェクトを用意するのが正解なのか。
15
-
16
- 漠然とした質問で申し訳ありませんが、現場でオブジェクト指向されてる人は
17
- おおむね1で設計するものでしょうか?
18
-
19
- ### 発生している問題・エラーメッセージ
20
- ### 該当のソースコード
21
- こちらのサイト様のプログラムからオブジェクト化させて頂いています。
22
- http://aidiary.hatenablog.com/
23
-
24
- プログラム中の「self._grid_screen」をその他クラスへいちいち渡すのが
25
- 合っているのか、もっと良い設計があるのか・・
26
-
27
2
  class GridScreen(object):
28
3
  SCREEN_RECT = Rect(0, 0, 640, 480)
29
4
  ROW, COL = 15, 20
@@ -100,5 +75,31 @@
100
75
  if __name__ == '__main__':
101
76
  game = Game()
102
77
  game.run()
78
+ ```### 前提・実現したいこと
79
+
80
+ オブジェクト指向の勉強を兼ねてpythonでゲームを作ろうと思っています。
81
+ しかし、例えばスクリーンを描画するようなクラスを作ったとして、
82
+ それをすべての関連クラスにリレーして渡していくのが少し微妙に感じています。
83
+
84
+ pygameで言うと、
85
+ screen = pygame.display.set_mode(GridScreen.SCREEN_RECT.size)
86
+ で得られたscreenを描画関連のクラス全てにリレー(コンストラクタ引数で渡して、
87
+ プライベートメンバに保持)していく形です。
88
+
89
+ 1.描画に関連するクラスそのものを少なく設計すればよい、が正解なのか、
90
+ 2. screenオブジェクトを必要なタイミングで渡すと何か仕事をしてくれる
91
+ ワーカー的なオブジェクトを用意するのが正解なのか。
92
+
93
+ 漠然とした質問で申し訳ありませんが、現場でオブジェクト指向されてる人は
94
+ おおむね1で設計するものでしょうか?
95
+
96
+ ### 発生している問題・エラーメッセージ
97
+ ### 該当のソースコード
98
+ こちらのサイト様のプログラムからオブジェクト化させて頂いています。
99
+ http://aidiary.hatenablog.com/
100
+
101
+ プログラム中の「self._grid_screen」をその他クラスへいちいち渡すのが
102
+ 合っているのか、もっと良い設計があるのか・・
103
+
103
104
  ### 試したこと
104
105
  ### 補足情報(FW/ツールのバージョンなど)

2

コードを追記しました

2018/10/05 11:21

投稿

websoler
websoler

スコア39

title CHANGED
@@ -1,1 +1,1 @@
1
- オブジェクト指向で必ず必要なリソースの受け渡しにつ
1
+ オブジェクト指向で必ず必要なリソースの受け渡しの好まし設計パターンを知りたい
body CHANGED
@@ -18,5 +18,87 @@
18
18
 
19
19
  ### 発生している問題・エラーメッセージ
20
20
  ### 該当のソースコード
21
+ こちらのサイト様のプログラムからオブジェクト化させて頂いています。
22
+ http://aidiary.hatenablog.com/
23
+
24
+ プログラム中の「self._grid_screen」をその他クラスへいちいち渡すのが
25
+ 合っているのか、もっと良い設計があるのか・・
26
+
27
+ class GridScreen(object):
28
+ SCREEN_RECT = Rect(0, 0, 640, 480)
29
+ ROW, COL = 15, 20
30
+ GRID_SIZE = 32
31
+
32
+ def __init__(self):
33
+ self._screen = pygame.display.set_mode(GridScreen.SCREEN_RECT.size)
34
+ pygame.display.set_caption('test')
35
+
36
+ def draw(self, image, column, row):
37
+ self._screen.blit(
38
+ image,
39
+ (column * GridScreen.GRID_SIZE,
40
+ row * GridScreen.GRID_SIZE))
41
+
42
+ class Image(object):
43
+ def __init__(self, filename, colorkey=None):
44
+ filename = os.path.join("data", filename)
45
+ try:
46
+ self._image = pygame.image.load(filename)
47
+ self._image = self._image.convert()
48
+ except pygame.error:
49
+ print('failed to load image = {}'.format(filename))
50
+ raise
51
+
52
+ if colorkey is not None:
53
+ if colorkey is -1:
54
+ colorkey = self._image.get_at((0, 0))
55
+ self._image.set_colorkey(colorkey, RLEACCEL)
56
+
57
+ def image(self):
58
+ return self._image
59
+ class Map(object):
60
+ def __init__(self, grid_screen):
61
+ self._grid_screen = grid_screen
62
+ self._grass_image = Image('grass.png')
63
+ self._water_image = Image('water.png')
64
+
65
+ def draw(self):
66
+ for row in range(self._grid_screen.ROW):
67
+ for column in range(self._grid_screen.COL):
68
+ if map[row][column] == 0:
69
+ self._grid_screen.draw(
70
+ self._grass_image.image(), column, row)
71
+ if map[row][column] == 1:
72
+ self._grid_screen.draw(
73
+ self._water_image.image(), column, row)
74
+
75
+ class Character(object):
76
+ def __init__(self, grid_screen, filename):
77
+ self._grid_screen = grid_screen
78
+ self._image = Image(filename, -1)
79
+
80
+ def draw(self, column, row):
81
+ self._grid_screen.draw(self._image.image(), column, row)
82
+
83
+
84
+ class Game(object):
85
+ def __init__(self):
86
+ pygame.init()
87
+ self._grid_screen = GridScreen()
88
+ self._map = Map(self._grid_screen)
89
+ self._character = Character(self._grid_screen, 'player1.png')
90
+
91
+ def run(self):
92
+ while True:
93
+ self._map.draw()
94
+ self._character.draw(5, 5)
95
+ pygame.display.update()
96
+ for event in pygame.event.get():
97
+ if event.type == QUIT:
98
+ sys.exit()
99
+
100
+ if __name__ == '__main__':
101
+ game = Game()
102
+ game.run()
21
103
  ### 試したこと
22
104
  ### 補足情報(FW/ツールのバージョンなど)

1

誤字修正

2018/10/05 11:17

投稿

websoler
websoler

スコア39

title CHANGED
@@ -1,1 +1,1 @@
1
- オブジェクト指向について
1
+ オブジェクト指向で必ず必要なリソースの受け渡しについて
body CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  pygameで言うと、
8
8
  screen = pygame.display.set_mode(GridScreen.SCREEN_RECT.size)
9
- で得られたscreenを描画関連のクラス全てにリレー(クラスインスタンスで渡して、
9
+ で得られたscreenを描画関連のクラス全てにリレー(コンストラク引数で渡して、
10
10
  プライベートメンバに保持)していく形です。
11
11
 
12
12
  1.描画に関連するクラスそのものを少なく設計すればよい、が正解なのか、