Пример #1
0
class Client:

	INIT_GAME = 10
	ASSOCIATING = 20
	GAME_MODE = 30

	def __init__(self, config, window) :
		# ゲーム内データの生成
		self.config = config
		self.window = window
		self.own_data = {}
		self.game_state = self.INIT_GAME

		# 各インスタンスの生成
		self.net = NM(NM.MODE_CLIENT_SERVER, NM.ROLL_CLIENT, '127.0.0.1', 50007)
		self.keyinput = KeyInput(self.window)
		self.action = ClientAction(self.keyinput)
		self.player = ''

	def update(self):
		if self.game_state == self.INIT_GAME:
			thread = threading.Thread(target=self.net.client_open(), daemon=False)
			thread.start()
			self.game_state = self.ASSOCIATING
		elif self.game_state == self.ASSOCIATING:
			received_data = self.net.receive_data()
			# SERVER_ASSOCIATION_RESPONSE メッセージが受信できているならば
			if Event.SERVER_ASSOCIATION_RESPONSE in [d.get('msg') for d in received_data]:
				for r in received_data:
					if r['msg'] == Event.SERVER_ASSOCIATION_RESPONSE:
						self.player = Player(r['dst'])
						self.player.set_received_data(r['payload'])
						print(r['payload'])
						self.game_state = self.GAME_MODE
						break
			else:
				self.net.transmit_data(NM.DST_SERVER, Event.CLIENT_ASSOCIATION_REQUEST)
		elif self.game_state == self.GAME_MODE:
			received_data = self.net.receive_data()
			self.update_model(received_data)
					
		else:
			print(f'[LOG] Invelid state happened: {self.game_state}')


	def check_transmit_data(self, data):
		if 'move_flag' not in data: exit()

	def update_model(self, received_data):
		# アップデート順番は大事
		self.keyinput.update()
		for r in received_data:
			self.player.set_received_data(r['payload'])

		transmit_data = self.action.update()
		self.check_transmit_data(transmit_data)
		transmit_data['player_id'] = self.player.player_id # あえてActionの外でつける(いたずら阻止)
		self.net.transmit_data(NM.DST_SERVER, Event.CLIENT_SEND_GAMEDATA, transmit_data)

	def update_view(self):
		self.view.update()
		# 1000/FPS_VIEW ミリ秒間隔で再実行
		self.window.after(int(1000//VIEW_FPS), self.update_view)