小学生python游戏编程arcade----可旋转的坦克

前言

接上篇文章继续解绍arcade游戏编程的基本知识。角色的旋转射击,如坦克可以键盘控制旋转的方向及按角度前进与后退

小学生python游戏编程arcade----可旋转的坦克

1、可旋转的坦克

1.1 炮台朝向问题,坦克图片的加载,注意事项

在这里插入图片描述

在这里插入图片描述
精灵类的基本角度,是以朝上为0的,如调用第一种图片,会出现很奇怪的角度前进方向,可自己试试,通过初始设置为# self.player_sprite.angle=0或90都不可以成功的。

1.2坦克初始代码
    # 角色初始,图片正上方的角度为0
    self.score = 0
    self.player_sprite = ShipSprite("images/坦克.png", 1)
    self.player_sprite_list.append(self.player_sprite)
    self.lives = 3
1.3 键盘左右控制旋转角度
def on_key_press(self, symbol, modifiers):

    if symbol == arcade.key.LEFT:
        self.player_sprite.change_angle = 3
    elif symbol == arcade.key.RIGHT:
        self.player_sprite.change_angle = -3
        
 def on_key_release(self, symbol, modifiers):

    if symbol == arcade.key.LEFT:
        self.player_sprite.change_angle = 0
    elif symbol == arcade.key.RIGHT:
        self.player_sprite.change_angle = 0  

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

1.4 上下键按坦克目前方向前进与后退
1.4.1 设置坦克的基本信息
def __init__(self, filename, scale):
    # 调用图片
    super().__init__(filename, scale)

    # 前进的信息
    # 角度自动从父类传入。
    self.thrust = 0  # 前进动力,一直按键时,前进动力的增加
    self.speed = 0  # 速度
    self.max_speed = 4  # 最大速度,防止一直增加
    self.drag = 0.05  # 摩擦力
1.4.2 通过 上下键控制坦克的动力增减
def on_key_press(self, symbol, modifiers):

    if symbol == arcade.key.LEFT:


elif symbol == arcade.key.UP:
self.player_sprite.thrust = 0.15
elif symbol == arcade.key.DOWN:
self.player_sprite.thrust = -.2
def on_key_release(self, symbol, modifiers):

elif symbol == arcade.key.UP:
self.player_sprite.thrust = 0
elif symbol == arcade.key.DOWN:.
self.player_sprite.thrust = 0

1.4.3 对精灵类的update进行修改

核心代码:self.change_x = -math.sin(math.radians(self.angle)) * self.speed
self.change_y = math.cos(math.radians(self.angle)) * self.speed

    def update(self):
        if self.speed > 0:
            self.speed -= self.drag
            if self.speed < 0:
                self.speed = 0

        if self.speed < 0:
            self.speed += self.drag
            if self.speed > 0:
                self.speed = 0

        self.speed += self.thrust
        if self.speed > self.max_speed:
            self.speed = self.max_speed
        if self.speed < -self.max_speed:
            self.speed = -self.max_speed

        self.change_x = -math.sin(math.radians(self.angle)) * self.speed
        self.change_y = math.cos(math.radians(self.angle)) * self.speed

        self.center_x += self.change_x
        self.center_y += self.change_y

        # 过界处理
....

        """ 调用父类update """
        super().update()

4、炮口位置

4.1初始
    # 炮台口位置
    self.paokou = 0, 0
4.2 可以通过旋转计算其位置
4.3 更简便的方法

不计算炮口位置,直接引用坦克中心位置,修改画面会制顺序,先给制子弹,再绘制角色,看其来正好从炮口位置发射。

4.4 代码实现
        if not self.player_sprite.respawning and symbol == arcade.key.SPACE:
            bullet_sprite = TurningSprite(":resources:images/space_shooter/"
                                          "laserBlue01.png",
                                          SCALE)
            bullet_sprite.guid = "Bullet"

            bullet_speed = 13
            bullet_sprite.change_y = \
                math.cos(math.radians(self.player_sprite.angle)) * bullet_speed
            bullet_sprite.change_x = \
                -math.sin(math.radians(self.player_sprite.angle)) \
                * bullet_speed

            bullet_sprite.center_x = self.player_sprite.center_x
            bullet_sprite.center_y = self.player_sprite.center_y
            bullet_sprite.update()

            self.bullet_list.append(bullet_sprite)

            arcade.play_sound(self.laser_sound, speed=random.random() * 3 + 0.5)

