(小白)尝试用Visual Studio梳理python《植物大战僵尸》源码004 20200923

(小白)尝试用Visual Studio梳理python《植物大战僵尸》源码004 20200923

相关配置

Visual Studio:1.46.1
python:3.8
源码地址:WX:amdy-liuhao 备注:植物大战僵尸

  1. 现在主要的问题是找主界面哪来的,看了一圈,没找到,转用笨办法,print()
  2. 先从tool开始
print("source.tool.state.__init__")
print("source.tool.state.startup")
print("source.tool.state.cleanup")
print("source.tool.state.update")
print("source.tool.Control.__init__")
print("source.tool.Control.setup_states")
print("source.tool.Control.update")
print("source.tool.Control.flip_state")
print("source.tool.Control.event_loop")
print("source.tool.Control.main")
print("source.tool.get_image")
print("source.tool.load_all_gfx")
print("source.tool.loadZombieImageRect")
print("source.tool.loadPlantImageRect")

tool里的反馈如下:

source.tool.load_all_gfx
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.load_image_frames
source.tool.loadZombieImageRect
source.tool.loadPlantImageRect
source.tool.Control.__init__
source.tool.state.__init__
source.tool.state.__init__
source.tool.state.__init__
source.tool.state.__init__
source.tool.Control.setup_states
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.Control.main
source.tool.Control.event_loop
source.tool.Control.update
source.tool.Control.event_loop
source.tool.Control.update
……(此处重复!)
game over
  1. 试着点击开始按钮,看看结果是什么:
pos: (568, 145)  mouse: [1, 0]
source.tool.Control.flip_state
source.tool.state.cleanup
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image
source.tool.get_image

可以看到 pos: (568, 145) mouse: [1, 0]
点击事件显示了位置和鼠标情况,tool里的方法

def event_loop(self):
        #print("source.tool.Control.event_loop") 此处会重复执行
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.done = True
            elif event.type == pg.KEYDOWN:
                self.keys = pg.key.get_pressed()
            elif event.type == pg.KEYUP:
                self.keys = pg.key.get_pressed()
            elif event.type == pg.MOUSEBUTTONDOWN:
                self.mouse_pos = pg.mouse.get_pos()
                self.mouse_click[0], _, self.mouse_click[1] = pg.mouse.get_pressed()
                print('pos:', self.mouse_pos, ' mouse:', self.mouse_click)

这里关键的是有mouse_click[0]和mouse_click[1]以及mouse_pos

  1. flip_state
    发现这个功能在update()中
def update(self):
        #print("source.tool.Control.update") 此处会重复执行
        self.current_time = pg.time.get_ticks()
        if self.state.done:
            self.flip_state()
        self.state.update(self.screen, self.current_time, self.mouse_pos, self.mouse_click)
        self.mouse_pos = None
        self.mouse_click[0] = False
        self.mouse_click[1] = False

这里state.done为真时执行self.flip_state()
先确定上一步,在单机的时候,怎么影响到的state.done

  1. 查询state.done
    结果如下:
    在这里插入图片描述
    如上图,将state设置为True的地方有tool,level,mainmenu,screen
    其中tool:
if event.type == pg.QUIT:
                print("pg.QUIT")
                self.done = True

其次level

def checkGameState(self):
		print("level.checkGameState")
        if self.checkVictory():
            self.game_info[c.LEVEL_NUM] += 1
            self.next = c.GAME_VICTORY
            self.done = True
        elif self.checkLose():
            self.next = c.GAME_LOSE
            self.done = True

这个应该是判断输赢的

然后是mainmenu:

