小学生python游戏编程arcade----灯光示例

news/2024/5/8 17:28:20/文章来源:https://blog.csdn.net/fqfq123456/article/details/128140375

小学生python游戏编程arcade----灯光示例

    • 前言
    • 灯光阴影效果
      • 1、灯光效果
        • 1.1 玩家灯光效果
        • 1.2 代码
      • 2、灯光效果
        • 2.1 软效果
        • 2.2码实现
      • 3、硬效果
        • 3.1 灯光硬效果
        • 3.2代码实现
      • 4、灯光开关
        • 4.1 灯光开关
        • 4.2 代码实现
    • 灯光示例代码
    • 源码获取

前言

接上篇文章继续解绍arcade游戏编程的基本知识。游戏的灯光阴影效果

灯光阴影效果

1、灯光效果

1.1 玩家灯光效果

蓝色效果
在这里插入图片描述
白色效果

在这里插入图片描述

1.2 代码

        #创建一个灯光来跟随玩家。稍后,当玩家移动时,我们将对其进行定位。#我们只会在玩家打开灯光时将其添加到灯光层打开。我们从熄灯开始。radius = 150mode = 'soft'color = arcade.csscolor.WHITEself.player_light = Light(0, 0, radius, color, mode)

2、灯光效果

2.1 软效果

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

2.2码实现

# 白色灯光x = 100y = 200radius = 100mode = 'soft'color = arcade.csscolor.WHITElight = Light(x, y, radius, color, mode)self.light_layer.add(light)

3、硬效果

3.1 灯光硬效果

在这里插入图片描述

3.2代码实现

        # 创建三个重叠的RGB灯光,但不会褪色的“硬”灯。x = 650y = 150radius = 100mode = 'hard'color = arcade.csscolor.REDlight = Light(x, y, radius, color, mode)self.light_layer.add(light)

4、灯光开关

4.1 灯光开关

在这里插入图片描述

4.2 代码实现

    def on_key_press(self, key, _):if key == arcade.key.UP:self.player_sprite.change_y = MOVEMENT_speedelif key == arcade.key.DOWN:self.player_sprite.change_y = -MOVEMENT_speedelif key == arcade.key.LEFT:self.player_sprite.change_x = -MOVEMENT_speedelif key == arcade.key.RIGHT:self.player_sprite.change_x = MOVEMENT_speedelif key == arcade.key.SPACE:# 灯光开关if self.player_light in self.light_layer:self.light_layer.remove(self.player_light)else:self.light_layer.add(self.player_light)

灯光示例代码

