Articles of JavaScript

解决球体碰撞之间的旋转问题

我开发了一个碰撞检测器来返回碰撞数据,如碰撞正常,碰撞点,相互穿透等。 现在我正在开发一个碰撞求解器。 碰撞求解器正确计算碰撞后的线性运动,但不能计算碰撞后的旋转。 这是解决问题的图像 为了计算碰撞后的速度,我给每个物体施加一个impulse ,这个脉冲能够正确计算线性运动。 现在,要计算旋转变化,我需要应用下面的公式 ImpulsiveTorque = RelativePoint.cross(Impulse); RotationChange = InverseInertiaTensorWorld.transform(ImpulsiveTorque); 问题是ImpulsiveTorque很小,以产生可见的旋转变化。 以下对应于我的球形球碰撞检测器 sphereAndSphere : function(one, two){ var oneToTwo = one.position.sub(two.position); var oneToTwoLength = oneToTwo.length(); if (oneToTwoLength < 0 || oneToTwoLength > one.radius + two.radius){ return -1; } var normal = oneToTwo.divideByScalar(oneToTwoLength); var data = new Collision(); data.normal = normal; data.point = one.position.add(oneToTwo.multiplyByScalar(0.5)); […]

ECS – 组件内部的组件?

阅读ECS,如果你可以称之为“游戏”,我试图实现一个简单的“游戏”。 基本概念 : 你有行星(实体),他们生产黄金。 ( 黄金是地球内部的一个组成部分) 行星可以自己建造建筑物( 建筑物部分) 建筑物(实体)具有相关的黄金成本( 成本部分) 但是成本组件中有黄金 (或无论如何) 至于我的问题: 我接近我对ECS的解释(组件是否应该在其他组件内?) 资源是否是有效的组件? 如果不是的话,放置它们在哪里是有意义的? 编辑清晰度: ECS – 实体 – 组件系统。 我的实体是组件的空哈希表。 我的组件用于游戏逻辑的系统内部,Treasury实体具有Gold组件,IncomeSystem更新该组件。 其他组件(可建设,人口,可移动)

cron工作为MMO浏览器比赛

我必须在我的MMO浏览器游戏中实现cron作业。 就像在Travian游戏中 – 你建立了一些东西,然后等待几分钟或几小时..但是问题是,shedulers所做的每一秒/每分钟/每天等工作。但在我的游戏中,我需要shedule成千上万同样的工作,必须分开运行,经过一段独特的时间后才能发布。 到目前为止,我对这个想法感到不幸。 我正在使用Node.js,我只是尝试了这么多的节点shedulers,他们似乎不应该有成千上万的工作..我可以运行几个唯一的唯一。 我也许可以做一个类似cron的工作,每运行1秒钟,检查Redis DB是否完成任何工作。 但是,这听起来很疯狂..如果我只有几个工作,他们只在24 hous,我的服务器检查,每1秒..任何想法我该怎么办? 到目前为止,最好的select是删除cron作业。 我正在做一些没有cron工作的stream程。 但其他进程真的很难计算,而且用cron作业要容易得多。 但我更深入,我认为有可能计算eveyrthing和模拟一切没有cron工作。 例如,用户具有统计模型内的资源。 我有小时资源收入那里。 如果用户想要构建任何东西,例如陷阱,我必须重新计算用户资源并保存新值,请设置新的updatedAt。 这是我如何更新我的用户资源(内部统计模型),当一些用户想要建立一个陷阱。 Stats.findOne({user_id: user_id}).exec(function (err, newstats){ var time_in_ms = (new Date()).getTime() – new Date(newstats.updatedAt).getTime(); var ressources_per_second = (newstats.base_income + newstats.field_income) / 60 / 60; var current_ressources = newstats.resources + parseInt(time_in_ms / 1000 * ressources_per_second) – traps_price; if(current_ressources < traps_price) […]

我怎样才能使一定数量的帧发生?

我想添加一个硝基增强function,我的赛车游戏。 当使用硝基时,我希望汽车能够快45帧,但无论如何我不能使它工作。 我最初尝试使用while循环,但显然这不适用于JavaScript物理。 这是我现在拥有的: this.nitro = function() { if (this.hasNitro) { this.nitroSpeed = this.carSpeed * 2; this.speedCopy = this.carSpeed; var refreshIntervalId = setInterval(function() { this.carSpeed = this.nitroSpeed; this.nitroCount–; if(this.nitroCount==0){ this.endNitro(); } }, 1000 / FRAMES_PER_SECOND); } } this.endNitro = function(){ clearInterval(refreshIntervalId); this.carSpeed = this.speedCopy; this.hasNitro = false; } 游戏中有两辆汽车,每辆汽车都是一个实例。 其中一个用箭头键控制,另一个用WASD控制。 当汽车的硝基button被按下时,在该汽车上调用nitro() 。 硝基的目标是让NITRO_TIME帧的车速NITRO_TIME 。 当汽车初始化时, […]

如何构建我的数据库的HTML回合制战略游戏?

我正在制作简单的HTML套接字游戏,我想随着时间的推移logging。 这是一个“风险”types的游戏,可以征服个别的瓷砖,瓦片最多的团队正在获胜。 截至目前,我已经完成了大部分的游戏,但问题是每次服务器重新启动时,所有的服务器数据都将丢失。 我想使用数据库来存储所有不同的团队,以及所有已经被征服的瓦片,但是我也想用时间戳来存储所有的瓦片征服,这样我就可以看到地图被征服的进程。 (所以我理论上可以及时回放,看看地图是如何演变的)。 我也希望在服务器崩溃的情况下,服务器可以从数据库中检索数据并返回到之前的世界状态(哪个方块被谁征服等) 我对数据库非常陌生,因为我不得不在学校学习SQL。 我正在考虑使用MongoDB(noSQL),并且看到我只会最多每隔几秒钟向董事会写信,这是正确的方法吗?

最有效的方式来检测和行为碰撞(具体为我的2D游戏)

目前,主要是为了好玩,我正在开发一款2D游戏,我们将所有可碰撞块(背景)join到数组中,并将其放入3D数组的不同部分。 玩家对象被放入AI数组中。 它看起来像这样 – > var world_objects = [ [], //All 'background' collide-able objects. Such as stones and the border ~~ Code name: bg [], //All AI ~~ code name: ai [] //Projectiles ~~ Code name: ps ]; 该地图被设置为一个位图,我使用另一个3D数组,目前被制作成15×15,但是这可能会改变。 棕色边框包含在位图和world_objects数组中。 而当插入块/ ai /抛射物时,它们都将具有基本的物体属性: x,y(2个variables,一个只有正常的x,y根据canvas中的确切像素,另一个是根据哪个单元格为位图) 宽度和高度(ai和射弹的宽度和高度都根据每个单元格的大小logging为百分比,因为大小是根据屏幕大小而变化的) 与其他属性无关的碰撞。 什么是检测所有对象最有效的方法,以及它们是否相互碰撞? 如果需要的话,我可以添加额外的属性给每个对象,如果这将使更容易和更高效。 点击查看所有的代码

将Sprite表格解包到2D纹理数组中

我正在使用WebGL 2.它的标记不存在,但它应该。 我有一个10×10的精灵正方形16×16像素的大小(所有在一个PNG图像)。 我想创建一个2D纹理数组,其中每个16×16正方形都有自己独特的Z /深度值。 let texture = gl.createTexture(); let image = new Image(); image.onload = function() { gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 5, gl.RGBA, 16, 16, NUM_IMAGES); // Now what? // gl.texSubImage3D doesn't let me copy in a section of the src image } image.src = "http://img.ufgame.com/opengl/image.png"; 我知道gl.texSubImage3D存在,但它只接受整个图像作为源? glTexSubImage3D: https ://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexSubImage3D.xml

为什么我的电脑桨没有在我的Pong游戏中移动?

我正在做一个乒乓球游戏,我不知道为什么当它应该自动击球的时候,计算机控制台不会上下移动! 请帮帮我。 这是代码: <html> <h3>- – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – PONG- – – – – – – – – – – – – – – – […]

phaser.io鼠标光标精灵

我试图建立一个游戏,我希望人们能够select与指针的东西,但我不希望它只是一个丑陋的看起来默认指针,所以我写这个代码尝试获取图像,因为它 首先我加载图像 game.load.image('selector', 'assets/img/pointer.png') 然后我把它放入我的游戏 selector = game.add.sprite(game.world.centerX, game.world.centerY, 'selector') 然后在我的render()函数中,我这样做 selector.x = game.input.x; selector.y = game.input.y; 它与我的鼠标移动正常,但有一个问题 我的游戏被devise为使得我必须使用跟随我的角色的相机,因为地图比视图更大 所以由于某种原因,我的精灵总是从0,0开始,它只能移动800x600px因为那是所有的canvas看到鼠标所以我需要一种方法来解决这个问题,但我不知道如何做到这一点,因为我是新的相位器

向目标投掷一个2D球来模拟3D效果

你将如何更新面向目标向前(用弧)向前抛出的2D对象的状态来模拟3D(深度)效果? var ball; //2D ball from a sprite sheet ball.x = 0; ball.y = 0; ball.scaleX = 1; ball.scaleY = 1; ball.throw(); //set ball to a throwing state ball.update(); //update the ball's positon and depth by calculating its current coordinates and scale. ball.render();