def update(self, surface, current_time, mouse_pos, mouse_click):
        print("mainmenu.update")
        self.current_time = self.game_info[c.CURRENT_TIME] = current_time
        
        if not self.option_clicked:
            if mouse_pos:
                self.checkOptionClick(mouse_pos)
        else:
            if(self.current_time - self.option_timer) > 200:
                self.option_frame_index += 1
                if self.option_frame_index >= 2:
                    self.option_frame_index = 0
                self.option_timer = self.current_time
                self.option_image = self.option_frames[self.option_frame_index]
            if(self.current_time - self.option_start) > 1300:
                self.done = True

        surface.blit(self.bg_image, self.bg_rect)
        surface.blit(self.option_image, self.option_rect)
  1. 再执行,此时发现mainmenu.update()是一直在更新的:
    再往前找,mainmenu.update是怎么执行的
__author__ = 'marble_xu'

from . import tool
from . import constants as c
from .state import mainmenu, screen, level

def main():
    game = tool.Control()
    state_dict = {c.MAIN_MENU: mainmenu.Menu(),
                  c.GAME_VICTORY: screen.GameVictoryScreen(),
                  c.GAME_LOSE: screen.GameLoseScreen(),
                  c.LEVEL: level.Level()}
    game.setup_states(state_dict, c.MAIN_MENU)
    game.main()

发现这里的mainmenu.Menu()执行了这个功能

  1. 往下分析
 if(self.current_time - self.option_timer) > 200:
                self.option_frame_index += 1
                if self.option_frame_index >= 2:
                    self.option_frame_index = 0
                self.option_timer = self.current_time
                self.option_image = self.option_frames[self.option_frame_index]
            if(self.current_time - self.option_start) > 1300:
                self.done = True

间隔时间是200,如果不是连续点击,且点击之后会改变frame_index
self.option_image = self.option_frames[self.option_frame_index]

  1. 具体看option_frames
def setupOption(self):
        self.option_frames = []
        frame_names = [c.OPTION_ADVENTURE + '_0', c.OPTION_ADVENTURE + '_1']
        frame_rect = [0, 0, 165, 77]
        
        for name in frame_names:
            self.option_frames.append(tool.get_image(tool.GFX[name], *frame_rect, c.BLACK, 1.7))
        
        self.option_frame_index = 0
        self.option_image = self.option_frames[self.option_frame_index]
        self.option_rect = self.option_image.get_rect()
        self.option_rect.x = 435
        self.option_rect.y = 75
        
        self.option_start = 0
        self.option_timer = 0
        self.option_clicked = False

发现这里应该是对图片进行了设置 ,使其进行了闪烁
对应的图片应该是:Adventure_0,Adventure_1

  1. 查看了下,确实是两张图片:
    在这里插入图片描述
    在这里插入图片描述
    相应的,我们可以去找找背景图对应的代码在哪儿
    在这里插入图片描述
    图片是MainMenu.png
    在constants.py里
MAIN_MENU_IMAGE = 'MainMenu'
  1. 尝试查找MAIN_MENU_IMAGE
    在mainmunu中:
def setupBackground(self):
        frame_rect = [80, 0, 800, 600]
        self.bg_image = tool.get_image(tool.GFX[c.MAIN_MENU_IMAGE], *frame_rect)
        self.bg_rect = self.bg_image.get_rect()
        self.bg_rect.x = 0
        self.bg_rect.y = 0

这里是把图片变成了背景

  1. 看看setupBackground在哪儿执行的
def startup(self, current_time, persist):
        self.next = c.LEVEL
        self.persist = persist
        self.game_info = persist
        
        self.setupBackground()
        self.setupOption()

发现在startup中

  1. startup在哪执行
    mainmenu中没有,看看是不是被调用的时候引用了

这是把所有文件都找了,也没找到哪里引用了,只是他们都来自tool,所以在tool里的@abstractmethod,需要好好再了解一下。

  1. @abstractmethod
    单词的意思是抽象方法:
    度娘给的:
    https://www.cnblogs.com/baxianhua/p/10876181.html
    不够详细

换了一些,发现也只是抽象方法的意思,如果继承了不重写,就会报错,所以还是有问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值