总效果及代码

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

"""
键盘控制角色任意角度旋转及前进后退
"""

import math
import arcade


SCREEN_width = 800
SCREEN_height = 650
SCREEN_title = "旋转角色"


class ShipSprite(arcade.Sprite):
    """
    旋转角色类
    """
    def __init__(self, filename, scale):
        # 调用图片
        super().__init__(filename, scale)

        # 前进的信息
        # 角度自动从父类传入。
        self.thrust = 0  # 前进动力,一直按键时,前进动力的增加
        self.speed = 0  # 速度
        self.max_speed = 4  # 最大速度,防止一直增加
        self.drag = 0.05  # 摩擦力
        # 炮台口位置
        self.paokou = 0, 0

        # 重生
        self.respawning = 0  # 重生计时器
        self.respawn()

    def respawn(self):
        """
        死而复生画面
        'respawning'重生计时器.
        """
        # 如果我们正在重生,这不能为零
        self.respawning = 1
        self.center_x = SCREEN_width / 2
        self.center_y = SCREEN_height / 2
        self.angle = 0

    def update(self):
        # 死后复生
        if self.respawning:
            self.respawning += 1
            self.alpha = self.respawning
            if self.respawning > 250:
                self.respawning = 0
                self.alpha = 255

        if self.speed > 0:
            self.speed -= self.drag
            if self.speed < 0:
                self.speed = 0

        if self.speed < 0:
            self.speed += self.drag
            if self.speed > 0:
                self.speed = 0

        self.speed += self.thrust
        if self.speed > self.max_speed:
            self.speed = self.max_speed
        if self.speed < -self.max_speed:
            self.speed = -self.max_speed

        self.change_x = -math.sin(math.radians(self.angle)) * self.speed
        self.change_y = math.cos(math.radians(self.angle)) * self.speed

        self.center_x += self.change_x
        self.center_y += self.change_y

        # 过界处理
        if self.right < 0:
            self.left = SCREEN_width

        if self.left > SCREEN_width:
            self.right = 0

        if self.bottom < 0:
            self.top = SCREEN_height

        if self.top > SCREEN_height:
            self.bottom = 0

        """ 调用父类update """
        super().update()


class MyGame(arcade.Window):

    def __init__(self):
        super().__init__(SCREEN_width, SCREEN_height, SCREEN_title)

        self.game_over = False

        # 坦克及子弹列表
        self.player_sprite_list = arcade.SpriteList()
        self.bullet_list = arcade.SpriteList()

        # 坦克
        self.score = 0
        self.player_sprite = None
        self.lives = 3

        # Sounds
        self.laser_sound = arcade.load_sound(":resources:sounds/hurt5.wav")
        self.hit_sound1 = arcade.load_sound(":resources:sounds/explosion1.wav")
        self.hit_sound2 = arcade.load_sound(":resources:sounds/explosion2.wav")
        self.hit_sound3 = arcade.load_sound(":resources:sounds/hit1.wav")
        self.hit_sound4 = arcade.load_sound(":resources:sounds/hit2.wav")

        # Text
        self.text_score = None
        self.text_asteroid_count = None

    def start_new_game(self):

        self.game_over = False

        # 列表
        self.player_sprite_list = arcade.SpriteList()

        self.bullet_list = arcade.SpriteList()


        # 角色初始,图片正上方的角度为0
        self.score = 0
        self.player_sprite = ShipSprite("images/坦克.png", 1)
        self.player_sprite_list.append(self.player_sprite)
        self.lives = 3
        # self.player_sprite.angle=0
        # Create new text objects with initial values
        self.text_score = arcade.Text(
            f"角色角度: {self.player_sprite.angle}",
            start_x=10,
            start_y=70,
            font_size=13,
        )


    def on_draw(self):
        self.clear()

        # Draw all the sprites.
        # self.asteroid_list.draw()
        # self.ship_life_list.draw()
        self.bullet_list.draw()
        self.player_sprite_list.draw()

        # Draw the text
        self.text_score.draw()
        # self.text_asteroid_count.draw()

    def on_key_press(self, symbol, modifiers):

        if symbol == arcade.key.LEFT:
            self.player_sprite.change_angle = 3
        elif symbol == arcade.key.RIGHT:
            self.player_sprite.change_angle = -3
        elif symbol == arcade.key.UP:
            self.player_sprite.thrust = 0.15
        elif symbol == arcade.key.DOWN:
            self.player_sprite.thrust = -.2

    def on_key_release(self, symbol, modifiers):

        if symbol == arcade.key.LEFT:
            self.player_sprite.change_angle = 0
        elif symbol == arcade.key.RIGHT:
            self.player_sprite.change_angle = 0
        elif symbol == arcade.key.UP:
            self.player_sprite.thrust = 0
        elif symbol == arcade.key.DOWN:
            self.player_sprite.thrust = 0


    def on_update(self, x):
        """ Move everything """

        if not self.game_over:
            # self.asteroid_list.update()
            self.bullet_list.update()
            self.player_sprite_list.update()

        # Update the text objects
        self.text_score.text = f"角色角度: {self.player_sprite.angle}",
        # self.text_asteroid_count.text = f"Asteroid Count: {len(self.asteroid_list)}"