"""
应用灯光示例
"""
import arcade
from arcade.experimental.lights import Light, LightLayerSCREEN_width = 1024
SCREEN_height = 768
VIEWPORT_margin = 200
MOVEMENT_speed = 5# 这是用于“环境光”的颜色。如果你不想要环境光,设置为黑色。
COLOR_ambient = (10, 10, 10)class MyGame(arcade.Window):""" Main Game Window """def __init__(self, width, height, title='灯光示例'):super().__init__(width, height,title, resizable=True)# 精灵列表self.background_sprite_list = Noneself.player_list = Noneself.wall_list = Noneself.player_sprite = None#引擎self.physics_engine = None# 用于滚动self.view_left = 0self.view_bottom = 0# --- 灯光相关 ---# 灯光层self.light_layer = None# 与玩家一起移动并打开/关闭单个灯光self.player_light = Nonedef setup(self):""" Create everything """# 精灵列表self.background_sprite_list = arcade.SpriteList()self.player_list = arcade.SpriteList()self.wall_list = arcade.SpriteList()# 玩家self.player_sprite = arcade.Sprite(":resources:images/animated_characters/female_person/""femalePerson_idle.png",0.4)self.player_sprite.center_x = 64self.player_sprite.center_y = 270self.player_list.append(self.player_sprite)# --- 灯光 ---# 灯光一定照在什么东西上。如果没有背景子画面或颜色,# #你只会看到黑色。因此,我们使用一个循环来创建一堆砖砖背景。for x in range(-128, 2000, 128):for y in range(-128, 1000, 128):sprite = arcade.Sprite(":resources:images/tiles/brickTextureWhite.png")sprite.position = x, yself.background_sprite_list.append(sprite)#创建一个灯光层,用于渲染对象,然后后期处理和添加灯光。这必须与屏幕大小匹配。self.light_layer = LightLayer(SCREEN_width, SCREEN_height)# 背景色self.light_layer.set_background_color(arcade.color.BLACK)# 白色灯光x = 100y = 200radius = 100mode = 'soft'color = arcade.csscolor.WHITElight = Light(x, y, radius, color, mode)self.light_layer.add(light)# 创建重叠的大白光x = 300y = 150radius = 200color = arcade.csscolor.WHITEmode = 'soft'light = Light(x, y, radius, color, mode)self.light_layer.add(light)# 红光x = 50y = 450radius = 100mode = 'soft'color = arcade.csscolor.REDlight = Light(x, y, radius, color, mode)self.light_layer.add(light)x = 250y = 450radius = 100mode = 'soft'color = arcade.csscolor.GREENlight = Light(x, y, radius, color, mode)self.light_layer.add(light)x = 450y = 450radius = 100mode = 'soft'color = arcade.csscolor.BLUElight = Light(x, y, radius, color, mode)self.light_layer.add(light)# 创建三个重叠的RGB灯光x = 650y = 450radius = 100mode = 'soft'color = arcade.csscolor.REDlight = Light(x, y, radius, color, mode)self.light_layer.add(light)x = 750y = 450radius = 100mode = 'soft'color = arcade.csscolor.GREENlight = Light(x, y, radius, color, mode)self.light_layer.add(light)x = 850y = 450radius = 100mode = 'soft'color = arcade.csscolor.BLUElight = Light(x, y, radius, color, mode)self.light_layer.add(light)# 创建三个重叠的RGB灯光,但不会褪色的“硬”灯。x = 650y = 150radius = 100mode = 'hard'color = arcade.csscolor.REDlight = Light(x, y, radius, color, mode)self.light_layer.add(light)x = 750y = 150radius = 100mode = 'hard'color = arcade.csscolor.GREENlight = Light(x, y, radius, color, mode)self.light_layer.add(light)x = 850y = 150radius = 100mode = 'hard'color = arcade.csscolor.BLUElight = Light(x, y, radius, color, mode)self.light_layer.add(light)#创建一个灯光来跟随玩家。稍后,当玩家移动时,我们将对其进行定位。#我们只会在玩家打开灯光时将其添加到灯光层打开。我们从熄灯开始。radius = 150mode = 'soft'color = arcade.csscolor.WHITEself.player_light = Light(0, 0, radius, color, mode)self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)# 设置self.view_left = 0self.view_bottom = 0def on_draw(self):self.clear()# 应该受到灯光影响的所有内容都会在该窗口中渲染“with”语句。屏幕上还没有渲染任何内容,只有灯光层。with self.light_layer:self.background_sprite_list.draw()self.player_list.draw()# 将灯光层绘制到屏幕上。这将使整个屏幕充满点亮的内容,即我们在上面的光层中绘制的内容self.light_layer.draw(ambient_color=COLOR_ambient)arcade.draw_text("按space转换显示与否灯光",10 + self.view_left, 10 + self.view_bottom,arcade.color.WHITE, 20)def on_resize(self, width, height):"""缩放 """# 缩放光层self.light_layer.resize(width, height)# 滚动屏幕self.scroll_screen()def on_key_press(self, key, _):if key == arcade.key.UP:self.player_sprite.change_y = MOVEMENT_speedelif key == arcade.key.DOWN:self.player_sprite.change_y = -MOVEMENT_speedelif key == arcade.key.LEFT:self.player_sprite.change_x = -MOVEMENT_speedelif key == arcade.key.RIGHT:self.player_sprite.change_x = MOVEMENT_speedelif key == arcade.key.SPACE:# 灯光开关if self.player_light in self.light_layer:self.light_layer.remove(self.player_light)else:self.light_layer.add(self.player_light)def on_key_release(self, key, _):if key == arcade.key.UP or key == arcade.key.DOWN:self.player_sprite.change_y = 0elif key == arcade.key.LEFT or key == arcade.key.RIGHT:self.player_sprite.change_x = 0def scroll_screen(self):""" 管理滚动 """# 左left_boundary = self.view_left + VIEWPORT_marginif self.player_sprite.left < left_boundary:self.view_left -= left_boundary - self.player_sprite.left# 右right_boundary = self.view_left + self.width - VIEWPORT_marginif self.player_sprite.right > right_boundary:self.view_left += self.player_sprite.right - right_boundary# 上top_boundary = self.view_bottom + self.height - VIEWPORT_marginif self.player_sprite.top > top_boundary:self.view_bottom += self.player_sprite.top - top_boundary# 下bottom_boundary = self.view_bottom + VIEWPORT_marginif self.player_sprite.bottom < bottom_boundary:self.view_bottom -= bottom_boundary - self.player_sprite.bottom# 确保我们的边界是整数值。当视口执行此操作时支持浮点数,对于这个应用程序,我们需要每个像素# 以直接映射到屏幕上的像素。我们不想任何舍入误差。self.view_left = int(self.view_left)self.view_bottom = int(self.view_bottom)arcade.set_viewport(self.view_left,self.width + self.view_left,self.view_bottom,self.height + self.view_bottom)def on_update(self, delta_time):# 更新所有精灵self.physics_engine.update()# 我们可以通过设置位置轻松移动灯光self.player_light.position = self.player_sprite.position# 滚动屏幕self.scroll_screen()if __name__ == "__main__":window = MyGame(SCREEN_width, SCREEN_height)window.setup()arcade.run()

