海贼王游戏--EM游戏06--巧夺天工

今天我们来做块地面系统,让路飞能在一定范围的地面上走动(像DNF那样)

为何叫巧夺天工呢?因为前面讲了游戏地图元素是拼起来的

你可以发现游戏角色在一步一步往后走,地图在不断更新

但如果地图是一张完整的图片的话,肯定很占资源

1.由于地图是拼起来的,所以又要用到ps技术了【无缝连接】当当当当害羞

呵呵,具体怎么做呢,跟着我来吧

首先网上找地面的素材,由于考虑游戏策划的剧情,我们的游戏目前是【路飞营救索罗】

所以地图选城镇,操场的素材

我们先来处理城镇地形

①将我们找好的素材放入ps


②切出一块长方形地皮,切之前必须用修改或图章将很明显的色快去除


③将人物放入图片上比较选择效果好的地皮


④无缝连接:在无缝前必须保证图片充满画布,所以要调整画布大小。

ctrl双击图层选中地皮,ctrl+x剪切,在ctrl+n创建一个新文件,ctrl+v复制即可完成。

⑤选择位移滤镜(这些ps等懂点,抱歉这里不教ps入门哭)


因为图像大小为:


所以我们位移选择宽的一半(因为我们只需要宽无缝就行)


发现图片中间有几根类似直线分割,这就是无缝的结果,单这还不够

⑥用图章或修改工具改正分割线重复⑤,直到分割线不明显,而且滤镜操作次数为奇数次

达到下面效果


⑦调一下颜色


ok不错吧大笑

操场那块地皮同样的原理制作,这里不细说了闭嘴

2.下面回到我们游戏程序中

①地面逻辑是什么样的?

首先地图有一定的长度,而且当角色走到边缘有判断是否过界的逻辑

我们假设

地图宽度 = 1600
地图高度 = 480

然后创建地面精灵

地面图片 = 引擎:载入图片("Dat/地面.jpg")
地面精灵 = D2D_精灵.创建(地面图片,0,0,588,286)


这里要引入一个画面偏移的概念

因为当路飞跑玩屏幕的640像素时,地图应该向做偏移

而人物必须继续走,这是路飞就像在跑步机上跑步一样

地面相对向左滚动,人物好像在原地跑(前提是偏移速度=路飞速度)

我们定义画面偏移如下:

画面偏移.x ,画面偏移.y = 引擎:取画面坐标(路飞信息.x,路飞信息.y,地图宽度,地图高度,640,480)

因为我们说了地面是拼起来的

所以在渲染时通过下面的代码让地图合并

	for n=1,4 do
		地面精灵:显示((n-1)*588 + 画面偏移.x*1.5,300)
	end

代码意思是地图循环显示4个,for循环从1开始,每次加1

为什么是4?开始我们定义了地图为1600像素长

每一个地皮是588像素,(n-1)*588>1600即可

②下面我们看看逻辑程序

function 屏幕逻辑 ()

local dt=引擎:取最后帧时间()

路飞静止动画:更新(dt)
路飞跑动画:更新(dt)
路飞踢动画:更新(dt)
路飞拳动画:更新(dt)
路飞档动画:更新(dt)
路飞跳跃动画:更新(dt)

	if(引擎:取按键事件(键_键盘左)and 路飞信息.x>35)then
			路飞信息.方向="左"
			路飞信息.状态="跑"
			路飞信息.x=路飞信息.x-路飞信息.速度
		elseif(引擎:取按键事件(键_键盘右)and 路飞信息.x < 1565)then
			路飞信息.方向="右"
			路飞信息.状态="跑"
			路飞信息.x=路飞信息.x+路飞信息.速度
	end

	if(引擎:取按键事件(键_键盘上)and 路飞信息.y > 310)then
		路飞信息.状态="跑"
		路飞信息.y=路飞信息.y-路飞信息.速度*1.5
	elseif(引擎:取按键事件(键_键盘下)and 路飞信息.y <450)then
		路飞信息.状态="跑"
		路飞信息.y=路飞信息.y+路飞信息.速度
	end

	if(引擎:取按键事件(键_S))then
		路飞信息.状态="踢"
	
	end

	if(引擎:取按键事件(键_D))then
		路飞信息.状态="拳"
	
	end
	if(引擎:取按键事件(键_A))then	
		路飞信息.状态="档"

	end

	if(引擎:取按键按下(键_W) and 路飞信息.状态 ~= "起跳" and 路飞信息.状态 ~= "落下")then
		路飞信息.状态 = "起跳"
		路飞信息.弹跳力 = 6
		路飞跳跃动画:置当前帧(0)
	end

	if(路飞信息.状态 == "起跳") then
	
		路飞信息.弹跳力 = 路飞信息.弹跳力 - dt * 10
		
		if(路飞信息.弹跳力 >0)then
			路飞信息.y = 路飞信息.y - 路飞信息.弹跳力
		else
			路飞信息.状态 = "落下"
		end
	
	end


	if(路飞信息.状态 == "落下") then
		
		路飞跳跃动画:置当前帧(3)
	
		路飞信息.弹跳力 = 路飞信息.弹跳力 + dt * 10
		
		if(路飞信息.弹跳力<6)then
			路飞信息.y = 路飞信息.y + 路飞信息.弹跳力
		else
			路飞信息.状态 = "静止"
			--路飞信息.y = 地平线
		end
		
	
	end
	
	if (引擎:取按键事件(键_键盘右) == false 
			and 引擎:取按键事件(键_键盘左) == false 
			and 引擎:取按键事件(键_键盘上) == false  
			and 引擎:取按键事件(键_键盘下) == false  
			and 引擎:取按键事件(键_D)==false
			and 引擎:取按键事件(键_A)==false
			and 引擎:取按键事件(键_S)==false
			and 路飞信息.状态~="起跳"
			and 路飞信息.状态~="落下"
			) then
			路飞信息.状态 = "静止"
	end
	
	
	
	画面偏移.x ,画面偏移.y = 引擎:取画面坐标(路飞信息.x,路飞信息.y,地图宽度,地图高度,640,480)	
	
	
	return false
