質問編集履歴

5

追記

2020/05/18 22:17

投稿

ForestSeo
ForestSeo

スコア2722

test CHANGED
File without changes
test CHANGED
@@ -33,5 +33,3 @@
33
33
  ### Version
34
34
 
35
35
  Python: 3.7.7
36
-
37
- Pygame: 1.9.6

4

追記

2020/05/18 22:17

投稿

ForestSeo
ForestSeo

スコア2722

test CHANGED
@@ -1 +1 @@
1
- Pythonのインスタンスでよくわからないことがある。
1
+ Pythonのインスタンスでよくわからないことがある。
test CHANGED
File without changes

3

追記

2020/05/18 22:17

投稿

ForestSeo
ForestSeo

スコア2722

test CHANGED
@@ -1 +1 @@
1
- PygameのPingPongゲームでよくわからないことがある。
1
+ Pythonのインスタンスでよくわからないことがある。
test CHANGED
File without changes

2

追記

2020/05/18 22:17

投稿

ForestSeo
ForestSeo

スコア2722

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  b = B(a)
26
26
 
27
- # エラー
27
+ # まあエラーですよね
28
28
 
29
29
  ```classAの引数にclassBのインスタンスであるbを入れたくて、
30
30
 

1

追記

2020/05/18 22:16

投稿

ForestSeo
ForestSeo

スコア2722

test CHANGED
File without changes
test CHANGED
@@ -1,236 +1,36 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- Pythonは初心者ではない(はず)ですが、Pygameは初心者です。
4
-
5
- [こちら](https://algorithm.joho.info/programming/python/pygame/)のサイトを参考に勉強してみました。そして、PingPongゲーム的なものを作ってみたのですが...
6
-
7
- 長くてすみません。質問は一部だけなのでどうかお読ください
3
+ 回答が得られかったので質問を変えてました(簡潔に)
8
4
 
9
5
  ```Python
10
6
 
11
- # -*- coding: utf-8 -*-
7
+ class A():
12
8
 
13
- import sys, time, itertools
9
+ def __init__(self, b):
14
10
 
15
- from pygame.locals import *
16
-
17
- import pygame.mixer
11
+ ・・・
18
12
 
19
13
 
20
14
 
21
- def close():
15
+ class B():
22
16
 
23
- pygame.quit()
17
+ def __init__(self, a):
24
18
 
25
- sys.exit()
19
+ ・・・
26
20
 
27
21
 
28
22
 
29
- tpl = (0, 0, 900, 600)
23
+ a = A(b)
30
24
 
31
- base = Rect(tpl)
25
+ b = B(a)
32
26
 
33
- cntr = Rect(tuple(map(lambda num: num/2, tpl))) # 全て割る2
27
+ # エラー
34
28
 
