
最近一款簡(jiǎn)單粗暴的微笑小游戲又來(lái)了,打企鵝!其實(shí)老實(shí)說(shuō),這個(gè)游戲我小學(xué)的時(shí)候就在4399上玩過(guò),現(xiàn)在改成了微信版的小手游,通過(guò)分享的形式著實(shí)是火了一把:鼠標(biāo)一點(diǎn)就可以把企鵝揍遠(yuǎn),最后看距離比誰(shuí)遠(yuǎn)。電腦上可以再這里試玩點(diǎn)擊前往,不過(guò)不能分享到朋友圈就是。下面是我打出來(lái)的截圖:
我們來(lái)看看,決定企鵝飛行成績(jī)的代碼部分,雖然我也不是很懂js代碼,不過(guò)可以通過(guò)下面的代碼看出一般性的問(wèn)題了:
Main.flyLine = function(angle){var speedRate = 7;var gRate = 100;var flyBird;var stage = Main.stage;var fps = Main.fps;var startX = 0;var startY = 0;var sWidth = Main.width;var sHeight = Main.height;var flySpeed = Main.speed * (Math.random() * 0.2 + 0.8) * speedRate;var flyRad;function initFlyLine() { // code here. //Main.stage.removeChild(Main.penguin);Main.penguin.alpha = 0;flyRad = angleToRad(angle); var flyData = { images: ["/vapp/52/fly.png"], frames: {width:180, height:170}, animations: {fly:[0,2]}, framerate: 6 }; var spriteSheet = new createjs.SpriteSheet(flyData); flyBird = new createjs.Sprite(spriteSheet, "fly"); flyBird.regX = 105; flyBird.regY = 105; stage.addChild(flyBird); startFly();}var tParam = 0;var g = 9.8 * gRate;function clock(){tParam += 1/fps;moveBird(flySpeed, flyRad);// stage.update();}function stageMove(difDistance, totalDistance){Main.fire("moveStage", difDistance, totalDistance);}var offsetX = Main.penguinOffsetX;var offsetY = Main.height - Main.floorLine + 32;var flyStageDistance = Main.visibleDistance;var fadeCnt = 0;// var hitOffsetY = 100;//鍦板鉤綰夸笌鍑?yán)L墦鐨勮窛紱?var hitOffsetY = Main.floorLine - Main.penguin.y - Main.penguinHeight / 2;var tween;function moveBird(speed, rad){var x = speed * Math.cos(rad) * tParam;var y = speed * Math.sin(rad) * tParam - 1/2 * g * square(tParam) + hitOffsetY;//v0*sina-1/2gt2var vy = speed * Math.sin(rad) - g * tParam;var vx = speed * Math.cos(rad);var slope = -g / square(speed) / square(Math.cos(rad)) * x + Math.sin(rad) / Math.cos(rad);flyBird.rotation = slope * angle;var dif = vx * 1/fps;if(x + startX > flyStageDistance){stageMove(dif, x + startX);}else{flyBird.x = sWidth - offsetX - (x + startX);}//circle.x = (x + startX);//circle.y = y;flyBird.y = sHeight - offsetY - y;if(y <= 0 && slope < 0){//resettParam = 0;startX += x;startY = 0;flySpeed = speed * 2.2 / 3;flyRad = rad * 2.2 / 3;fadeCnt ++ ;Main.log(fadeCnt);stopFly();hitOffsetY = 0;Main.log(flyBird.rotation)if(Math.abs(flyBird.rotation) >= 46 && fadeCnt == 1){turnDown(flyBird.x, flyBird.y, "down");stopFly();gameOver(x + startX);return;}if(fadeCnt == 3){//end gamestopFly();var slideTime = Math.cos(rad) * 800;addLongTrace(x, dif, slideTime);}else{tween = createjs.Tween.get(flyBird, {loop:false}).to({rotation:0}, 50, createjs.Ease.bounceOut).call(function(){startFly();createjs.Tween.removeTweens(tween);});addTrace(dif);}}}var longTracer;function addLongTrace(xPass, dif, timeC){longTracer = new createjs.Bitmap(Resource.get("/vapp/52/longtraces.png"));stage.addChild(longTracer);longTracer.width = 452;longTracer.height = 14;longTracer.regX = 452;longTracer.regY = -17;longTracer.x = flyBird.x;longTracer.y = flyBird.y;createjs.Ticker.addEventListener("tick", longTracerClock);function longTracerClock(){longTracer.x += dif;stageMove(dif, xPass + startX + 452);}setTimeout(function(){turnDown(flyBird.x, flyBird.y, "slide");createjs.Ticker.removeEventListener("tick", longTracerClock);gameOver(xPass + startX + 452);}, timeC);var rect = new createjs.Shape(); rect.graphics.setStrokeStyle(5, 'round', 'round'); rect.graphics.beginFill("#FF0000").drawRect(0,0,460, 40); rect.graphics.endStroke();rect.x = 200;rect.y = 790;//stage.addChild(rect);longTracer.mask = rect;}function addTrace(dif){var totalD = 0;var tracer = new createjs.Bitmap(Resource.get("/vapp/52/traces.png"));stage.addChild(tracer);tracer.width = 145;tracer.height = 45;tracer.regX = 92;tracer.regY = -18;tracer.x = flyBird.x;tracer.y = flyBird.y;createjs.Ticker.removeEventListener("tick", tracerClock);createjs.Ticker.addEventListener("tick", tracerClock);function tracerClock(){tracer.x += dif;totalD += dif;if(totalD > sWidth * 2 / 3){Main.log("鍥炴敹鐥曡抗");createjs.Ticker.removeEventListener("tick", tracerClock);stage.removeChild(tracer);}}}function turnDown(fx, fy, status){Main.stage.removeChild(flyBird);var spriteSheet = Main.gameOverPenguinSS;flyBird = new createjs.Sprite(spriteSheet);Main.stage.addChild(flyBird);flyBird.gotoAndPlay(status);flyBird.x = fx - 120;flyBird.y = fy - 112; }function gameOver(distance){//todoMain.fire("gameOver", distance, flyBird.x);}Main.on("replay", function(){// 鍨冨溇鍥炴敹if(longTracer){Main.log("longTracerDisp")stage.removeChild(longTracer);}stage.removeChild(flyBird);flyBird = null;stopFly();});function stopFly(){ createjs.Ticker.removeEventListener("tick", clock);}function startFly(){stopFly();clock();createjs.Ticker.addEventListener("tick", clock);}function angleToRad(angle){return Math.PI / 180 * angle;}//2function square(num){return num * num}initFlyLine(angle);}
我們可以看出大概,企鵝飛行的距離和以下這些因素有關(guān),想詳細(xì)看的可以展開(kāi),想直接看結(jié)論的可以朝后看:
1.角度
企鵝飛行的角度決定了速度的分解,設(shè)角度為α,速度v:
橫向的速度:v*cosα:決定了飛出去有多快;
縱向的速度:v*sinα:決定了能飛多高。
可以根據(jù)物理學(xué)知識(shí)算出來(lái),45°飛的最遠(yuǎn),這里就是贅述了。
2.速度
游戲還儼然的定義了g=9.8(23333蠻科學(xué)的),縱向速度決定飛多高,而高度又決定了飛行的時(shí)間。
橫向速度和時(shí)間的乘積就是距離。
所以,速度很重要就是了!我們要問(wèn)這個(gè)速度又是怎么決定的呢?請(qǐng)看代碼:var flySpeed = Main.speed * (Math.random() * 0.2 + 0.8) * speedRate;
,可知速度完全是個(gè)運(yùn)氣活,如果滿速度是1,我們能獲得的速度是個(gè)0.8-1.0之間的平均數(shù)!
3.彈起的次數(shù)
最后的結(jié)果是幾次彈起距離之和。
而能彈起幾次還是和高度有關(guān)。
所以知道了規(guī)則后,不難發(fā)現(xiàn)這個(gè)游戲?qū)嶋H上很科學(xué)的,理論上達(dá)到以下就可以拿到好成績(jī)了:
1.角度,45°出擊。
2.速度,看RP,能達(dá)到1.0就是最棒的。
好了,寫(xiě)了這么多大家可以去試一試了!
愛(ài)華網(wǎng)本文地址 » http://www.klfzs.com/a/25101011/51419.html
愛(ài)華網(wǎng)


