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

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

    • 前言
    • 时间
      • 1、小时钟
        • 1.1 核心点
        • 1.2 时间获取及格式输出
        • 1.3 效果图
        • 1.4 代码实现
      • 2、子弹的自动发射
        • 2.1计䉤器
        • 2.2 定期发射
        • 2.3 效果图
        • 2.4 代码实现
    • 源码获取

前言

接上篇文章继续解绍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 效果图

小学生python游戏编程arcade----时间问题及敌人角色自动发射炮弹_第1张图片
小学生python游戏编程arcade----时间问题及敌人角色自动发射炮弹_第2张图片

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 效果图

小学生python游戏编程arcade----时间问题及敌人角色自动发射炮弹_第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次。
可以关注我,点赞我、评论我、收藏我啦。

你可能感兴趣的:(助孩成长,python,python,游戏,开发语言)