小学生python游戏编程arcade----时间问题及敌人角色自动发射炮弹

前言

接上篇文章继续解绍arcade游戏编程的基本知识。游戏中的时间概念很重要,下面能过一个小时钟例子及敌人角色自动发射炮弹为例进一步加深其时间印象。

时间

1、小时钟

1.1 核心点
    self.total_time += delta_time
    时间变量与update相关联
1.2 时间获取及格式输出
   取整计算//,取余%,格式输出
    #      分钟
    minutes = int(self.total_time) // 60

    # 秒
    seconds = int(self.total_time) % 60

    # 计算100秒
    seconds_100s = int((self.total_time - seconds) * 100)

    # 格式输出
    self.timer_text.text = f"{minutes:02d}:{seconds:02d}:{seconds_100s:02d}"
1.3 效果图

在这里插入图片描述
在这里插入图片描述

1.4 代码实现
    def on_update(self, delta_time):
        self.total_time += delta_time

        # 分钟
        minutes = int(self.total_time) // 60

        # 秒
        seconds = int(self.total_time) % 60

        # 计算100秒
        seconds_100s = int((self.total_time - seconds) * 100)

        # 格式输出
        self.timer_text.text = f"{minutes:02d}:{seconds:02d}:{seconds_100s:02d}"

2、子弹的自动发射

2.1计䉤器
   初始中
    self.frame_count = 0
2.2 定期发射
        # 每60帧发射一次
        if self.frame_count % 60 == 0:
    def on_update(self, delta_time):
        self.frame_count += 1

        for enemy in self.enemy_list:

            # 首先,计算与角色的角度。我们可以这样做只有当子弹发射时,但在这种情况下,我们会轮换
            # 敌人每一帧都要面对玩家,所以我们会这样做

            # 起始位置
            start_x = enemy.center_x
            start_y = enemy.center_y

            # 目标位置
            dest_x = self.player.center_x
            dest_y = self.player.center_y

            # 计算子弹行进的角度。
            x_diff = dest_x - start_x
            y_diff = dest_y - start_y
            angle = math.atan2(y_diff, x_diff)

            # 设置敌人面向角色
            enemy.angle = math.degrees(angle) - 90

            # 每60帧发射一次
            if self.frame_count % 60 == 0:
                # 利用粒子制子弹
                bullet = arcade.SpriteCircle(8,arcade.color.RED)
                bullet.center_x = start_x
                bullet.center_y = start_y

                # 设置子弹角度朝向角色
                bullet.angle = math.degrees(angle)

                # 根据角度,计算子弹的变化change_x和change_y。速度是子弹行进的速度。
                bullet.change_x = math.cos(angle) * BULLET_speed
                bullet.change_y = math.sin(angle) * BULLET_speed

                self.bullet_list.append(bullet)

        # 子弹过界处理
        for bullet in self.bullet_list:
            if bullet.top < 0:
                bullet.remove_from_sprite_lists()

        self.bullet_list.update()
2.3 效果图

在这里插入图片描述

2.4 代码实现
"""
敌人如何寻找角色方向及角色开炮"""

import arcade
import math
import os

SCREEN_width = 800
SCREEN_height = 600
SCREEN_title = "敌人自动攻击角色"
BULLET_speed = 4


class MyGame(arcade.Window):

    def __init__(self, width, height, title):
        super().__init__(width, height, title)

        file_path = os.path.dirname(os.path.abspath(__file__))
        os.chdir(file_path)

        arcade.set_background_color(arcade.color.BLACK)

        self.frame_count = 0

        self.enemy_list = None
        self.bullet_list = None
        self.player_list = None
        self.player = None

    def setup(self):
        self.enemy_list = arcade.SpriteList()
        self.bullet_list = arcade.SpriteList()
        self.player_list = arcade.SpriteList()

        # 角色
        self.player = arcade.Sprite("images/坦克.png", 0.5)
        self.player_list.append(self.player)

        # 敌人1
        enemy = arcade.Sprite("images/坦克2.png", 0.5)
        enemy.center_x = 120
        enemy.center_y = SCREEN_height - enemy.height
        enemy.angle = 180
        self.enemy_list.append(enemy)

        # 敌人2
        enemy = arcade.Sprite("images/坦克2.png", 0.5)
        enemy.center_x = SCREEN_width - 120
        enemy.center_y = SCREEN_height - enemy.height
        enemy.angle = 180
        self.enemy_list.append(enemy)

    def on_draw(self):
        self.clear()

        self.bullet_list.draw()
        self.enemy_list.draw()
        self.player_list.draw()

    def on_update(self, delta_time):
        self.frame_count += 1

        for enemy in self.enemy_list:

            # 首先,计算与角色的角度。我们可以这样做只有当子弹发射时,但在这种情况下,我们会轮换
            # 敌人每一帧都要面对玩家,所以我们会这样做

            # 起始位置
            start_x = enemy.center_x
            start_y = enemy.center_y

            # 目标位置
            dest_x = self.player.center_x
            dest_y = self.player.center_y

            # 计算子弹行进的角度。
            x_diff = dest_x - start_x
            y_diff = dest_y - start_y
            angle = math.atan2(y_diff, x_diff)

            # 设置敌人面向角色
            enemy.angle = math.degrees(angle) - 90

            # 每60帧发射一次
            if self.frame_count % 60 == 0:
                # 利用粒子制子弹
                bullet = arcade.SpriteCircle(8,arcade.color.RED)
                bullet.center_x = start_x
                bullet.center_y = start_y

                # 设置子弹角度朝向角色
                bullet.angle = math.degrees(angle)

                # 根据角度,计算子弹的变化change_x和change_y。速度是子弹行进的速度。
                bullet.change_x = math.cos(angle) * BULLET_speed
                bullet.change_y = math.sin(angle) * BULLET_speed

                self.bullet_list.append(bullet)

        # 子弹过界处理
        for bullet in self.bullet_list:
            if bullet.top < 0:
                bullet.remove_from_sprite_lists()

        self.bullet_list.update()

    def on_mouse_motion(self, x, y, delta_x, delta_y):
        """称动角色"""
        self.player.center_x = x
        self.player.center_y = y


def main():
    """ Main function """
    window = MyGame(SCREEN_width, SCREEN_height, SCREEN_title)
    window.setup()
    arcade.run()


if __name__ == "__main__":
    main()

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 41/50次。
可以关注我,点赞我、评论我、收藏我啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信息化未来

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值