【植物大战僵尸】阳光重构

一、介绍与演示

由于之前将阳光放在向日葵中管理,向日葵消失阳光消失,显然不合理,阳光任然会存在于场上,所以需要设计一个game.py来管理场地上的阳光。

二、代码详解

main.py


import pygame  # 导入pygame游戏开发库
import sys  # 导入系统模块用于退出程序
from pygame.locals import *  # 导入pygame的常量(如事件类型)Quit
from const import *
from game import *

pygame.init()  # 初始化pygame所有模块,确保各个模块正常运行

DS = pygame.display.set_mode( GAME_SIZE )  # 创建1280x600像素的显示窗口,DS为显示表面对象
game=Game(DS)
while True:
    for event in pygame.event.get():#等待操作系统抛出事件
        if event.type == QUIT:  # 如果检测到退出事件(如点击关闭按钮)
            pygame.quit()       # 关闭pygame模块
            sys.exit()         # 终止Python程序
            #R     G     B
    game.update()  
    DS.fill( (255, 255, 255) )  # 用纯白色填充整个屏幕
    game.draw() 
    pygame.display.update()     # 更新画面显示(将绘制内容刷新到屏幕)

sunflower.py

import objectbase
from const import *
import sunlight
class SunFlower(objectbase.ObjectBase):
        def __init__(self, id , pos):
            super(SunFlower,self).__init__(
                id,
                pos
            )
            self.hasSunlight=False #是否可以产生阳光

        #是否需要生成召唤物
        def hasSummon(self):
            return self.hasSunlight


        #是否可以产生阳光
        def preSummon(self):
           self.hasSunlight=True
        
        #生成召唤物
        def doSummon(self):
            if self.hasSummon():#需要生成召唤物
                self.hasSunlight=False
                return sunlight.SunLight(2,(self.pos[0]+20,self.pos[1]-10))

        
     

objectbase.py

import image
import time
import data_object #导入数据对象模块,包含图片路径、索引等信息
from const import *
class ObjectBase(image.Image):
    """
    ObjectBase类是一个游戏对象的基类,继承自image.Image类。
    它用于表示游戏中的各种对象,并提供了一些基本的属性和方法。
    """
    def __init__(self, id , pos):
        self.id = id 
        self.preIndexTime=0 # 上一次改变帧的时间
        self.prePositionTime=0 #上一次改变位置的时间
        self.preSummonTime=0 #上一次生成召唤物的时间
        super(ObjectBase,self).__init__(
            self.getData()['PATH'],
            0, 
            pos,
            self.getData()['SIZE'],
            self.getData()['IMAGE_INDEX_MAX']
            )  # 调用父类构造函数初始化图片属性

    def getSummonCD(self):
        #获取召唤物生成时间间隔
        return self.getData()['SUMMON_CD']
    
    def getSpeed(self):
        #获取速度
        return self.getData()['SPEED']
    def getData(self):
        #获取数据对象
        return data_object.data[self.id]

    def getPositionCD(self):
        return self.getData()['POSITION_CD']
    
    def getImageIndexCD(self):
        return self.getData()['IMAGE_INDEX_CD']

    def update(self):
        self.checkSummon()
        self.checkImageIndex() #帧动画实现
        self.checkPosition() #平移实现
    
    #实现图片的帧动画
    def checkImageIndex(self):
        if time.time()-self.preIndexTime<self.getImageIndexCD():
            return
        self.preIndexTime=time.time()

        idx=self.pathIndex+1
        if idx>=self.pathIndexMax:
            idx=0
        self.updateIndex(idx)

    #实现平移
    def checkPosition(self):
        if time.time()-self.prePositionTime<self.getPositionCD():
            return False
        self.prePositionTime=time.time()
        speed=self.getSpeed()
        self.pos=(self.pos[0]+speed[0],self.pos[1]+speed[1])
        return True
    
    #实现召唤物的生成 
    def checkSummon(self):
        if time.time()-self.preSummonTime<self.getSummonCD():
            return 
        self.preSummonTime=time.time()
        self.preSummon()

    def preSummon(self):
        pass
    

    def hasSummon(self):
        pass

    def doSummon(self):
        pass

game.py

import image
import sunflower
from const import *

class Game(object):
    def __init__(self, ds):
        self.ds=ds
        self.back=image.Image(PATH_BACK,0,(0,0),GAME_SIZE,0)  # 背景图片
        self.plants=[]
        self.summons=[]
        #全屏种植
        for i in range(GRID_COUNT[0]):
            for j in range(GRID_COUNT[1]):
                pos=(LEFT_TOP[0]+i*GRID_SIZE[0],LEFT_TOP[1]+j*GRID_SIZE[1])
                sf=sunflower.SunFlower(3,pos) #向日葵图片
                self.plants.append(sf)

    #绘制游戏界面
    def draw(self):
        self.back.draw(self.ds)  # 绘制背景图片
        for plant in self.plants:
            plant.draw(self.ds)
        for summon in self.summons:
            summon.draw(self.ds)
    
    #更新显示
    def update(self):
        self.back.update()
        for plant in self.plants:
            plant.update()
            #检查植物是否有召唤物生成
            if plant.hasSummon():
                summ=plant.doSummon()# 生成召唤物
                self.summons.append(summ)#  将召唤物添加到game的列表中
        for summon in self.summons:
            summon.update()

Tips:

  • 要注意实现逻辑,阳光在向日葵上方,绘制时要先绘制向日葵,在绘制阳光
  • 向日葵类中负责传递生成阳光类的信号,game中实现收到信号后实现阳光生产。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值