109
社区成员




这个作业属于哪个课程 | 软件工程-24年秋季 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 技术总结 |
其他参考文献 | 见参考资料 |
我们的项目为一款剧情向的2D像素独立游戏,使用Godot作为游戏引擎,旨在通过引人入胜的剧情和独特的像素艺术风格为玩家带来沉浸式体验。作为游戏美术,我负责了大部分的场景绘制、大部分人物设计和立绘、过场插画和动画、怪物精灵图以及部分像素小人。为确保艺术风格一致,我使用了Procreate进行初步的草图与色彩设计,并利用Aseprite进行像素艺术的制作与动画。通过这些技术与工具的结合,创造出了一种既具表现力又不失像素美感的游戏视觉风格。
Godot是本项目的主要游戏引擎。由于其强大的2D功能,特别适合用于像素艺术风格的游戏开发。Godot的节点系统支持灵活的资源管理,场景与动画的实现都较为直观。
2D场景与Tilemap系统:利用Godot的Tilemap系统构建游戏世界,通过管理Tileset和Layer来创建丰富的场景,使得大范围的地图可以通过模块化的设计更高效地实现。
extends TileMap
func _ready():
# 加载Tileset
var tileset = preload("res://path_to_your_tileset.tres")
set_tileset(tileset)
# 填充TileMap中的指定位置
set_cellv(Vector2(5, 5), 0) # 设置(5, 5)位置的瓦片,索引为0
set_cellv(Vector2(6, 5), 1) # 设置(6, 5)位置的瓦片,索引为1
# 获取某个位置的瓦片信息
var tile = get_cellv(Vector2(5, 5))
print(tile) # 输出瓦片的索引
动画系统:Godot的动画系统能够完美支持2D像素动画,通过其简单的动画编辑器制作流畅的角色和怪物动画。通过导入Aseprite中的帧动画,可以高效地实现游戏内的动态效果。
2D动画
extends AnimatedSprite
func _ready():
# 设置动画循环
set_animation("walk")
# 确保动画循环播放
play("walk", true)
func _process(delta):
if Input.is_action_pressed("ui_right"):
# 根据玩家输入更新精灵朝向
flip_h = false
if !is_playing():
play("walk", true)
elif Input.is_action_pressed("ui_left"):
flip_h = true
if !is_playing():
play("walk", true)
else:
# 停止播放动画
stop()
使用动画树实现复杂动画
extends Node2D
onready var animation_tree = $AnimationTree
onready var animation_state_machine = $AnimationTree/parameters/playback
func _ready():
animation_tree.active = true # 启用动画树
animation_state_machine.travel("Idle") # 默认状态为站立
func _process(delta):
if Input.is_action_pressed("ui_right"):
animation_state_machine.travel("Run")
elif Input.is_action_pressed("ui_left"):
animation_state_machine.travel("Run")
else:
animation_state_machine.travel("Idle")
使用动画精灵制作帧动画
extends AnimatedSprite
func _ready():
# 默认开始走路动画
set_animation("walk")
play("walk", true)
func _process(delta):
if Input.is_action_pressed("ui_up"):
# 播放跳跃动画
set_animation("jump")
play("jump", true)
elif Input.is_action_pressed("ui_left"):
# 播放行走动画,向左
set_animation("walk")
flip_h = true
play("walk", true)
elif Input.is_action_pressed("ui_right"):
# 播放行走动画,向右
set_animation("walk")
flip_h = false
play("walk", true)
else:
# 停止动画
stop()
精灵和动画的优化
extends CanvasLayer
func _ready():
# 只更新当前画面中的元素
set_process(true)
Procreate被用于角色设计、场景概念和插画的初步创作。由于其便捷的触控界面和强大的绘画功能,Procreate成为了我在艺术创作过程中的主要工具。
角色立绘与场景设计:使用Procreate进行草图和基础色块的绘制,快速迭代设计方案。通过图层和自定义笔刷,我能够有效地控制细节和风格一致性。
开始界面初稿
细节调整与着色:在Procreate中完成色彩搭配和细节打磨后,再导出高分辨率图像进入Aseprite进行像素化处理。
Aseprite是我主要用于制作像素艺术和动画的工具,特别适用于精灵图的创作。
还有很多这里放不下.
在将Procreate的高分辨率图像导入Aseprite时,像素艺术的细节和边缘有时会被模糊化,尤其是渐变效果。
解决过程:避免在Procreate中使用过多渐变或模糊效果,尽量保持简洁的色块和清晰的边缘,确保导入Aseprite后仍能保持像素风格。此外,我还通过缩放和网格辅助功能进一步优化了图像的清晰度。
在Aseprite制作复杂动画时,存在每帧切换不平滑的问题,尤其是快速运动的角色或怪物动画。
解决过程:通过减少每个动画的帧数,并精简不必要的细节,确保每一帧都能清晰呈现。同时,采用了Godot的运动模糊效果,弥补了低帧数带来的动画流畅性问题。
在Godot中使用像素图时,缩放后经常出现锯齿或模糊的现象,影响了游戏画面的清晰度。
解决过程:通过设置Godot的Filter属性为Nearest,避免默认的线性插值,使得像素图能够保持清晰且不失真,确保游戏画面能够呈现真实的像素艺术风格。
# 在主场景中设置所有精灵的缩放方式
func _ready():
var sprites = get_tree().root.get_children()
for sprite in sprites:
if sprite is Sprite:
sprite.filter = Sprite.FILTER_NEAREST
通过合理的工具组合和技术应用,本项目成功实现了富有表现力且兼具游戏性与艺术性的2D像素世界。在制作过程中,尽管遇到了诸多技术挑战,但通过工具间的互补性以及对细节的不断打磨,最终呈现出了一款符合预期视觉效果的剧情向游戏。
Godot Documentation: 官方文档,涵盖了Godot引擎的所有功能,尤其是2D部分。
https://docs.godotengine.org/
Procreate User Guide: Procreate的用户手册,帮助深入了解其绘画和设计工具。
https://procreate.art/handbook/
Aseprite Manual: Aseprite的使用手册,指导如何在这个工具中创建像素艺术和动画。
https://www.aseprite.org/docs/