手把手地教: 带你一步步走进ebiten的游戏库中(一、图像组合)

前言

ebiten是一款基于go语言实现的游戏库, 这是一款比较成熟的2D游戏库, 也是我迄今为止见到的唯一一款, 由go语言编写, 且评分较高的一款游戏库.

感兴趣的小伙伴可以看看它的官网.

ebiten开源仓库里的example示例高达80多个, 简直不敢相信这些居然、几乎由一个人开发并维护.

接下来, 我将从新手的视角, 一步步为大家讲解ebiten中的代码示例.

图像组合

功能介绍

在blend示例中, 我们可以看到两张图片的十二种不同模式的组合

源图:

目标图:

两个图像组合共有12种模式,分别如下:

  • BlendCopy(源图像覆盖目标图像)
  • BlendSourceAtop(目标图像的像素会被源图像的像素替换)
  • BlendSourceOver(源图像叠加在目标图像上)
  • BlendSourceIn(源图像像素保留在目标图像不透明的区域中,目标图像的透明区域会被源图像的像素裁剪掉)
  • BlendSourceOut(源图像像素保留在目标图像透明的区域中,目标图像的不透明区域会被源图像的像素裁剪掉)
  • BlendDestination(目标图像保持不变,源图像对目标图像没有任何影响)
  • BlendDestinationAtop
  • BlendDestinationOver
  • BlendDestinationIn(目标图像的像素保留在与源图像不透明区域重叠的部分内,目标图像其他像素区域会被裁剪掉)
  • BlendDestinationOut
  • BlendXor(只有源图像和目标图像不重叠的部分会被保留,重叠的部分会被去除)
  • BlendLighter(源图像和目标图像像素值的叠加)

这意味着目标图像和源图像的颜色值会相加,从而产生更亮的效果。对于每个颜色通道,计算结果会被限制在 255 以内,以避免溢出

  • BlendClear

以上这12种模式皆是Porter-Duff 合成模式,blend示例代码中,绘制混合模式的代码如下所示:

scss 复制代码
func (g *Game) drawBlendMode(screen *ebiten.Image, x, y float64, mode ebiten.Blend) {
	// Copy the destination image to offscreen so as not to modify it.
	g.offscreen.Clear()
    // 使用ebiten.image中的DrawImage方法
	g.offscreen.DrawImage(g.dest, nil)

	// Select and apply blending mode.
	op := &ebiten.DrawImageOptions{}
	op.Blend = mode
	g.offscreen.DrawImage(g.source, op)

	// Draw the result on the passed coordinates.
    // 把offscreen理解成临时图像,先绘制目标图像,再绘制带blend模式的源图像,最后将offscreen图像绘制在画布上
	op = &ebiten.DrawImageOptions{}
	op.GeoM.Translate(x, y)
	screen.DrawImage(g.offscreen, op)
}

绘制图像组合时,需取源图像、目标图像边界x、y的最大值

scss 复制代码
g.tileSize = maxSide(g.source, g.dest)
g.offscreen = ebiten.NewImage(g.tileSize, g.tileSize)

// maxSide returns the largest side of a or b images.
func maxSide(a, b *ebiten.Image) int {
	return max(
		max(a.Bounds().Dx(), b.Bounds().Dx()),
		max(a.Bounds().Dy(), b.Bounds().Dy()),
	)
}

应用场景

  • 透明效果:

使用不同的混合模式可以实现不同类型的透明效果,如 ebiten.CompositeModeSourceOver 用于正常的透明混合,ebiten.CompositeModeClear 用于清除目标区域,等等。

  • 光照和特效:

混合模式可用于模拟光照和特效,例如使用加法混合(ebiten.CompositeModeLighter)来叠加光源的亮度,或者使用自定义的混合模式来实现特殊的光照效果。

  • 粒子系统:

在粒子系统中,可以使用混合模式来实现不同的粒子效果,如火焰、烟雾、魔法等。加法混合和屏幕混合常用于这些效果

  • 色彩调整:

使用混合模式可以对图像进行色彩调整,如亮度、对比度和饱和度的调整。通过修改混合模式,可以实现不同的色彩效果

相关推荐
迪飞特科技几秒前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑4 分钟前
@JsonInclude注解使用
spring boot·后端·spring
IT_陈寒35 分钟前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信37 分钟前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端
CCblandy38 分钟前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
蜗牛互联网1 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
dd聊技术2 小时前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
9命怪猫2 小时前
关于eBPF的JIT运维需要了解的
后端
林壮Allen2 小时前
用 Go 从零实现多 Agent 协作框架:两个让我踩坑的设计问题
go·ai编程
9命怪猫2 小时前
运维eBPF 常用命令清单
后端