今天我们来做块地面系统,让路飞能在一定范围的地面上走动(像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下载地址点击打开链接 点击打开链接密码,看了前面几期的朋友都知道哇!!
今天就到这里,感谢各位阅读,下一期我将把后面的房屋,天空等背景加入游戏中
那时候游戏画面将焕然一新,各位期待吧!!!