源码获取

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_228921.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凌玮科技IPO注册生效:曾踩雷理财损失2000万元,胡颖妮为董事长

11月30日&#xff0c;广州凌玮科技股份有限公司&#xff08;下称“凌玮科技”&#xff09;在深圳证券交易所创业板递交招股书&#xff08;注册稿&#xff09;。相较于此前招股书&#xff0c;凌玮科技补充披露了截至2022年9月30日的财务数据等信息&#xff0c;并对2022年度的业绩…

算法设计与分析 SCAU19180 集合划分问题

19180 集合划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 教材课后习题2-8 n个元素的集合{1,2,…,n}可以划分若干个非空子集。例如&#xff0c;当n4时&#xff0c;集合{1,2,3,4}可以划分为15个不同的非…

信贷风控NCL净损失率的指标实现与应用

在金融信贷业务的风险控制过程中&#xff0c;有一项财务指标发挥着比较重要的信息参考价值&#xff0c;可以有效衡量某个月份放款金额在形成呆账后的资金损失情况&#xff0c;其中呆账指的是信贷逾期180天以上&#xff0c;这个指标便是NCL&#xff08;Net Credit Loss&#xff…

22.12.1打卡 漫步校园 记忆化搜索

题目里很显然只走最短路, 直接用bfs从终点到起点搜一遍将每一步到终点所需要的最短的时间存在一个dis数组中, 然后你就会发现原来的地图变成了这样 上面是地图下面是dis数组, 再看看经典记忆化搜索模板题滑雪的地图 对的, 非常地相似, 接下来的操作和滑雪基本一样, 只不过起点是…

轨迹预测——day 57 基于车道交叉和考虑驾驶方式的终点生成模型的前目标车辆轨迹预测

Trajectory Prediction of Preceding Target Vehicles Based on Lane Crossing and Final Points Generation Model Considering Driving Styles导读II.问题表述与系统架构A. Trajectory Prediction for PTVs&#xff08;preceding target vehicles&#xff09;B. Position and…

realme手机配什么蓝牙耳机?realme蓝牙耳机推荐

蓝牙耳机作为人手必备的单品&#xff0c;不同厂商的产品更是多种多样&#xff0c;用户可以有更多的选择&#xff0c;选购蓝牙耳机的时候&#xff0c;除了看重佩戴舒适度、发声单元人们更加追求最新研发的技术。realme是为年轻人而来的科技潮牌。秉持“敢越级”品牌理念&#xf…

Spring基础篇:注入

第一章&#xff1a;注入 一&#xff1a;什么是注入 &#xff08;Injection&#xff09;注入就是通过Spring的工厂类和spring的配置文件&#xff0c;对spring所创建的对象进行赋值&#xff0c;为成员变量进行赋值 二&#xff1a;为什么注入 为什么需要Spring工厂创建对象的时…

荟味齐鲁鲁菜网站/美食网站/菜谱网站

