所以我正在尝试学习如何开发2D游戏.
我正在玩Android和C#.
我遇到的问题是这个.
绘制某种精灵很容易.我努力的目的是想象一个人如何编写屏幕上各种对象的交互.
例如,假设我有以下对象.
public class MyGenericObject {
public MyGenericObject() {}
public Int32 Width { get; set; }
public Int32 Height { get; set; }
public Int32 X { get; set; }
public Int32 Y { get; set; }
public Image ObjectImage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
让我们说我想模拟N个这些对象之间的交互行为.在这种情况下,人们会使用什么样的典型模式?
因此,举例来说,你只需要调用一个方法,如 MyPhysicsSim.DoPhysics(List<MyGenericObjects>);
假设这不是一个巨大的延伸.在这个方法的内部,你如何计算相互作用和产生的运动?我只是无法理解它(显然我明白有基本的方程可以解决方向和速度等等但我似乎无法弄清楚如何将这些作为算法应用).
我已经看了很多教程,所有这些教程似乎只专注于绘制一个对象或者对我内心的内部结构有一定程度的理解.所以我希望有一个非常简单,愚蠢的回应.
所以基本上我要问的是你如何处理OO范例中的2D对象之间的互动?
按照本教程进行我的2D游戏碰撞处理,本教程解释了我最喜欢的游戏"N"中使用的碰撞.他们如何更有效地使用单独的轴定理来实现AABB与AABB和AABB与Circle之间的碰撞.http://www.metanetsoftware.com/technique/tutorialA.html.我理解AABB与AABB碰撞处理的实现,但我无法理解AABB与Circle碰撞检测特别是voronoi区域.完全混淆了如何/从哪里开始.
AABB与AABB碰撞检测
有人可以解释如何处理碰撞AABB vc Circle - 反之亦然?
我有一个滑块,其速度我通过每个刻度位置之间的差异计算(由于通过触摸屏使用它有时可能很大,所以也许我应该将它夹在一些任意数字以避免一些这些问题?)
我有一个具有3维方向向量和速度的球.
当球与滑块碰撞时,我在Z轴上反转其方向(远离滑块),然后使用滑块速度来操纵其X(左< - >右)方向.所以:
ball.direction.x += (slider_friction * slider_velocity)
现在球更新如下:
velocity = ball.velocity * time
ball.direction.normalise()
ball.position = ball.direction * ball.velocity
Run Code Online (Sandbox Code Playgroud)
这看起来效果很好,除了在某些情况下,任何球轴似乎都很可能等于零,导致它在某些情况下永远不会返回到滑块.什么是一个很好的解决方案?什么是与块碰撞时处理块响应的好方法?它应该返回到以正确的角度弹跳,还是应该保持反射与滑块应用的相同的弹跳修改器?此外,任何其他物理技巧的这种弹丸模拟将不胜感激.
我试图让用户画一个他们可以用来击球的球拍.但是,我似乎无法让球正确弹跳,因为球的速度的x和y分量不与墙排成一线.我怎么能绕过这个?
我试图通过加雷思·里斯提出的意见在这里,但显然我不知道有足够的了解向量能够遵循它.例如,我不知道你在矢量中存储了什么 - 我知道它是一个带方向的值,但你存储它之间的两个点,斜率,角度?
我真正需要的是给出壁的角度以及球撞击时的x和y速度,然后找到新的x和y速度.
我有一个睡眠体我想在一个特定的x/y位置施加一个脉冲,比方说x:200,y:300.
但是当施加这种脉冲时,身体朝x/y方向移动而不是精确位置,它在x/y上的差异范围大约为30-50.重力是0,0.
var impulse:Vec2 = Vec2.weak(200, 300);
impulse.length = 1000;
napeBody.applyImpulse(impulse);
Run Code Online (Sandbox Code Playgroud) 我为不同力和角度的抛射运动编写了以下函数,但它不能正常工作。我哪里出错了?我想要像《愤怒的小鸟》这样的游戏。
代码:
public void shootBall(int timeCounter){
int gravity = 4;
double time = timeCounter/40.0;
int velocity = force_value;
double radians = currentangle*Math.PI/180;
ball.setX((int)((ball.getX()+10)*Math.cos(radians) + velocity*Math.cos(radians)*time));
ball.setY((int)((ball.getY()+10)*Math.sin(radians) + velocity*Math.sin(radians)*time - 0.5*gravity*time*time));
updateGame();
}
Run Code Online (Sandbox Code Playgroud)
我希望球从左下角扔出去。

我正在将 bullet/ammo.js 与three.js 一起使用。我有一个 3d 网格,我想使用精确的形状与软体进行碰撞检测。有没有办法从网格(在three.js中)创建一个3d刚体(在子弹中)?
下面是一个例子:http : //kidzinski.com/miamisura/lazy3d/(请稍等片刻,下载 3d 模型)。我有一块布落在 3d 身体上,我需要模拟这块布与身体的碰撞。
如果我从根本上误解了某些东西,我是这些框架的新手,抱歉。
对不起,如果这看起来像一个愚蠢的问题,我有一个看起来像这样的数据集
type time latitude longitude altitude (m) speed (km/h) name desc currentdistance timeelapsed
T 2017-10-07 10:44:48 28.750766667 77.088805000 783.5 0.0 2017-10-07_10-44-48 0.0 00:00:00
T 2017-10-07 10:44:58 28.752345000 77.087840000 853.5 7.8 198.70532 00:00:10
T 2017-10-07 10:45:00 28.752501667 77.087705000 854.5 7.7 220.53915 00:00:12
Run Code Online (Sandbox Code Playgroud)
我不确定如何解决这个问题,计算加速度需要考虑速度和时间的差异,对我可以尝试的方法有什么建议吗?
提前致谢
我想做一个简单的飞机控制器,看起来一点也不现实。我看了一些飞机物理学的视频。并统一编写一个简单的脚本,但是如果我开始,飞机无法移动,或者如果将阻力更改为零,飞机将无法升起。我试图使用真实数据并从Wiki(F22 Raptor)中获取数据。对于我的游戏对象,我给定了刚体组件的质量= 19670 kg。发动机推力= 2 * 116000.0f牛顿。
private void calculateEnginePower()
{
EnginePower = engineThrust * ThrottleInput;
}
private void calculateForces()
{
angleOfAttack = Vector3.Angle(Vector3.forward, rb.velocity);
angleOfAttack = Mathf.Clamp(angleOfAttack, 0, 90);
coefficient = Mathf.Pow(1225.04f * rb.velocity.magnitude, 2) - 1; //M^2-2 where: M is mach.
if (coefficient > 0.0f)
coefficientLift = (4 * angleOfAttack) / Mathf.Sqrt(coefficient);
lift = 1.2754f * 0.5f * Mathf.Pow(rb.velocity.magnitude, 2) * coefficientLift * 78.04f; // densy1.2754 kg/m3, speed m/s , (F22)Wing area: 840 ft² (78.04 m²)
coefficientDrag = …Run Code Online (Sandbox Code Playgroud) 我正在使用 scipy.integrate 的 odeint 包求解一组耦合微分方程。
对于整合时间,我有:
t=numpy.linspace(0,8e+9,5e+06)
Run Code Online (Sandbox Code Playgroud)
其中 5e+06 是时间步长。
然后我绘制我有这样的方程:
plt.xscale('symlog') #x axis logarithmic scale
plt.yscale('log',basey=2) #Y axis logarithmic scale
plt.gca().set_ylim(8, 100000) #Changing y axis ticks
ax = plt.gca()
ax.yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.title("Example graph")
plt.xlabel("time (yr)")
plt.ylabel("quantity a")
plt.plot(t,a,"r-", label = 'Example graph')
plt.legend(loc='best')
Run Code Online (Sandbox Code Playgroud)
其中 a 是时间因变量。(这只是众多图表中的一张。)
然而,图表看起来有点参差不齐,而不是振荡,我得到这个错误:
OverflowError: Exceeded cell block limit (set 'agg.path.chunksize' rcparam)
Run Code Online (Sandbox Code Playgroud)
我不太确定这个错误意味着什么,我看过其他答案,但不知道如何实现“agg.path.chunksize”。
此外,集成 + 绘图需要大约 7 个小时,而且还有一些 CPU 处理技巧,所以我真的不想实现任何会增加时间的东西。
我怎样才能克服这个错误?
我试图减少时间步长,但是我得到了这个错误:
Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = …Run Code Online (Sandbox Code Playgroud)