小屁孩日记——The Meltdown雪球大战(2)

继续更新雪球大战系列,这次更新增加了出拳功能。不过出拳功能一直有问题,害的我改了两个晚上的BUG。最后怎么就跑起来了我也不是非常清楚,不过如果你想要进行任何‘优化’请谨慎。这次主要更新了greg.py并增加了计时器。注意1:这是一个未完成的游戏,基本没有可玩性,仅供参考。注意2:运行之前请确保你安装了pygame包。

# greg.py

import pygame
# 还有很多事情要做

class Greg:
    def __init__(self,main):
        self.main = main
        self.screen = main.screen

        # 基准图像,其他的都是用pygame.transform.rotate()
        # 所有可能用到的图像都储存在这里备用
        self.image_up = pygame.image.load('greg.bmp')
        self.image_left = pygame.transform.rotate(self.image_up,90)
        self.image_down = pygame.transform.rotate(self.image_up,180)
        self.image_right = pygame.transform.rotate(self.image_up,270)
        self.image_punch = pygame.image.load('greg_punch.bmp')

        # 当前的图像
        self.image = self.image_up
        self.rect = self.image.get_rect()

        # 当前时间(纯粹为了方便)
        self.time = 0

        # 移动速度
        self.speed = 1

        # 方向
        self.direction = 'up'

        # 是否触碰到边缘
        self.up_edge = False
        self.down_edge = False
        self.left_edge = False
        self.right_edge = False

        # 移动时必须加减self.x和self.y,否则会有Bug
        self.x = 0
        self.y = 0

        # 是否在上下左右移动
        self.move_left = False
        self.move_right = False
        self.move_up = False
        self.move_down = False

        # 暂定出拳时间一秒,冷却时间一秒
        # 是否可以出拳(已出拳时不能出拳,冷却时不能出拳)
        self.punchable = True

        # 出拳开始的时间
        self.punch_start_time = 0

        # 冷却开始时间
        self.cool_down_start_time = 0

        '''
        出拳的原理:
        按下出拳键(q键)时检查punchable是否为True,如果是则切换为出拳动画,punchable改为False,
        punch_start_time设为当前时间。然后在update_punch函数中检查punch_start_time是否不为0,如果是则切换为出拳
        动画,再检查punch_start_time是否距当前时间已有一秒,如果是则重置punch_start_time为0,
        cool_down_start_time设为当前时间,(无需退出出拳动画,其他监测语句会进行更改)。然后监测
        cool_down_start_time是距当前时间已有一秒,如果是则重置cool_down_start_time为0,并将punchable
        设为True。
        '''
        '''
        出拳部分的运行机制非常精妙,所以注释不多。看不懂没关系,因为我也不太懂。如果你想进行任何‘优化’请不要
        删除任何代码并将原版代码做好备份
        '''

    def update_edge(self):
        # 监测是否触碰到边缘
        self.left_edge = self.x <= 0
        # 要减去自身宽度,否则Greg会跑出屏幕边缘(虽然跑不远)
        self.right_edge = self.x >= self.main.screen_wide-self.image.get_width()
        self.up_edge = self.y <= 0
        self.down_edge = self.y >= self.main.screen_high-self.image.get_height()

    def update_direction(self):
         # 设置上下移动方向
        if self.move_up:
            self.direction = 'up'
        elif self.move_down:
            self.direction = 'down'
        elif self.move_left:
            self.direction = 'left'
        elif self.move_right:
            self.direction = 'right'

    def update_move(self):
        # 移动监测
        if self.move_up and not self.up_edge:
            self.y -= self.speed
            self.image = self.image_up

        elif self.move_down and not self.down_edge:
            self.y += self.speed
            self.image = self.image_down

        elif self.move_left and not self.left_edge:
            self.x -= self.speed
            self.image = self.image_left

        elif self.move_right and not self.right_edge:
            self.x += self.speed
            self.image = self.image_right

    def update_punch_image(self):
        # 调整出拳动画方向
        self.image_left = pygame.transform.rotate(self.image_up,90)
        self.image_down = pygame.transform.rotate(self.image_up,180)
        self.image_right = pygame.transform.rotate(self.image_up,270)
        if self.direction == 'down':
            self.image = self.image_down
        elif self.direction == 'left':
            self.image = self.image_left
        elif self.direction == 'right':
            self.image = self.image_right

    def udpate_punch(self):
        # 出拳部分(前面有说明)
        if self.punch_start_time != 0:
            self.update_punch_image()
            self.image_up = self.image_punch
        if self.time - self.punch_start_time >= 0.5 and self.punch_start_time != 0: 
            #                                   ^调整这个数字来设置出拳时间
            self.punch_start_time = 0
            self.cool_down_start_time = self.time
        if self.time - self.cool_down_start_time >= 0.5 and self.cool_down_start_time != 0:
            #                                       ^调整这个数字设置冷却时间
            
            self.cool_down_start_time = 0
            self.image_up = pygame.image.load('greg.bmp')
            self.punchable = True
            self.update_punch_image()
        

    def update(self):
        # 获取当前时间
        self.time = self.main.timer

        # 刷新xy
        self.rect.x = self.x
        self.rect.y = self.y

        self.update_edge()

        self.update_direction()
        self.udpate_punch()
        self.update_move()
        

        

    def blitme(self):        
        self.screen.blit(self.image, self.rect)

出拳部分的原理在代码里有较详细的说明

出拳效果
出拳效果

 

百度网盘链接:https://pan.baidu.com/s/1GqRHraaciF0cvH5mai14mA?pwd=sygm,无提取码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值