end

第12,16行新增加了2个判断   and 路飞信息.x>35 这是防止路飞走到屏幕外面去

也就是碰撞检测,同样y方向也是一样,至于具体多少数据,按照具体地面,和地皮大小决定
大家可以慢慢调数据到达最合适
③再来看看渲染程序:
function 屏幕渲染 ()
	渲染开始()
	清屏(ARGB(255,128,128,128))
	
	--背景精灵:显示_按区域(0,0,640,480)
	
	
	for n=1,4 do
		地面精灵:显示((n-1)*588 + 画面偏移.x*1.5,300)
	end
	
	if(路飞信息.方向=="右")then
		if(路飞信息.状态=="静止")then
			路飞静止动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,1,1)
		end
		if(路飞信息.状态=="跑")then
			路飞跑动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,1,1)
		end
		if(路飞信息.状态=="踢")then
			路飞踢动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,1,1)
		end
		if(路飞信息.状态=="拳")then
			路飞拳动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,1,1)
		end
		if(路飞信息.状态=="档")then
			路飞档动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,1,1)
		end
		if (路飞信息.状态=="起跳" or 路飞信息.状态=="落下")then
			路飞跳跃动画:显示_高级(路飞信息.x,路飞信息.y+画面偏移.y,0,1,1)
		end
	elseif(路飞信息.方向=="左")then
		if(路飞信息.状态=="静止")then
			路飞静止动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,-1,1)
		end
		if(路飞信息.状态=="跑")then
			路飞跑动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,-1,1)
		end
		if(路飞信息.状态=="踢")then
			路飞踢动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,-1,1)
		end
		if(路飞信息.状态=="拳")then
			路飞拳动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,-1,1)
		end
		if(路飞信息.状态=="档")then
			路飞档动画:显示_高级(路飞信息.x+画面偏移.x,路飞信息.y+画面偏移.y,0,-1,1)
		end
		if (路飞信息.状态=="起跳" or 路飞信息.状态=="落下")then
			路飞跳跃动画:显示_高级(路飞信息.x,路飞信息.y,0,-1,1)
		end
	end

	
	渲染结束()
	return false
end

可以看出,在渲染时,每个动画显示时都加了 画面偏移.x或画面偏移.y
为什么加这个?
因为屏幕逻辑是确定角色该什么速度就什么速度,该什么动作就什么动作。
但是屏幕渲染就不一样了,渲染是呈现最后的屏幕显示的状况。

由于前面渲染时写了地面向后做偏移的动作。

由于物理里面速度的相对运动,路飞要加上地面向后运动的速度才等于自己的速度。

好了基本完成了,路飞的地图滚轴demo就完成了。吐舌头

前面已经把2个模块的代码写出来了

下面把屏幕初始化的代码也写出来

地图宽度 = 1600
地图高度 = 480

--背景图片 = 引擎:载入图片("Dat/背景02.png")
--背景精灵 = D2D_精灵.创建(背景图片,0,110,640,480)


地面图片 = 引擎:载入图片("Dat/地面.jpg")
地面精灵 = D2D_精灵.创建(地面图片,0,0,588,286)


路飞静止图片=引擎:载入图片("Dat/路飞静止.png")
路飞静止动画=D2D_动画.创建(路飞静止图片,3,4,0,0,36,48)
路飞静止动画:播放()
--路飞静止动画:置播放模式(动画_循环播放)
路飞静止动画:置中心点(15,20)

路飞跑图片=引擎:载入图片("Dat/路飞跑.png")
路飞跑动画=D2D_动画.创建(路飞跑图片,8,8,0,0,50,50)
路飞跑动画:播放()
路飞跑动画:置中心点(25,25)


路飞踢图片=引擎:载入图片("Dat/路飞踢.png")
路飞踢动画=D2D_动画.创建(路飞踢图片,8,8,0,0,110,106)
路飞踢动画:播放()
路飞踢动画:置中心点(20,80)

路飞拳图片=引擎:载入图片("Dat/路飞拳.png")
路飞拳动画=D2D_动画.创建(路飞拳图片,3,8,0,0,61,50)
路飞拳动画:播放()
路飞拳动画:置中心点(20,22)

路飞档图片=引擎:载入图片("Dat/路飞档.png")
路飞档动画=D2D_动画.创建(路飞档图片,7,8,0,0,63,70)
路飞档动画:播放()
路飞档动画:置中心点(30,40)

路飞跳跃图片 = 引擎:载入图片("Dat/路飞跳.png")
路飞跳跃动画 = D2D_动画.创建(路飞跳跃图片,4,3,0,0,80,80)
路飞跳跃动画:置中心点(35,45)
路飞跳跃动画:播放()

右键弹起时间=0
左键弹起时间=0


路飞信息={x=200,y=400,状态="静止",方向="右",速度=2,弹跳力=6}
画面偏移={x=0,y=0}

本次编译后的demo下载地址点击打开链接 点击打开链接密码,看了前面几期的朋友都知道哇!!

今天就到这里,感谢各位阅读,下一期我将把后面的房屋,天空等背景加入游戏中

那时候游戏画面将焕然一新,各位期待吧!!!大笑



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值