【掘金大冒险:yoyo eat】吃掉更多的ghosty!

711 阅读3分钟

我正在参加掘金社区游戏创意投稿大赛团队赛,详情请看:游戏创意投稿大赛

前言

本游戏参与掘金游戏创意投稿大赛,游戏名为yoyo eat,一个h5小游戏,该项目以kaboomjs为基础开发。

各位程序员不要总是敲键盘了,咱们来用鼠标运动运动吧。锻炼锻炼手眼协调能力!

本游戏各位可以通过移动鼠标控制yoyo来吃掉邪恶的ghosty获取分数,而且我们不能放过任何一个ghosty哦。

来看看谁的分数更高!

游戏体验链接

image.png

chrome-capture-2022-3-23.gif

设计

本游戏使用kaboomjs库作为基础来帮助我们更快更好的开发出好玩的游戏。

加载依赖以及文件

// 引入kaboom并初始化上下文
kaboom()
    
// 加载障碍物
const obstacles = [	"mushroom",	"spike",	"grass"]

for (const obstacle of obstacles) {
	loadSprite(obstacle, `/assets/${obstacle}.png`)
}

// 添加yoyo和ghosty对象,以及音效
loadSprite("yoyo", "/assets/yoyo.png")
loadSprite("ghosty", "/assets/ghosty.png")
loadSound("blip", "/assets/blip.mp3")
loadSound("wooosh", "/assets/wooosh.mp3")

引入kaboom并初始化上下文,加载游戏依赖的文件。

初始化

// 开始界面内容
scene("start", () => {

	play("wooosh")

	add([
		text("yoyo eat"),
		pos(center().sub(0, 100)),
		scale(2),
		origin("center"),
	])

	add([
		sprite("ghosty"),
		pos(center().add(0, 100)),
		scale(2),
		origin("center"),
	])

	// 1.5秒后开始游戏
	wait(1.5, () => go("game"))
})

加载开始界面内容,展示我们的游戏名以及需要"eat"掉的ghosty图标,并将放到屏幕中进行定位,设置缩放等级等操作。

等待1.5秒后我们就可以开始游戏了。

游戏整体逻辑

// 主要游戏场景内容
scene("game", () => {

	// 速度
	const SPEED_MIN = 120
	const SPEED_MAX = 640

	// 玩家控制的游戏对象
	const player = add([
		sprite("yoyo"),
		pos(40, 20),
		area({ scale: 0.5 }),
		origin("center"),
	])

	// 使图层通过鼠标移动
	player.onUpdate(() => {
		player.pos = mousePos()
	})
        
	// 每帧移动障碍物,如果超出屏幕一定距离则将其销毁
	// 所有带有move标签的物体都会在每一帧都向x移动
	onUpdate("move", (move) => {
		move.move(-move.speed, 0)
		if (move.pos.x < -120) {
			destroy(move)
		}
	})

	onUpdate("ghosty", (ghosty) => {
		if (ghosty.pos.x <= 0) {
			go("lose", score)
			play("blip")
			addKaboom(ghosty.pos)
		}
	})

	// 计分器
	let score = 0

	const scoreLabel = add([
		text(score, 32),
		pos(12, 12),
	])

	// 如果玩家吃了ghosty,则增加分数
	player.onCollide("ghosty", (ghosty) => {
		addKaboom(player.pos)
		score += 1
		destroy(ghosty)
		scoreLabel.text = score
		burp()
		shake(12)
	})
        
	// 如果玩家碰到障碍物则游戏结束
	player.onCollide("obstacle", (obstacle) => {
		go("lose", score)
		play("blip")
	})

	// 每 0.3 秒执行一次
	loop(0.3, () => {

		// 从屏幕右侧生成
		const x = width() + 24

		// 从随机 y 位置生成
		const y = rand(0, height())

		// 获得随机速度
		const speed = rand(SPEED_MIN, SPEED_MAX)

		// 生成ghosty几率是40%
		const isGhosty = chance(0.4)
		const spriteName = isGhosty ? "ghosty" : choose(obstacles)
		add([
			sprite(spriteName),
			pos(x, y),
			area({ scale: 0.5 }),
			origin("center"),
			"move",
			isGhosty ? "ghosty" : "obstacle",
			{ speed: speed }
		])
	})
})

设置游戏逻辑

  • 障碍物生成的位置以及移动的速度范围
  • 设置元素生成的时间间隔以及是ghosty的几率,随机生成元素如果不是ghosty则通过choose()方法在障碍物列表中随机挑选一个元素
  • 生成的元素都带有"move"标签,所有带有move标签的都通过onUpdate()方法计算每个元素每帧的运动位置
  • 通过onCollide()方法计算玩家操控的yoyo与任何一个游戏对象的碰撞事件,如果是ghosty则score+1,如果是obstacle障碍物则游戏结束
  • ghosty的运动范围,如果ghosty超出屏幕即视为玩家没能成功捕获,游戏结束

游戏结束场景

// 游戏结束场景
scene("lose", (score) => {

	// 显示图标
	add([
		sprite("yoyo"),
		pos(width() / 2, height() / 2 - 108),
		scale(3),
		origin("center"),
	])

	// 显示分数
	add([
		text(score),
		pos(width() / 2, height() / 2 + 108),
		scale(3),
		origin("center"),
	])

	// 按下鼠标空格返回游戏
	onKeyPress("space", () => go("start"))
	onClick(() => go("start"))

})

将游戏分数传入,再次亮起yoyo图标,显示出我们在这场游戏中得到的分数。

这就是我们yoyo eat小游戏的主要逻辑了,希望大家玩的开心!