一、介绍与演示
由于之前将阳光放在向日葵中管理,向日葵消失阳光消失,显然不合理,阳光任然会存在于场上,所以需要设计一个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中实现收到信号后实现阳光生产。