版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第如何利用Three.js實現(xiàn)跳一跳小游戲目錄前言游戲規(guī)則Three.js整個程序的結(jié)構(gòu)實現(xiàn)html文件引入three.js引擎頁面結(jié)構(gòu)場景相機(jī)幾何體光源渲染添加第二塊跳塊鼠標(biāo)按下狀態(tài)鼠標(biāo)松開彈起狀態(tài)落在哪里結(jié)尾
前言
跳一跳是微信小程序的一個小游戲。長按屏幕讓小人蓄力跳躍,進(jìn)行游玩。按照小人跳躍盒子的數(shù)量,以及特殊盒子加分項計算得分。
游戲地址:不會搞(所以沒放)git地址:/fwjzzz/Jump
游戲規(guī)則
十分簡單:長按鼠標(biāo)蓄力、放手,方塊就會從一個盒子跳到另一個盒子。然而就是這個小動作,讓你一旦開始就魔性地停不下來。
Three.js
Three.js是一款運行在瀏覽器中的3D引擎,你可以用它創(chuàng)建各種三維場景,包括了攝影機(jī)、光影、材質(zhì)等各種對象。
創(chuàng)建一個場景設(shè)置光源創(chuàng)建相機(jī),設(shè)置相機(jī)位置和相機(jī)鏡頭的朝向創(chuàng)建3D渲染器,使用渲染器把創(chuàng)建的場景渲染出來
整個程序的結(jié)構(gòu)
實現(xiàn)
html文件引入three.js引擎
scriptsrc="/js/three.min.js"/script
頁面結(jié)構(gòu)
div
div
div
p本次得分/p
h10/h1
/div
button
重新開始
/button
/div
/div
div
audioloop="loop"autoplaycontrolssrc="/20250413225245/3060206bc37e3226b7f45fa1
49b0fb2b/jdymusic/obj/wo3DlMOGwrbDjj7DisKwe351/984c/1f8b/f6d3165d6b04dc78ec0d3c273ce02ff2.mp3"
/audio
div
得分:span0/span
/div
/div
場景
letscene=newTHREE.Scene();
//創(chuàng)建一個場景
相機(jī)
常用的相機(jī)有兩種:
透視相機(jī)PerspectiveCamera
符合人心理習(xí)慣,近大遠(yuǎn)小。
正視相機(jī)OrthographicCamera
遠(yuǎn)處和近處一樣大
letcamera=newTHREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,1,1000);
//創(chuàng)建一個透視相機(jī)4個參數(shù)(視覺范圍,寬高比例,近距離,遠(yuǎn)距離)
camera.position.z=10;
camera.position.y=3;
camera.position.x=8;
//相機(jī)的xyz場景方向
幾何體
使用CubeGeometry創(chuàng)建一個立方幾何體,使用MeshLambertMaterial材質(zhì)用來配置立方體渲染看上去暗淡不光亮的表面,該材質(zhì)會對場景中的光源產(chǎn)生反應(yīng),這個材質(zhì)可以配置一些其他屬性如:顏色等。
letgeometry=newTHREE.CubeGeometry(4,2,4);
//創(chuàng)建一個幾何體對象(寬,高,深度)
letmaterial=newTHREE.MeshLambertMaterial({color:0xbebebe});
//創(chuàng)建了一個可以用于立方體的材質(zhì),對象包含了顏色、透明度等屬性,
letcube=newTHREE.Mesh(geometry,material);
//結(jié)合在一起
cube.position.x=16;
scene.add(cube);
//添加到場景中
光源
場景Scene主要是由幾何體模型和光Light構(gòu)成,在實際開發(fā)過程中,大多數(shù)三維場景往往需要設(shè)置光源,通過不同的光源對模型模擬生活中的光照效果,尤其是為了提高Threejs的渲染效果更需要設(shè)置好光源,就像攝影師拍照要打燈一樣。
letdirectionalLight=newTHREE.DirectionalLight(0xffffff,1.1);
//平行光(顏色,強(qiáng)度)
directionalLight.position.set(3,10,5);
//平行光位置
scene.add(directionalLight);
//在場景中加入平行光
letlight=newTHREE.AmbientLight(0xffffff,0.4);
//光的材質(zhì)
scene.add(light);
//把光添加到場景
渲染
直接通過WebGL渲染器WebGLRenderer的.setSize()方法設(shè)置渲染尺寸為瀏覽器body區(qū)域?qū)捀叨取?/p>
letrenderer=newTHREE.WebGLRenderer({antialias:true});
//創(chuàng)建一個渲染器(讓邊緣動畫沒有鋸齒感)
renderer.setSize(window.innerWidth,window.innerHeight);
//畫布寬高
renderer.setClearColor(0x282828);
//修改畫布顏色
renderer.render(scene,camera);
//渲染場景相機(jī)(后續(xù)更新也是這里)
document.body.appendChild(renderer.domElement);
//把當(dāng)前渲染的畫布放到body里面
letx=8;
functionrender(){
//遞歸
x-=0.1;
camera.position.x=x;
renderer.render(scene,camera);
//更新重新渲染
if(x=-8){
//滿足當(dāng)前條件
requestAnimationFrame(render)
//循環(huán)渲染
}
目前為止實現(xiàn)了一個雛形
添加第二塊
_createCube(){
letgeometry=newTHREE.CubeGeometry(this.config.cubeWidth,this.config.cubeHeight,this.config.cubeDeep);
//創(chuàng)建一個幾何體對象(寬,高,深度)
letmaterial=newTHREE.MeshLambertMaterial({
color:this.config.cubeColor
//材質(zhì),對象包含了顏色、透明度等屬性,
letcube=newTHREE.Mesh(geometry,material);//合并在一起
if(this.cubes.length){
//從第二塊開始隨機(jī)左右方向出現(xiàn)
cube.position.x=this.cubes[this.cubes.length-1].position.x;
cube.position.y=this.cubes[this.cubes.length-1].position.y;
cube.position.z=this.cubes[this.cubes.length-1].position.z;
this.cubeStat.nextDir=Math.random()0.5"left":"right";//要不左邊要不右邊
if(this.cubeStat.nextDir=="left"){
//左邊改變x軸否則y軸
cube.position.x=cube.position.x-Math.round(Math.random()*4+6);
}else{
cube.position.z=cube.position.z-Math.round(Math.random()*4+6);
this.cubes.push(cube);//統(tǒng)一添加塊
if(this.cubes.length5){
//頁面最多看到5個塊
this.scene.remove(this.cubes.shift());//超過就移除
this.scene.add(cube);//添加到場景中
if(this.cubes.length1){
//更新鏡頭位置
this._updateCameraPros();
};
定義一個方塊數(shù)組,判斷從第二塊開始向左右兩邊隨機(jī)出現(xiàn)。this.cubeStat.nextDir=Math.random()0.5left:right如上圖:(這是由兩張圖組成的)
跳塊
_createJumper(){
letgeometry=newTHREE.CubeGeometry(this.config.jumperWidth,this.config.jumperHeight,this.config
.jumperDeep);//(寬,高,深度)
letmaterial=newTHREE.MeshLambertMaterial({
color:this.config.jumperColor
});//材質(zhì),顏色、透明度
this.jumper=newTHREE.Mesh(geometry,material);//合并在一起
this.jumper.position.y=1;//顯示跳塊
geometry.translate(0,1,0);//平移
this.scene.add(this.jumper);//添加到場景中
}
使用Geometry幾何體對象有一系列的頂點屬性和方法,通過.scale()、.translate()、.rotateX()等方法可以對幾何體本身進(jìn)行縮放、平移、旋轉(zhuǎn)等幾何變換。注意本質(zhì)上都是改變結(jié)合體頂點位置坐標(biāo)數(shù)據(jù)。
鼠標(biāo)按下狀態(tài)
this.jumperStat={
//鼠標(biāo)按下速度
ready:false,
xSpeed:0,
ySpeed:0
};
_handleMouseDown(){
if(!this.jumperStat.readythis.jumper.scale.y0.02){
this.jumper.scale.y-=0.01;//壓縮塊
this.jumperStat.xSpeed+=0.004;
this.jumperStat.ySpeed+=0.008;
this._render();
requestAnimationFrame(()={
this._handleMouseDown()
};
鼠標(biāo)松開彈起狀態(tài)
人生不就是這樣嗎?只要你跳對了位置,就能夠逆襲!
//鼠標(biāo)松開談起狀態(tài)
_handleMouseUp(){
this.jumperStat.ready=true;
if(this.jumper.position.y=1){
if(this.jumper.scale.y1){
this.jumper.scale.y+=0.1;//壓縮狀態(tài)小于1就+
if(this.cubeStat.nextDir=="left"){
//挑起盒子落在哪里
this.jumper.position.x-=this.jumperStat.xSpeed;
}else{
this.jumper.position.z-=this.jumperStat.xSpeed;
this.jumper.position.y+=this.jumperStat.ySpeed;
this.jumperStat.ySpeed-=0.01;//上升落下狀態(tài)
this._render();
requestAnimationFrame(()={
//循環(huán)執(zhí)行
this._handleMouseUp();
}else{
//落下狀態(tài)
this.jumperStat.ready=false;
this.jumperStat.xSpeed=0;
this.jumperStat.ySpeed=0;
this.jumper.position.y=1;
this.jumper.scale.y=1;
this._checkInCube();//檢測落在哪里
if(this.falledStat.location==1){
//下落后等于1,+分?jǐn)?shù)
this.score++;
this._createCube();
this._updateCamera();
if(this.successCallback){
//否則失敗
this.successCallback(this.score);
}else{
this._falling()
};
落在哪里
學(xué)會控制速度感是非常奇妙的事情。當(dāng)你慢下來了,學(xué)會控制速度。因為在每一個過程當(dāng)中,都有你生命中值得停下來瀏覽、欣賞、感受的事物。在我們的認(rèn)知中,總覺得越快,擁有的時間就越多,效率就越高,生產(chǎn)力就提高。其實并不是。如果你的頭腦常常處在思維高速運轉(zhuǎn)的狀態(tài),一定會感覺繁忙且毫無頭緒;如果你總是擔(dān)心著未來或者掛念過去,就無法專注在當(dāng)下所做的事,也一定感到時間不夠用,效率大大降低。
this.falledStat={
location:-1,//落在哪里當(dāng)前塊塊上
distance:0,//距離是否倒下
this.fallingStat={
//有沒有落到點
end:false,
speed:0.2
}
//檢測落在哪里
//-1-10從當(dāng)前盒子掉落
//1下一個盒子上10從下一個盒子上掉落
//0沒有落在盒子上
_checkInCube(){
letdistanceCur,distanceNext;
//當(dāng)前盒子距離下一個盒子距離
letshould=(this.config.jumperWidth+this.config.cubeWidth)/2;
if(this.cubeStat.nextDir=="left"){
//往左走了
distanceCur=Math.abs(this.jumper.position.x-this.cubes[this.cubes.length-2].position.x);
distanceNext=Math.abs(this.jumper.position.x-this.cubes[this.cubes.length-1].position.x);
}else{
//往右走了
distanceCur=Math.abs(this.jumper.position.z-this.cubes[this.cubes.length-2].position.z);
distanceNext=Math.abs(this.jumper.position.z-this.cubes[this.cubes.length-1].position.z);
if(distanceCurshould){
//落在當(dāng)前塊
this.falledStat.distance=distanceCur;
this.falledStat.location=distanceCurthis.config.cubeWidth/2-1:-10;
}elseif(distanceNextshould){
//落在下一個塊上
this.falledStat.distance=distanceNext;
this.falledStat.location=distanceNextthis.config.cubeWidth/21:10;
}else{
//落在中間
this.falledStat.location=0;
};
落到方塊上,停上一會兒,放松自己,亦會有十分的額外獎勵。人生路上,匆匆忙忙趕路的時候,不要忘了適度休息調(diào)整,你會有意外地收獲,命運的魔方會給你別致的驚喜。人生很短,何須急著走完。
//下落過程
_falling(){
if(this.falledStat.location==10){
//從下一個盒子落下
if(this.cubeStat.nextDir=="left")
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026云南昆明高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)管理委員會招聘18人備考題庫附答案
- 2026農(nóng)業(yè)農(nóng)村部國際交流中心面向社會招聘編制外人員招聘2人備考題庫附答案詳解(能力提升)
- 2026安徽馬鞍山當(dāng)涂法院招聘1人備考題庫附參考答案詳解(達(dá)標(biāo)題)
- 2026廣東東莞市石碣鎮(zhèn)招聘編外聘用人員5人備考題庫帶答案詳解(培優(yōu))
- 2026福建漳州市詔安縣機(jī)關(guān)事業(yè)單位社會保險中心招募見習(xí)人員2人備考題庫及答案詳解(奪冠系列)
- 2026陜西西安市高陵區(qū)殘疾人專職委員選聘3人備考題庫帶答案詳解
- 2026黑龍江二龍濤濕地省級自然保護(hù)區(qū)管護(hù)中心公益性崗位招聘5人備考題庫及參考答案詳解1套
- 2026河南周口鹿邑縣德源中學(xué)招聘備考題庫及1套完整答案詳解
- 2026聊城陽谷法院勞務(wù)派遣招聘備考題庫及1套參考答案詳解
- 2026福建省融資擔(dān)保有限責(zé)任公司社會招聘3人備考題庫及1套完整答案詳解
- 水產(chǎn)養(yǎng)殖技術(shù)手冊
- 英國汽車工業(yè)市場分析現(xiàn)狀供需格局投資前景未來規(guī)劃研究報告
- 2025年及未來5年市場數(shù)據(jù)中國吸塑、注塑行業(yè)發(fā)展前景預(yù)測及投資戰(zhàn)略數(shù)據(jù)分析研究報告
- 眼科醫(yī)療風(fēng)險防范培訓(xùn)
- 物流金融理論與實務(wù)課件
- 海內(nèi)外云廠商發(fā)展與現(xiàn)狀(三):資本開支壓力與海外云廠需求情況拆解-國信證券
- 2025年社區(qū)網(wǎng)格員招錄考試真題庫(含答案)
- GB/T 46510-2025玩具水基材料中游離甲醛的測定高效液相色譜法
- 溴化鋰清洗施工方案
- 第四方支付業(yè)務(wù)合規(guī)指引
- 手勢舞基本功課件
評論
0/150
提交評論