《making things move 》第五章

本文介绍了游戏开发中物理模拟的基础概念,包括速度、角速度、加速度等,并通过实例讲解了如何将角速度转换为X、Y轴的速度,以及如何利用加速度改变物体速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《making things move 》第五章
速度:

在这一章里的速度,可以简单解释为 pixels per frame 。
这是不太精确的,比如你做一些游戏或仿真的时候。由于帧频的不确定性(cpu占用,或过多的运动点会拖慢帧频)会发生一些问题,这些以后章节会讲,在这章,暂时用 pixels per frame

向量:有大小和方向 ,大小相等,方向相同的两个向量就是相同的,跟位置没关 ,用箭头表示

attachments/200611/01_121622_1.jpg

(相等的向量)

速度的例子,在时间轴上

Media 点这里 显示/隐藏 媒体
init();
function init():Void
{
 vx = 5;
 // vy = 5;

 ball = attachMovie("ball", "ball", 0);
 ball._x = 0;
 ball._y = Stage.height / 2;
}
function onEnterFrame():Void
{
 ball._x += vx;
 // ball._y += vy;
}

角速度:

知道x轴,y轴上的速度,这样移动物体很简单,但是更多时候我们不会直接知道,vx,vy 。

我们只知道一个 speed,一个angle 如何移动物体呢?

比如,速度为3 ,45度

attachments/200611/01_125409_2.jpg


很明显要先求出来 vx ,vy ,变成了求直角三角形两条边了

我们的公式又派上用场了!看见x想到cos,看到y 想到sin

vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;

Media 点这里 显示/隐藏 媒体

init();
function init():Void
{
 angle = 45;
 speed = 3;
 ball = attachMovie("ball", "ball", 0);
 ball._x = Stage.width / 2;
 ball._y = Stage.height / 2;
}
function onEnterFrame():Void
{
 var radians:Number = angle * Math.PI / 180;
 var vx:Number = Math.cos(angle) * speed;
 var vy:Number = Math.sin(angle) * speed;
 ball._x += vx;
 ball._y += vy;
}

向量加法:把向量们首尾相连,就会看到结果

attachments/200611/01_131410_1.gif


返回看看刚才的例子是不是这样

attachments/200611/01_132249_2.gif


例子:鼠标跟随
init();
function init():Void
{
 speed = 5;
 arrow = attachMovie("arrow", "arrow", 0);
 arrow._x = Stage.width / 2;
 arrow._y = Stage.height / 2;
}
function onEnterFrame():Void
{
 var dx:Number = _xmouse - arrow._x;
 var dy:Number = _ymouse - arrow._y;
 var angle:Number = Math.atan2(dy, dx);
 arrow._rotation = angle * 180 / Math.PI;
 var vx:Number = Math.cos(angle) * speed;
 var vy:Number = Math.sin(angle) * speed;
 arrow._x += vx;
 arrow._y += vy;
}
Media 点这里 显示/隐藏 媒体


加速度,角加速度 : 跟速度差不多,需要记住的就是 速度是改变物体位置的,而加速度是改变物体速度的

直接看例子
Media 点这里 显示/隐藏 媒体

init();
function init():Void
{
 force = 0.5;
 vx = 0;
 vy = 0;
 arrow = attachMovie("arrow", "arrow", 0);
 arrow._x = Stage.width / 2;
 arrow._y = Stage.height / 2;
}
function onEnterFrame():Void
{
 var dx:Number = _xmouse - arrow._x;
 var dy:Number = _ymouse - arrow._y;
 var angle:Number = Math.atan2(dy, dx);
 arrow._rotation = angle * 180 / Math.PI;
 var ax:Number = Math.cos(angle) * force;
 var ay:Number = Math.sin(angle) * force;
 vx += ax;
 vy += ay;
 arrow._x += vx;
 arrow._y += vy;
}

终极例子:宇宙飞船

键盘控制

上 增加角加速度 ,左右改变角度

没什么难度,看代码

Media 点这里 显示/隐藏 媒体

init();
function init():Void
{
 vr = 5;
 thrust = 0.2;
 vx = 0;
 vy = 0;
 ship = attachMovie("ship", "ship", 0);
 ship._x = Stage.width / 2;
 ship._y = Stage.height / 2;
}
function onEnterFrame():Void
{
 if (Key.isDown(Key.LEFT))
 {
 ship._rotation -= vr;
 }
 else if (Key.isDown(Key.RIGHT))
 {
 ship._rotation += vr;
 }
 if (Key.isDown(Key.UP))
 {
 var radians:Number = ship._rotation * Math.PI / 180;
 var ax:Number = Math.cos(radians) * thrust;
 var ay:Number = Math.sin(radians) * thrust;
 vx += ax;
 vy += ay;
 ship.gotoAndStop(2);
 }
 else
 {
 ship.gotoAndStop(1);
 }
 ship._x += vx;
 ship._y += vy;
}

这章最重要的4个内容

* 角速度 转变 x,y轴的分速度

*角加速度 转变为x,y轴的分加速度

*分加速度与分速度相加

*分速度与分位置相加

重要公式:

Convert angular velocity to x, y velocity:

vx = speed * Math.cos(angle);
vy = speed * Math.sin(angle);
Convert angular acceleration (any force acting on an object) to x, y acceleration:

ax = force * Math.cos(angle);
ay = force * Math.sin(angle);
Add acceleration to velocity:

vx += ax;
vy += ay;
Add velocity to position:

movieclip._x += vx;
movieclip._y += vy;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值