小学生python游戏编程arcade----敌人自动面向角色并开火
接上篇文章继续解绍arcade游戏编程的基本知识。今天主要解绍学习敌人如何寻找角色方向及角色开炮。
·
小学生python游戏编程arcade----敌人自动面向角色并开火
前言
接上篇文章继续解绍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次。
可以关注我,点赞我、评论我、收藏我啦。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)