Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
凸面形状上的JavaScript墙碰撞,在拐角处卡住_Javascript_2d_Collision Detection_Game Physics_Collision - Fatal编程技术网

凸面形状上的JavaScript墙碰撞,在拐角处卡住

凸面形状上的JavaScript墙碰撞,在拐角处卡住,javascript,2d,collision-detection,game-physics,collision,Javascript,2d,Collision Detection,Game Physics,Collision,这是对另一个问题的跟进: 在中给出的代码的启发下,我尝试编写一些新代码 基本上,在原版中,墙滑动在墙的内部工作得非常好,但我想让它在外部也工作,因此我基于他的技术制作了一个新的基本代码引擎: var aD=[] 变量r 函数start(){ r=新画布渲染器(can), my=新场景(); window.my=我的 eventHandler(); my.add(新网格)({ 顶点:[ 0, 0, 100, 15, 115, 60, 50, 100, 20, 75,2,8 ], 职位:{ x

这是对另一个问题的跟进:

在中给出的代码的启发下,我尝试编写一些新代码

基本上,在原版中,墙滑动在墙的内部工作得非常好,但我想让它在外部也工作,因此我基于他的技术制作了一个新的基本代码引擎:

var aD=[]
变量r
函数start(){
r=新画布渲染器(can),
my=新场景();
window.my=我的
eventHandler();
my.add(新网格)({
顶点:[
0,   0,
100, 15,
115, 60,
50, 100,
20, 75,2,8
],
职位:{
x:100,
y:100
},
比例:{
x:4,y:5
},
颜色:“橙色”,
更新(me){
//我,位置++
}
}));
var g=错误
my.add(新网格)({
原语:“rect”,
姓名:“玩家”,
比例:{
x:50,
y:50
},
职位:{
x:311,
y:75
},
来源:{
x:0.5,
y:0.5
},
更新(me){
var upKey=键[38],
向下键=键[40],
右键=键[39],
leftKey=键[37],
drx=0,
dx=0,
速度=5,
转动速度=3
drx=左键?-1:rightKey?1:0
前进=向上键?1:向下键?-1:0
me.rotation.x+=(
(drx*Math.PI/180*turningSpeed)
)
me.rotation.y=1;
var xDir=Math.cos(me.rotation.x)
var yDir=Math.sin(me.rotation.x)
me.position.x+=xDir*前进*速度
me.position.y+=yDir*前进*速度
for(var i=0;i{
var col=checkCollision(
我,位置,x,
我,位置,y,
me.scale.x/2,
L
)
if(col){
me.position.y=col.y
me.position.x=col.x
}
});
}
}
}
}));
设i=setInterval(()=>render(r,my),16);
r、 启用(“调整大小”,()=>渲染(r,my));
}
函数检查冲突(x1、y1、rad、l){
变量距离=距离2(
l、 开始[0],
l、 开始[1],
l、 结束[0],
l、 完[1]
),
vec1=[
x1-l.开始[0],
y1-l.启动[1]
],
vec2=[
l、 结束[0]-l.开始[0],
l、 结束[1]-l.开始[1]
],
墙的百分比=(
马克斯(
0,
Math.min(
1.
圆点(
vec1[0],,
vec1[1],,
vec2[0],,
vec2[1]
)/dist
)
)
),
投影=[
l、 开始[0]+墙百分比*vec2[0],
l、 开始[1]+墙百分比*vec2[1],
],
acDist=Math.sqrt(距离2(
x1,y1,
投影[0],投影[1]
))
广告推送(()=>{
r、 ctx.beginPath()
r、 ctx.fillStyle=“绿色”
r、 弧(投影[0],投影[1],5,0,数学PI*2);
r、 ctx.fill()
r、 ctx.closePath();
})
中频(acDistx());
aD=[]
}
onload=启动;
函数eventHandler(){
window.keys={};
addEventListener(“键控”,e=>{
密钥[e.keyCode]=假;
});
addEventListener(“向下键”,e=>{
键[e.keyCode]=真;
});
}
函数画布渲染器(dom){
如果(!dom)dom=document.createElement(“画布”);
var events={},self=this;
函数rsz(){
dom.width=dom.clientWidth;
dom.height=dom.clientHeight;
self.dispatchEvent(“调整大小”);
}
window.addEventListener(“调整大小”,rsz);
设ctx=dom.getContext(“2d”);
函数渲染(场景){
clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
for(设i=0;i{
设y=i;
ctx.lineTo(
v[0],,
v[1]
);
});
ctx.lineTo(
顶点[0],
顶点[1]
);
ctx.fillStyle=o.color | |“蓝色”;
ctx.lineWidth=1;
ctx.fill()
ctx.stroke();
ctx.closePath();
}
}
对象。定义属性(此{
DOMELENT:{
获取:()=>dom
},	
ctx:{
获取:()=>ctx
},
呈现:{
获取:()=>渲染
},
关于:{
获取:()=>(nm,cb)=>{
如果(!事件[nm]){
事件[nm]=[];
}
事件[nm]。推送(数据=>{
if(cb类型=“函数”){
cb(数据);
}
});
}		
},
调度事件:{
获取:()=>(名称、数据)=>{
如果(事件[名称]){
事件[name].forEach(x=>{
x(数据);
});
}
}
}
});
rsz();
}
函数场景(){
让对象=[];
对象。定义属性(此{
加:{
获取:()=>obj=>{
对象。推送(obj);
}
},
对象:{
获取:()=>对象
},
更新:{
获取:()=>()=>{
objects.forEach(x=>{
if(x.update的类型==“函数”){
x、 更新();
}
});
}
}
});
}
函数网格(数据={}){
设verts=[],
self=这个,
持有人={
位置:{},
比例:{
},
轮换:{},
来源:{}
},
实际={
},
位置={},
比例={},
旋转={},
原点={},
颜色
名称
原始的,
eventNames=“更新”,
事件={},
drawPrimitive={
圆圈(ctx){
ctx.beginPath();
ctx.arc(
self.position.x,
self.position.y,
5.
0,
360*Math.PI/180
);
ctx.closePath()