class MainApp: def __init__(self): self.__root = root = Tk() root.title("飞机大战(达内科技)") from skycanvas import SkyCanvas #F画布 self.__canvas = canvas = SkyCanvas(root, width=480, height=654) canvas.pack() # 处理按键事件和鼠标事件 from gamelist import EventList # 创建能够接收控制事件的列表 (pause_button, hero_plane, self.__event_list = event_list = EventList() # 创建能够接收控制事件的列表 root.bind('<Key>', lambda event: event_list.on_key_down(event)) root.bind('<KeyRelease>', lambda event: event_list.on_key_up(event)) root.bind('<Button>', lambda event: event_list.on_mouse_down(event)) root.bind('<Motion>', lambda event: event_list.on_mouse_move(event)) root.bind('<ButtonRelease>', lambda event: event_list.on_mouse_up(event)) # 创建游戏中能接收定时器事5件的列表 from gamelist import TimerList self.__timer_list = time_list = TimerList() self.__timer_interval = 40 # 设定刷新时间为40ms self.__tick_count = 0 # 创建敌方武器对象列表 from gamelist import GameList self.__enemy_list = GameList() # 创建游戏方的武器对象列表 # self.player_list = GameList() self.create_backgound() self.__life_count = 3 # 生命数 # 创建飞机个数的图标 from planes_label import PlaneLabel self.__plane_label = PlaneLabel(canvas, count=self.__life_count) self.create_new_hero() # 创建得分标签: from score_label import ScoreLabel self.__score_label = ScoreLabel(canvas) self.__score = 0 # 创建暂停按钮 from pause_button import PauseButton self.__pause_btn = PauseButton(canvas, callback=self.pause_game) self.__event_list.append(self.__pause_btn) from enemy_plane import EnemyPlane1, EnemyPlane2, EnemyPlane3, EnemyPlane1_2 self.__random_list = [EnemyPlane1] * 10 + \ [EnemyPlane2] * 3 + [EnemyPlane3] + [EnemyPlane1_2] * 2 self.__min_list_len = len(self.__random_list) self.__random_list.extend([None] * 500) # self.__random_list = [EnemyPlane1] * 10 + [EnemyPlane2] * 3 + [EnemyPlane3] + [None] * 10 from startwindow import StartWindow self.__start_window = start_window = StartWindow( canvas, start_callback=self.start_game, destroy=self.destroy_object) event_list.append(start_window) def create_backgound(self): from background import Background self.__background = background = Background(self.__canvas) self.__timer_list.append(background) def on_timer(self): # 再次启动定时器 self.timer_id = self.__canvas.after( self.__timer_interval, self.on_timer) # 让定时器重复启动 self.on_timer_tick() self.__tick_count += 1 if self.__tick_count == 25: self.__tick_count = 0 self.on_timer_second() def start_timer(self): # print("已启动定时器") self.timer_id = self.__canvas.after( self.__timer_interval, self.on_timer) def on_timer_tick(self): '''定时器触发时调用此方法''' # 刷新背景图 if self.__timer_list.on_timer(): return # 随机生成敌机 self.random_enemys() # 检测飞机得分及飞机是否飞机被摧毁 #if self.__hero_plane: # score = self.__hero_plane.check_attack( # self.__enemy_list.get_objs()) # self.increase_score(score) # Fred: What would happen when random list > list_len? def on_timer_second(self): '''定时器每秒钟调用一次此方法''' if len(self.__random_list) > self.__min_list_len: self.__random_list.pop() def start_game(self): self.__timer_list.append(self.__start_window) self.__event_list.remove(self.__start_window) del self.__start_window # ?????????????????????????????? self.start_timer() def pause_game(self): # print("游戏已暂暂停....") self.stop_timer() from resume_widget import ResumeWidet self.resume_widget = ResumeWidet( self.__canvas, resume_cb=self.begin_resume_game, destroy_cb=self.resume_game) self.__event_list.append(self.resume_widget) def begin_resume_game(self): '''开始恢复游戏进入恢复倒计时''' # print("游戏开始恢复!!!!!") self.__event_list.remove(self.resume_widget) self.__timer_list.append_head(self.resume_widget) self.start_timer() pass def resume_game(self): '''已恢复,正式开战''' # print("游戏已恢复!!!!!") self.__timer_list.remove(self.resume_widget) del self.resume_widget def __del__(self): self.stop_timer() def stop_timer(self): self.__canvas.after_cancel(self.timer_id) # 取消定时器 # print("定时器已取消!") def destroy_object(self, obj): """删除对象""" self.__timer_list.remove(obj) self.__event_list.remove(obj) self.__enemy_list.remove(obj) def create_new_hero(self): from heroplane import HeroPlane self.__hero_plane = hero_plane = HeroPlane( self.__canvas, destroy_cb=self.hero_crush) self.__event_list.append(hero_plane) self.__timer_list.append(hero_plane) self.__life_count -= 1 self.__plane_label.set_count(self.__life_count) def hero_crush(self, obj): '''飞机坠落''' # print('''飞机坠落''') self.destroy_object(self.__hero_plane) self.__hero_plane = None if self.__life_count > 0: self.create_new_hero() # print("剩余生命数为:", self.__life_count) else: self.game_over() def random_enemys(self): plane = random.choice(self.__random_list) if plane: ep = plane(self.__canvas, destroy_cb=self.destroy_object) self.__timer_list.append(ep) self.__enemy_list.append(ep) def run(self): # 进入主事件循环 self.__root.mainloop()