所有分类
  • 所有分类
  • 后端开发
RPG游戏开发必备!地图滚动技巧大揭秘,让你玩得更畅快

RPG游戏开发必备!地图滚动技巧大揭秘,让你玩得更畅快

前两篇,rpg的开发已经实现了添加地图和添加游戏人物,本篇来实现地图的卷轴滚动和人物对话的实现,效果如下在完善addTalk()方法的时候,首先准备好对话的内容lufylegend.js引擎包内包含这个demo,请直接下载lufylegen

地图的滚动

RPG游戏开发必备!地图滚动技巧大揭秘,让你玩得更畅快

说起RPG游戏开发,地图滚动这一功能相当重要!让玩家能有更好的沉浸感和互动体验。比如,利用这个功能,你可以晒出一张更宽广的世界观地图,那就更棒了~那怎么做呢?简单说,就是掌握好地图滚动的规则即可。看看给出的图片说明,地图滚动主要有三步:画出新地图位置、滚动地图和去掉已经走过的地方。

RPG游戏开发必备!地图滚动技巧大揭秘,让你玩得更畅快

为了让地图能动起来,我们得搞一个“地图滚动”的开关。简单说就是给地图加一个标记,当它要翻页(滚动)的时候就让这开关亮起来。然后,人跑来跑去的同时,我们就要时不时地看看地图需不需要翻页。发现地图要翻了,就立即翻页;没问题的话,就还继续让那个人跑。最后,为了让你们看得清晰明亮,我把地图和地形都放大超过屏幕。

轻松几招搞定RPG游戏地图滚动,玩起来更顺溜!这样一搞,走地图就跟换电视频道似的,所以玩得挺舒服的~

//地图滚动
var mapmove = false;

人物的对话

/**
 * 地图是否滚动
 **/
Character.prototype.checkMap = function (dir){
	var self = this;
	mapmove = false;
	//如果不是英雄,则地图不需要滚动
	if(!self.isHero)return;
	
	switch (dir){
		case UP:
			if(self.y + charaLayer.y> STEP)break;
			if(mapLayer.y >= 0)break;
			addMap(0,-1);
			mapmove = true;
			break;
		case LEFT:
			if(self.x + charaLayer.x > STEP)break;
			if(mapLayer.x >= 0)break;
			addMap(-1,0);
			mapmove = true;
			break;
		case RIGHT:
			if(self.x = map[0].length*STEP)break;
			addMap(1,0);
			mapmove = true;
			break;
		case DOWN:
			if(self.y = map.length*STEP)break;
			addMap(0,1);
			mapmove = true;
			break;
	}
};

不只是地图能滑来滑去,人物对话才是RPG游戏的精华所在!通过聊天对话,大家能更深层地理解角色间关系和故事进展啥的。那咱们在搞游戏开发时怎么弄这个聊天环节?首先,在按动控制按钮时启动对话,看看有没有人在放下鼠标时有动作,比如点了那个方块。

/**
 * 开始移动 
 **/
Character.prototype.onmove = function (){
	var self = this;
	//设定一个移动步长中的移动次数
	var ml_cnt = 4;
	//计算一次移动的长度
	var ml = STEP/ml_cnt;
	//根据移动方向,开始移动
	switch (self.direction){
		case UP:
			if(mapmove){
				mapLayer.y += ml;
				charaLayer.y += ml;
			}
			self.y -= ml;
			break;
		case LEFT:
			if(mapmove){
				mapLayer.x += ml;
				charaLayer.x += ml;
			}
			self.x -= ml;
			break;
		case RIGHT:
			if(mapmove){
				mapLayer.x -= ml;
				charaLayer.x -= ml;
			}
			self.x += ml;
			break;
		case DOWN:
			if(mapmove){
				mapLayer.y -= ml;
				charaLayer.y -= ml;
			}
			self.y += ml;
			break;
	}
	self.moveIndex++;
	//当移动次数等于设定的次数,开始判断是否继续移动
	if(self.moveIndex >= ml_cnt){
		//一个地图步长移动完成后,如果地图处于滚动状态,则移除多余地图块
		if(mapmove)delMap();
		self.moveIndex = 0;
		//如果已经松开移动键,或者前方为障碍物,则停止移动,否则继续移动
		if(!isKeyDown || !self.checkRoad()){
			self.move = false;
			return;
		}else if(self.direction != self.direction_next){
			self.direction = self.direction_next;
			self.anime.setAction(self.direction);
		}
		//地图是否滚动
		self.checkMap(self.direction);
	}
};

在做加聊天这个事,得先搞定聊天内容。一般来说,聊天内容里要有谁跟谁说话了,他们长什么样,叫啥名字,还有说的话是啥等等这些东西。然后,把这些都对应着人物号给标上去,这样子,当人家点那个方块按钮的时候,就能找到对的那段对话,还能看到屏幕上会出现啥内容哟。

