前言

接上篇文章继续解绍arcade游戏编程的基本知识。今天主要解绍学习敌人如何寻找角色方向及角色开炮

敌人自动攻击角色的实现

1、

1.1 计算角度,使用敌人面向角色
        # 起始位置
        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
1.2 自动生成各色子弹,不是通过调用图片
            # 利用粒子制子弹
            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
1.3 控制敌机子弹间隔发射

初始时:
self.frame_count = 0
更新时:
def on_update(self, delta_time):
self.frame_count += 1

        # 每60帧发射一次
        if self.frame_count % 60 == 0:
1.4 效果图

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

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

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()

源码获取

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

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