def main():
    """ Start the game """
    window = MyGame()
    window.start_new_game()
    arcade.run()


if __name__ == "__main__":
    main()

源码获取

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

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

### 回答1: 我可以帮你使用Pythonarcade来创建一个平台类游戏arcade提供了一个简单而强大的API,可以帮助你创建2D游戏。它还有一个文档,可以帮助你开始创建游戏,并且拥有许多示例代码,可以让你学习如何使用这个。 ### 回答2: 使用Pythonarcade可以很方便地制作平台类游戏arcade提供了许多内置函数和类,用于处理游戏循环、精灵、碰撞检测等常见的游戏开发任务。 首先,我们需要创建一个游戏窗口。通过arcade提供的Window类,我们可以创建一个指定大小的窗口,并设置背景颜色。 接下来,我们可以创建角色或者其他游戏中的物体,这些物体被称为精灵arcade提供了Sprite类用于创建精灵。我们可以设置精灵的外观、位置、大小等属性。 在游戏循环中,我们可以监听用户输入,例如键盘按键、鼠标点击等事件。通过事件处理函数,我们可以根据用户的操作来更新精灵的状态。 在平台类游戏中,通常会涉及到角色的跳跃、移动、碰撞检测等功能。arcade提供了一些内置函数和方法来处理这些功能。例如,我们可以使用移动函数来控制角色的水平和垂直移动。我们还可以使用碰撞检测函数来判断角色是否与其他物体发生了碰撞。 此外,arcade还可以处理音效、动画等高级功能,以及绘制背景、地图等元素。它还提供了一些内置的工具函数,用于计算距离、旋转等常见操作。 总的来说,使用Pythonarcade可以实现一个简单而又有趣的平台类游戏。通过利用arcade提供的丰富功能,可以很方便地创建精灵、处理用户输入、实现碰撞检测等游戏开发任务。无论是新手还是有经验的开发者,都可以轻松上手使用arcade制作自己的平台类游戏。 ### 回答3: 使用Pythonarcade可以很方便地制作平台类游戏。首先,我们需要导入arcade。然后创建一个继承自arcade.Window的类,作为游戏窗口。 在窗口类中,我们可以定义一些属性,比如玩家的位置和角色模型等。然后,我们可以使用arcade提供的绘图函数来渲染游戏界面。 接着,我们可以定义一些事件处理函数,比如按键事件或鼠标事件。根据不同的事件,我们可以更新游戏状态,比如移动玩家或触发一些特殊的效果。 在游戏循环中,我们可以使用arcade提供的定时器函数来设定游戏帧率。每一帧,我们可以调用draw函数来绘制游戏界面,并在需要时更新游戏状态。 此外,我们可以使用arcade提供的物理引擎功能,比如重力或碰撞检测,来增加游戏的真实性和挑战性。 最后,当玩家达到游戏的胜利条件或失败条件时,我们可以显示游戏结束画面,并提供一些重新开始或退出游戏的选项。 总的来说,使用Pythonarcade可以很方便地制作一个平台类游戏。通过定义游戏窗口、绘制游戏界面、处理事件和更新游戏状态等步骤,我们可以创建一个有趣且具有挑战性的游戏体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

信息化未来

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

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

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

打赏作者

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

抵扣说明:

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

余额充值