『小熊带你玩科技』KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下,如何用2( 七 )


文章图片
线框轮廓显示了每一个被渲染的多边形 。
letsegment2=road[s+drawDistance];//storethelastsegmentfor(i=drawDistance;i--;)//iterateinreverse{//getprojectedroadpointssegment1=road[s+i];p1=segment1.p;p2=segment2.p;//randomseedandlightingrandSeed=startRandSeed+s+i;light=Math.sin(segment1.a)*Math.cos(heading)*99;//checknearandfarclipif(p1.z<1e5&&p1.z>0){//fadeinroadresolutionoverdistanceif(i%(Lerp(i/drawDistance,1,9)|0)==0){//groundDrawPoly(c.width/2,p1.y,c.width/2,c.width/2,p2.y,c.width/2,LSHA(25+light,30,95));
//curbifwideenoughif(segment1.w>400)DrawPoly(p1.x,p1.y,p1.z*(segment1.w+curbWidth),p2.x,p2.y,p2.z*(segment2.w+curbWidth),LSHA(((s+i)%19//roadandcheckpointmarkerDrawPoly(p1.x,p1.y,p1.z*segment1.w,p2.x,p2.y,p2.z*segment2.w,LSHA(((s+i)*segmentLength%checkPointDistance<300?70:7)+light));//dashedlinesifwideandcloseenoughif((segment1.w>300)&&(s+i)%9==0&&i<drawDistance/3)DrawPoly(p1.x,p1.y,p1.z*dashLineWidth,p2.x,p2.y,p2.z*dashLineWidth,LSHA(70+light));
//savethissegmentsegment2=segment1;}
绘制道路上的树和石头
这个游戏只有两种不同类型的物体:树和石头 , 它们是被渲染在道路上的 。 首先 , 我们使用「R()」函数来确定是否存在对象 。 这是种子随机数厉害的地方之一 。 我们还将使用「R()」为对象添加随机形状和颜色变化 。
一开始我想要其他的车辆 , 但如果不进行大幅裁剪 , 就不能满足空间限制 , 所以我使用风景作为障碍 。 这些风景的位置是随机的 , 而且倾向于接近道路 , 否则他们就会变得很稀疏 , 而且很容易通过 。 为了节省空间 , 对象的高度也决定了对象的类型 。
在这里可以通过比较玩家和物体在3D空间中的位置来检查它们之间的碰撞 。 当一个物体被击中时 , 玩家会放慢速度 , 并将该物体标记为击中 , 这样它就可以安全地通过 。
为了防止物体突然出现在地平线上 , 透明效果会随着距离的增加而减弱 。 由于我前面提到的神奇的种子随机函数 , 对象的形状和颜色使用了带有变化的梯形绘制函数 。
『小熊带你玩科技』KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下,如何用2
文章图片
if(R()29)//isthereanobject?{//playerobjectcollisioncheckx=2*roadWidth*R(10,-10)*R(9);//chooseobjectposconstobjectHeight=(R(2)|0)*400;//choosetreeorrockif(!segment1.h//donthitsameobject&&Math.abs(position.x-x)&&Math.abs(position.z-(s+i)*segmentLength)&&position.y-height{//slowplayerandmarkobjectashitvelocity=velocity.Multiply(segment1.h=collisionSlow);}
//drawroadobjectconstalpha=Lerp(i/drawDistance,4,0);//fadeinobjectif(objectHeight){//treetrunkDrawPoly(x=p1.x+p1.z*x,p1.y,p1.z*29,x,p1.y-99*p1.z,p1.z*29,LSHA(5+R(9),50+R(9),29+R(9),alpha));//treeleavesDrawPoly(x,p1.y-R(50,99)*p1.z,p1.z*R(199,250),x,p1.y-R(600,800)*p1.z,0,LSHA(25+R(9),80+R(9),9+R(29),alpha));}else{//rockDrawPoly(x=p1.x+p1.z*x,p1.y,p1.z*R(200,250),x+p1.z*(R(99,-99)),p1.y-R(200,250)*p1.z,p1.z*R(99),LSHA(50+R(19),25+R(19),209+R(9),alpha));}}}}
绘制HUD , 更新时间 , 请求下一个更新
游戏的标题、时间和距离是通过一个非常简单的字体渲染系统显示的 , 该系统使用了我们之前设置的DrawText函数 。 在玩家点击鼠标之前 , 它会将标题显示在屏幕中央 。 这是我非常自豪的部分——能够显示游戏标题并使用粗体的「impact」字体 。 如果我面临的空间上的要求更紧一些 , 这些东西会是第一个被我删掉的 。


推荐阅读