更新于 

Element-Scrolls 元素卷轴

版本控制

一定要用git进行版本控制啊
做了一天的素材因为编辑器卡死,场景全丢失(怒啊啊啊啊),
没法通过BackupAssets找回来了wocao

游戏简介

游戏介绍

屏幕分辨率:375 * 667
操作方式:鼠标点击/屏幕触控
游戏类型:弹幕

玩法

传统玩法的弹幕游戏,
敌人从屏幕上方袭来,不要让它们冲破防线, 并躲避它们的子弹,
有4种可收集物品:

  • 金币:可以用来购买更加强力的子弹
  • 爱心:增加生命
  • 蓝色药水:加快射击速度
  • 饭团:进入持续5秒的散射时间

一共有4种子弹:

  • 能量弹:初始子弹
  • 火焰弹:威力加强
  • 岩石弹:威力强,射速慢
  • 叶旋风:威力弱,射速快

总共有5个关卡,每个关卡都有独特的敌人

游戏体验

体验地址

开始游戏界面
开始游戏界面
关于游戏界面
关于游戏界面
游戏设置界面
游戏设置界面
弹幕射击界面
弹幕射击界面
切换子弹
切换子弹
子弹商店
子弹商店
多重关卡
多重关卡
多重射击
多重射击
游戏胜利
游戏胜利
游戏结束
游戏结束

开发过程

场景搭建

背景采取2张背景图叠加循环滚动的方式:

场景拼接滚动
场景拼接滚动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
export default class BackScene extends cc.Component {
scrollHeight:number = 0

@property
scrollSpeed:number = 100
onLoad(){
this.scrollHeight = cc.view.getVisibleSize().height
}

update(dt){
this.backMove(dt)
}

backMove(dt){
this.node.y -= this.scrollSpeed * dt
if(this.node.y <= - this.scrollHeight){
this.node.y = 0
return
}
}
}

敌我脚本

敌人和玩家具有2个最基本的机制:

  • 移动
  • 发射子弹
玩家脚本

移动使用TOUCH监控,这样能兼容到PC和移动端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
export default class Player extends cc.Component {
/** 移动速度 */
@property
moveSpeed: number = 100;

/** 移动延迟 */
@property
moveDuration: number = 8;
/** 目标坐标 */
targetPosition = {
x: 0,
y: 0,
};
/** 可移动的最大y值 */
maxY:number = 0

/** 可移动的x值范围 */
minX:number = 0
maxX:number = 0;

isMoving: boolean = false;
start() {
// 初始化目标位置
this.targetPosition.x = this.node.x;
this.targetPosition.y = this.node.y;

// 计算可移动的范围
this.maxY = this.node.getParent().height - cc.find(CompPath.TitleMenu).height - this.node.height
let xPad = 15
this.minX = xPad + this.node.width/2
this.maxX = this.node.getParent().width + xPad - this.node.width

// 绑定移动事件
this.moveByTouch()
}
moveByTouch(){
const touchWindow = cc.find(CompPath.MainGameWindow)
const titleMenu = cc.find(CompPath.TitleMenu)
const maxY = titleMenu.y - titleMenu.height
touchWindow.on(cc.Node.EventType.TOUCH_START,(event:cc.Event.EventTouch)=>{
if(globalVar.gamePause) return
this.isMoving = true
})
touchWindow.on(cc.Node.EventType.TOUCH_END,(event:cc.Event.EventTouch)=>{
if(globalVar.gamePause) return
this.isMoving = false
})
touchWindow.on(cc.Node.EventType.TOUCH_CANCEL,(event:cc.Event.EventTouch)=>{
if(globalVar.gamePause) return
this.isMoving = false
})
touchWindow.on(cc.Node.EventType.TOUCH_MOVE,(event:cc.Event.EventTouch)=>{
if(globalVar.gamePause) return
if(this.isMoving){
let ex = event.getLocationX(), ey = event.getLocationY()
if(ey - touchWindow.y <=0 || ey >= maxY) {
return
}else if(ex <= this.minX || ex >= (this.maxX + 15)){
return
}
// 修改移动点位置
this.targetPosition.x = ex - 15
this.targetPosition.y =ey - touchWindow.y
}
})
}
update(dt) {
// 缓动
this.node.x +=
(this.targetPosition.x - this.node.x) / this.moveDuration;
this.node.y +=
(this.targetPosition.y - this.node.y) / this.moveDuration;
}
}

至于发射子弹,一开始是打算由玩家操控子弹射击,
但由于移动端操作的界面比较小,如果要操控射击,就需要单独设计操控面板,
考虑到只是个边学边做的小游戏,就没设计这个(其实就是懒)
后来发现让主角跟随触碰点移动,会让角色完全被手指盖住(悲)
这下理解为什么手机游戏基本都是用摇杆或者指击控制角色移动了。

敌人的移动方向只有前方,并且定时设计,脚本和玩家类似

物品捡拾

一共设计了4种可捡拾物品:

  • 金币
  • 爱心
  • 加速射击药水
  • 散射饭团
捡拾物品
捡拾物品

换弹系统

金币用于购买不同的卷轴,不同的子弹具有不同的伤害和射速:

切换卷轴
切换卷轴

粒子动画

ParticleSystem
游戏胜利效果
游戏胜利效果
游戏开始效果
游戏开始效果
游戏通关效果
游戏通关效果

添加音效