小学生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次。
可以关注我,点赞我、评论我、收藏我啦。