简单来说,加那个聊天的功能,我们就要看前面是不是有人了呗。假如有人的话,那就记住他们的号码,然后去预先设好的表格里找对应的话来聊。最后,把找到的话亮出来放在屏幕上,这样你就能跟咱们大鸣人完儿美地互动!

//地图图片数组
var map = [
[18,18,18,18,18,18,18,18,18,18,18,18,55,55,18,18,18],
[18,18,18,17,17,17,17,17,17,17,17,17,55,55,17,17,18],
[18,18,17,17,17,17,18,18,17,17,17,17,55,55,17,17,18],
[18,17,17,17,18,18,18,18,18,17,17,55,55,17,17,17,18],
[18,17,17,18,22,23,23,23,24,18,17,55,55,17,17,17,18],
[18,17,17,18,25,28,26,79,27,18,55,55,17,17,17,17,18],
[18,17,17,17,17,10,11,12,18,18,55,55,17,17,17,17,18],
[18,18,17,17,10,16,16,16,11,55,55,17,17,17,17,17,18],
[18,18,17,17,77,16,16,16,16,21,21,17,17,17,17,17,18],
[18,18,17,17,77,16,16,16,16,55,55,17,17,17,17,17,18],
[18,18,18,18,18,18,18,18,18,55,55,18,18,18,18,18,18]
];
//地图地形数组
var mapdata = [
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1],
[1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1],
[1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,1],
[1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1],
[1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,0,1],
[1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1],
[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
];

搞定!我们已经成功地让RPG游戏里的角色能说话这样玩起来更有意思,就像真的在跟各种各样的人聊天一样。而且还可以从他们那里接受任务,感觉整个世界都活了过来!

//添加地图
function addMap(cx,cy){
	var i,j,index,indexX,indexY;
	var bitmapdata,bitmap;
	var mapX = mapLayer.x / STEP;
	var mapY = mapLayer.y / STEP;
	var mx = cx<0?-1:0,my = cy<0?-1:0;
	if(imageArray == null){
		//地图图片数据
		bitmapdata = new LBitmapData(imglist["map"]);
		//将地图图片拆分,得到拆分后的各个小图片的坐标数组
		imageArray = LGlobal.pideCoordinate(bitmapdata.image.width,bitmapdata.image.height,10,10);
	}
	mapLayer.removeAllChild();
	//在地图层上,画出15*10的小图片
	for(i=my;i<9 +Math.abs(cy) && i-mapY < map.length;i++){
		for(j=mx;j<15 +Math.abs(cx)&& j-mapX < map[0].length;j++){
			//从地图数组中得到相应位置的图片坐标
			index = map[i-mapY][j-mapX];
			//小图片的竖坐标
			indexY = Math.floor(index /10);
			//小图片的横坐标
			indexX = index - indexY*10;
			//得到小图片
			bitmapdata = new LBitmapData(imglist["map"],indexX*32,indexY*32,32,32);
			bitmap = new LBitmap(bitmapdata);
			//设置小图片的显示位置
			bitmap.x = j*STEP - mapLayer.x;
			bitmap.y = i*STEP - mapLayer.y;
			//将小图片显示到地图层
			mapLayer.addChild(bitmap);
		}
	}
}
//移除多余地图块
function delMap(){
	var bitmap,i;
	for(i=0;i<mapLayer.childList.length;i++){
		bitmap = mapLayer.childList[i];
		if(bitmap.x + mapLayer.x = 480 || 
				bitmap.y + mapLayer.y = 288){
			mapLayer.removeChild(bitmap);
			i--;
		}
	}
}

总结与展望

这篇文章跟你聊聊在做RPG时如何搞懂地图和人物对话!主要就是通过控制变量、看条件还有数据比较这些小技巧来搞定它们。地图滚动的话,玩儿家可以更深切地感受场景变换和连续性的美妙;再看看人物对话,这就给游戏增添了更多的故事性,也让人更想参与进去哟。

RPG游戏开发必备!地图滚动技巧大揭秘,让你玩得更畅快

在将来,做RPG开发多有意思!还能学到不少新东西。比如说,技能系统、任务系统、背包系统什么的,我们可以慢慢琢磨,提升技术,然后做出更好玩更成功的游戏。

希望我这文章对你们有帮助,不管是正在学这个还是已经工作了。加油,做出更好玩的作品来!觉得还有啥好玩的RPG功能?或者是你喜欢的游戏也可以聊聊!

function onup(event){
	isKeyDown = false;
	if(event.offsetX >= ctrlLayer.x + 280 && event.offsetX = ctrlLayer.y+40 && event.offsetY <= ctrlLayer.y+100){
			//对话
			addTalk();
		}
	}
}

原文链接:https://www.icz.com/technicalinformation/web/vue2/2024/04/14746.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?