摘要 菜谱信息是餐厅必不可少的一个部分。在餐厅发展的整个过程中&#xff0c;菜谱信息管理担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的荟味齐鲁鲁菜网站&#xff0c;使用SSM框架&#xff0c;Mysql数据库&…

智能聊天机器人如何帮助独立站运营提高工作效率?

关键词&#xff1a;智能聊天机器人、独立站运营 独立站运营变得越来越受欢迎&#xff0c;独立站可以用来建立在线商店并推动您的电子商务业务取得成功。它具有大量以业务为中心的功能&#xff0c;也许这就是为什么许多公司相信它会发展其在线业务的轨迹。 添加聊天机器人可以进…

基于51单片机电子微波炉控制系统(源程序+仿真+原理图+全套资料)

资料编号&#xff1a;203 功能介绍&#xff1a; 该电子微波炉采用51单片机制作&#xff0c;有基本的加热、冷却、启动、停止等功能&#xff0c;并通过MCU 控制其加热、冷却时间&#xff0c;LED 数码管显示时间。程序采用C语言编写&#xff0c;仿真使用Proteus&#xff0c;程序…

mysql与磁盘的关系

1.如今一直在说mysql存储方式和磁盘的关系&#xff0c;但是现在都是硬盘存储啊 磁盘分为硬盘和软盘 硬盘结构&#xff08;机械硬盘和固态硬盘&#xff09;详解 硬盘的大小是使用"磁头数 x 柱面数 x 扇区数 x 每个扇区的大小 如下&#xff1a; 每个扇区的大小是固定的…

Allegro添加渐近线操作指导

Allegro添加渐近线操作指导 Allegro支持添加渐近线,让线宽变化的地方进行圆环的过渡,对于射频信号优化有很大帮助,类似下图 具体操作如下 首先设置参数,route-Gloss-Parameters 点击Fillet and Taper Trace前面的方框 勾选Allowed DRC, Unused Nets 勾选Tapered Trac…

【毕业设计】大数据心血管疾病数据分析(医学大数据分析)

文章目录0 前言1 课题背景2 数据处理3 数据可视化4 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设的要求越来越高&#xff0c…

【Redis】缓存击穿的产生情况解决方案

1. 缓存击穿产生 也叫做 热点 Key 问题&#xff0c;高并发访问并且缓存重建业务较复杂的 key 突然失效了&#xff0c;无数的请求想要重建缓存&#xff0c;大量的访问会在瞬间给数据库带来巨大冲击。 2. 解决方案 2.1 方案一&#xff1a;互斥锁 查询缓存不存在时&#xff0c;…

天宇优配|上架秒光 “3时代”的大额存单受宠

“最近理财产品动摇比较大&#xff0c;准备处理一笔大额存单&#xff0c;但查询发现&#xff0c;某国有行暂时没有可购买的大额存单产品。”11月29日&#xff0c;成都市民王女士向金融出资报记者表示。 记者发现&#xff0c;虽然通过数次下调&#xff0c;中长期大额存单利率已步…

k8s网络插件之Calico

Calico简介 Calico官方文档&#xff1a;https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart Calico是一套开源的网络和网络安全解决方案&#xff0c;用于容器、虚拟机、宿主机之前的网络连接&#xff0c;它是一个纯三层的虚拟化网络解决方案&#…

MYSQL中AS(取别名)

文章目录0 写在前面1 格式2 举例2.1 设置表别名2.2 设置字段别名3 写在末尾0 写在前面 在做业务&#xff0c;在mybatis中手写sql中再多表查询去映射实体时&#xff0c;总会用到AS这个关键字。 或者我们在数据库大量字段测试数据时&#xff0c;很多字段都有相同的前缀&#xff…

神仙级编程神器,吹爆

Visual Studio 编程领域公认的“最强IDE”&#xff0c;Visual Studio是目前最流行的Windows平台应用程序的集成开发环境&#xff0c;提供了高级开发工具、调试功能、数据库功能和创新功能&#xff0c;帮助在各种平台上快速创建当前最先进的应用程序&#xff0c;开发新的程序。 …

借助cubeMX实现STM32MP157A(-M4核)UART、按键中断、环境检测开关实验

main.c 可以添加一句打印提示 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init(…

【内网安全】——Linux信息收集

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…