用户:
WMoSo岛同号查看:5 回复:9 评论:5 创建时间:2024-06-27T16:56:49
先上图:
大概意思就是这个代码停不下来了
但是怎么解决啊
附:index.js源代码
//合作者守则:
//1.所有语句后加分号
//2.需要大计算量/含有等待函数 的语句尽量用async异步执行,尤其是server端代码
//3.尽量不用Switch语句 (代码的圈复杂度不应大于10)
//4.变量,函数,对象等命名尽量采用小驼峰命名法,类(class)使用大驼峰命名法
//5.无论如何不要删除地图四方的空气墙设置代码,否则容易导致玩家体验极差!
//6.将重复的功能封装成函数。作为代码师,不要认为只有玩家看到的才存在,那些节省无数时间的封装函数也是开发的一部分
//7.我们有义务查找代码中的bug,且有义务防止玩家的误操作引发error
//8.居家必备技能:释放内存 时刻控制内存占用,该删的就删,能减少一微秒也行
console.clear();
console.log("a new running");
//全局初始设置
world.placeVoxelSound = '' // 关掉方块替换时的默认声音
//纪念碑阵设置
const startPoint = world.querySelector('#碑阵');
startPoint.enableInteract=true;
startPoint.interactRadius=3;
startPoint.interactHint="项目纪念";
startPoint.interactColor=new GameRGBColor(1,1,0);
//纪念碑阵程序
startPoint.onInteract(async({entity})=>{
startPoint.meshOrientation=startPoint.meshOrientation.rotateY(Math.PI*1/3);
textDia("该项目于2024.4.13开启\n没想到,已经过了这么长的时间","启动纪念",entity);
});
//基地遗迹的大门
const oldGate=world.querySelector("#遗迹大门");
oldGate.enableInteract=true;
oldGate.interactRadius=3;
oldGate.interactHint="一扇古老的木门";
oldGate.interactColor=new GameRGBColor(1,1,1);
//遗迹大门互动代码
oldGate.onInteract(async({entity})=>{
oldGate.position.z=oldGate.position.z+5;
entity.player.directMessage("门将在2秒后关闭");
await sleep(2000).then(()=>{
oldGate.position.z=oldGate.position.z-5;
});
});
//致谢面板互动设置
const thankBoard=setInteract("致谢名单",4,hint="致谢",color=new GameRGBAColor(1,1,1,1),isEnable=true);
//致谢面板互动
thankBoard.onInteract(async({entity})=>{
await textDia("对以下贡献者/协作者表示感谢:\n小苏打__\n\n以及模型的提供者,\nMoSo找不到他们的名字,在此一并致谢","致谢",entity);
});
//☆空气墙(看过了,没法封装函数,现在就这样了)
var x=0;var y=0;var z=0;
for(let x=0;x<257;x++){
for(let y=0;y<257;y++){
voxels.setVoxel(x,y,0,"barrier");
voxels.setVoxel(x,y,254,"barrier");
}
}for(let z=0;z<257;z++){
for(let y=0;y<257;y++){
voxels.setVoxel(0,y,z,"barrier");
voxels.setVoxel(254,y,z,"barrier");
}
}
//遗迹的告示牌配置
const board1=setInteract("遗迹告示牌",3,hint="一块告示牌",color=new GameRGBAColor(1,1,1,1));
//遗迹告示代码
board1.onInteract(async({entity})=>{
await textDia("时空的落叶飘回200年前……","基地遗迹", entity);
await textDia("也许这座建在现在显得局促,但曾经,它是唯一的碉堡。","基地遗迹",entity);
await textDia("现在还是。","基地遗迹",entity);
await textDia("我们不会忘记。","基地遗迹",entity);
});
//新基地-通向外部的大门
const door1=setInteract("门-基地外",3,hint="开门",color=new GameRGBAColor(12,1,1,1));
//代码
door1.onInteract(async({entity})=>{
door1.position.z=door1.position.z+2.5;
entity.player.directMessage("门将在2秒后关闭");
await sleep(2000).then(()=>{
door1.position.z=door1.position.z-2.5;
});
});
//常见函数封装
async function textDia(text,title,entity){
await entity.player.dialog({
type:GameDialogType.TEXT,
content:text,title:title
});
}async function selectDia(text,title,entity,options){
return await entity.player.dialog({
type:GameDialogType.SELECT,
content:text ,title:title,
options:options
});
}
//自动设置互动
//参数从左到右依次为:实体名,互动距离,显示名称(默认为实体名),字体颜色,是否开启互动(默认为TRUE)
function setInteract(name,radius,hint=name,color,isEnable=true){
const entitySelf=world.querySelector(`#${name}`);
entitySelf.enableInteract=isEnable;
entitySelf.interactRadius=radius;
entitySelf.interactHint=hint;
entitySelf.interactColor=color;
return entitySelf;
}
//生成范围随机数的函数
function chioceRand(min,max){
var rand=Math.random()*(max-min)+min;
return rand;
}
//返回一个范围内的随机坐标(传入两个三维向量)
function areaRand(start,end){
var playerX=chioceRand(start.x,end.x);
var playerY=chioceRand(start.y,end.y);
var playerZ=chioceRand(start.z,end.z);
var result=new GameVector3(playerX,playerY,playerZ);
return result;
}
//接下来是装扮时间
//每种装备都有作用域(左手leftHand,右手rightHand,身体body)
//定义子弹类(近战武器的子弹是一个不可见实体)
var bulletSet=new Set([]);
class Bullet{
constructor(range,mesh,startPos,owner){
if(range<=5){this.near=true;}else{this.near=false}//attack距离小于6的都是近战武器
this.mesh=mesh;
this.tick=0;this.owner=owner;
this.ownerKey=this.owner.userKey
this.range=range;
this.startPos=startPos;
this.bulID=`bul${Math.random()*10000}`;//这里记住,地图的最大承载量是10000发子弹同时存在
while(bulletSet.has(this.bulID)){//查重
this.bulID=`bul${Math.random()*10000}`;
}
bulletSet.add(this.bulID);//正式添加
while(!bulletSet.has(this.bulID)){
bulletSet.add(this.bulID);//验证是否已添加,如无,则重新添喵弹本体的出厂设置,所有子弹都有
this.body=world.createEntity({
id:this.bulID,
mesh:this.mesh,
position:this.startPos
});
if(this.near){this.body.meshInvisible=true;}
this.body.collides=true;
}
}
//定义手上装备基类HandHold
class HandHold{
constructor(entity,bulletMesh,selfMesh,range){
this.entity=entity;
this.bulletMesh=bulletMesh;
this.range=range;
this.selfMesh=selfMesh
this.heightScale=0.2
this.bullet=null;
};
fire(){
this.bullet=new Bullet(this.range,this.bulletMesh,this.entity.player.position,
this.entity.player.userKey);
this.bullet.newobject();
while(!this.bullet.body.destroyed){}
this.bullet=null;
}
}
//玩家本体代码
world.onPlayerJoin(async({entity})=>{
var leftHand=new HandHold(entity,"mesh/萨卡班甲鱼.vb","mesh/斯帕伦.vb",20);
var rightHand=null;
var body=null;console.log(entity.player.position);
//现在初始化穿戴
entity.player.addWearable({
bodyPart:GameBodyPart.LEFT_HAND,
mesh:leftHand.selfMesh,
scale:new GameVector3(leftHand.heightScale,leftHand.heightScale,leftHand.heightScale),
offset:new GameVector3(0,0,0.15)
});
//右键属性面板
world.onPress(async({button,raycast})=>{
if(button != GameButtonType.ACTION0){
leftHand.fire();
}
});
}
JavaScript中出现 "Script failed to terminate" 的报错通常是由于代码中出现了无限循环或者长时间运行的情况导致浏览器无法正常结束脚本执行引起的。这种问题可能导致浏览器响应缓慢甚至崩溃。
通常出现这个问题的原因有:
无限循环:代码中存在没有结束条件的循环,导致脚本无法正常结束。
while (true) {
// 无限循环导致脚本无法终止
} 长时间运行的操作:某些操作可能会消耗大量的时间,例如处理大数据集或者复杂的算法,如果没有进行适当的优化,可能会导致脚本执行时间过长,浏览器认为脚本未能正常终止。
递归调用问题:递归函数如果没有正确的退出条件,可能会导致无限递归,最终导致脚本无法正常结束。
为了解决这个问题,你可以考虑以下几点:
检查代码中的循环和递归调用:确保每个循环都有明确的退出条件,避免无限循环。
优化代码:尽量避免长时间运行的操作,可以考虑使用异步操作或者分批处理数据。
适当的错误处理:对可能发生的异常情况进行适当的错误处理,避免因为未处理的异常导致脚本执行异常终止。
通过这些方法,你应该能够更好地定位并解决 "Script failed to terminate" 的问题。
以上内容由ChatGPT 3.5生成
点赞2
评论