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