35
- bar_rect = Rect(0, 0, 11, 83)
29
+ ```classAの引数にclassBのインスタンスであるbを入れたくて、
36
30
 
31
+ classBの引数にはclassAのインスタンスであるaを入れたい。
37
32
 
38
-
39
- class HmnBar(pygame.sprite.Sprite):
40
-
41
- def __init__(self):
42
-
43
- pygame.sprite.Sprite.__init__(self, self.containers)
44
-
45
- self.image = pygame.image.load("img/bar.png").convert()
46
-
47
- self.rect = self.image.get_rect()
48
-
49
- self.rect.right = base.right - 20 # バーのx座標固定
50
-
51
- def update(self):
52
-
53
- self.rect.centery = pygame.mouse.get_pos()[1]
54
-
55
- self.rect.clamp_ip(base)
56
-
57
-
58
-
59
- class CpuBar(pygame.sprite.Sprite):
60
-
61
- def __init__(self, ball):
62
-
63
- pygame.sprite.Sprite.__init__(self, self.containers)
64
-
65
- self.image = pygame.image.load("img/bar.png").convert()
66
-
67
- self.rect = self.image.get_rect()
68
-
69
- self.rect.left = 20 # バーのx座標固定
70
-
71
- self.ball = ball
72
-
73
- def update(self):
74
-
75
- self.rect.centery = self.ball.centery
76
-
77
- self.rect.clamp_ip(base)
78
-
79
-
80
-
81
- class Ball(pygame.sprite.Sprite):
82
-
83
- def __init__(self, speed, hmn, cpu):
84
-
85
- pygame.sprite.Sprite.__init__(self, self.containers)
86
-
87
- self.image = pygame.image.load("img/tennis.png").convert()
88
-
89
- self.rect = self.image.get_rect()
90
-
91
- self.sx, self.sy = speed
92
-
93
- self.hmn, self.cpu = hmn, cpu
94
-
95
- def update(self):
96
-
97
- # cpuのバーの反射
98
-
99
- if self.rect.left <= 20 + bar_rect.width:
100
-
101
- if self.cpu.rect.top < self.rect.centery < self.cpu.rect.bottom:
102
-
103
- self.sx *= -1
104
-
105
- else:
106
-
107
- self.rect.centerx, self.rect.centery = cntr.size
108
-
109
- # hmnのバーの反射
110
-
111
- if base.width - (20 + bar_rect.width) <= self.rect.right:
112
-
113
- if self.hmn.rect.top < self.rect.centery < self.hmn.rect.bottom:
114
-
115
- self.sx *= -1
116
-
117
- else:
118
-
119
- self.rect.centerx, self.rect.centery = cntr.size
120
-
121
- # 上下壁反射
122
-
123
- if self.rect.top <= 0 or base.height <= self.rect.bottom:
124
-
125
- self.sy *= -1
126
-
127
- self.rect.centerx += self.sx
128
-
129
- self.rect.centery += self.sy
130
-
131
- self.rect.clamp_ip(base)
132
-
133
-
134
-
135
- start = time.time()
136
-
137
- def main():
138
-
139
- # Pygameの設定
140
-
141
- pygame.init()
142
-
143
- screen = pygame.display.set_mode(base.size)
144
-
145
- font = pygame.font.SysFont(None, 30)
146
-
147
- # 初期数値
148
-
149
- ball_sx, ball_sy = 4, 7
150
-
151
- cpu_sy = 7
152
-
153
- # スプライトグループ作成、追加
154
-
155
- group = pygame.sprite.RenderUpdates()
156
-
157
- HmnBar.containers = group
158
-
159
- CpuBar.containers = group
160
-
161
- Ball.containers = group
162
-
163
-
164
-
165
- hmn = HmnBar()
166
-
167
- "質問の部分はここ"
168
-
169
- cpu = CpuBar(ball)
170
-
171
- ball = Ball((ball_sx, ball_sy), hmn, cpu)
172
-
173
-
174
-
175
- clock = pygame.time.Clock()
176
-
177
- while True:
178
-
179
- clock.tick(60) # 60fps
180
-
181
- screen.fill((90, 90, 90)) # 灰色に塗りつぶし
182
-
183
- text = font.render(str(round(time.time() - start, 2)), True, (255, 255, 255)) # カウント
184
-
185
- screen.blit(text, [cntr.width - 20, 20])
186
-
187
- pygame.draw.line(screen,(255, 255, 255), (cntr.width, 45), (cntr.width, base.height - 20), 5) # 中央線
188
-
189
-
190
-
191
- group.update() # groupをアップデート
192
-
193
- group.draw(screen) # グループを描画
194
-
195
- # イベント
196
-
197
- for event in pygame.event.get():
198
-
199
- if event.type == QUIT:
200
-
201
- close()
202
-
203
- if event.type == KEYDOWN and event.key == K_ESCAPE:
204
-
205
- close()
206
-
207
- # 更新
208
-
209
- pygame.display.update()
210
-
211
-
212
-
213
- if __name__ == "__main__":
214
-
215
- main()
216
-
217
-
218
-
219
- ```このコードの、"質問の部分はここ" の下の
220
-
221
- ```
222
-
223
- cpu = CpuBar(ball)
224
-
225
- ball = Ball((ball_sx, ball_sy), hmn, cpu)
226
-
227
- ```この部分で、cpuとballの情報を交互に入れようとしています。
228
-
229
- もちろんこのままではエラーになります。なぜ交互に入れたいかと言うと、
230
-
231
- ballはcpuのバーのy座標で跳ね返るか、アウトかが分かりますし、cpuはballのy座標についていくことで、自動操縦ができるのです。人間がバーにあてられなかった場合、ボールは真ん中から出てくるので、cpuの動きは一定ではありません。ちなみに自動操縦なしだとちゃんと動きます。不明点がありましたら追記・修正でコメントをください。
232
-
233
- ### バージョン
33
+ ### Version
234
34
 
235
35
  Python: 3.7.7
236
36