向量归一化是非常有用的,游戏中经常能用到,就说大家都见过的,FC魂斗罗的敌人发射子弹就能用到了,敌人向玩家发射子弹首先要获取到向量,这个向量不能直接作为方向去用,必须要经过归一化处理才行,经过归一化处理后你才能精确的设置子弹的速度,不然子弹的速度是不可控的。

我做了个小demo来演示玩家向目标点移动的效果,跟魂斗罗的敌人向玩家发射子弹是一样的道理,效果图如下:

黑色的小方框是玩家,黑色的小点就是移动的目标点。

我先介绍一下向量归一化的计算方法吧:

//比如有一个向量v
Vector3 v = new Vector3(6.0, 10.0, 15.0);//计算出向量所有元素的和,这里sum = 31,要是有元素是负数要用绝对值
float sum = v.x + v.y + v.z;//每一个元素除以sum
v.x /= sum;
v.y /= sum;
v.z /= sum;得到归一化的向量: [0.19, 0.32, 0.48]

在SGDK中的代码如下:

/*角色自动向点的方向移动,角色到点的距离小于等于1.5的时候,点的位置会随机改变
*/#include <genesis.h>
#include <vdp.h>
#include "resources.h"//目标点的坐标
Vect2D_f16 point;//角色坐标
Vect2D_f16 charPos;//精灵,目标点
Sprite *spr_point = NULL;//精灵,角色
Sprite *spr_char = NULL;//角色移动的速度
fix16 moveSpeed = FIX16(0.04);//角色到点的最小距离
fix16 minDistance = FIX16(1.5);//向量归一化
Vect2D_f16 vector_normalize(Vect2D_f32 _v);//随机设置点的位置
void randomPoint();int main()
{//绘制标题VDP_drawText("Vector Normalize", 12, 0);//设置PAL0的调色板VDP_setPalette(PAL0, res_point.palette->data);//初始化spriteSPR_init();//初始化点的位置charPos.x = FIX16(0);charPos.y = FIX16(0);//初始化角色的位置point.x = FIX16(60);point.y = FIX16(40);//设置点的精灵图片spr_point = SPR_addSprite(&res_point, fix16ToRoundedInt(point.x), fix16ToRoundedInt(point.y), TILE_ATTR(PAL0, 0, 0, 0));//设置角色的精灵图片spr_char = SPR_addSprite(&res_char, fix16ToRoundedInt(charPos.x), fix16ToRoundedInt(charPos.y), TILE_ATTR(PAL0, 0, 0, 0));//更新精灵SPR_update();while (TRUE){//dir用来计算方向向量Vect2D_f32 dir;//你想去哪个位置,就用哪个位置减去自己的位置dir.x = point.x - charPos.x;dir.y = point.y - charPos.y;//获取归一化的方向Vect2D_f16 _nDir = vector_normalize(dir);//这一段是勾股定理的内容,目的是求出角色到点的距离,A² + B² = C²,不多做解释了,详细看我的世嘉MD游戏开发进阶教程之两点的距离fix32 powX = dir.x * dir.x;fix32 powY = dir.y * dir.y;fix32 powDist = minDistance * minDistance;fix32 sumXY = powX + powY;//距离大于最小距离,也就是没碰到目标点if (sumXY > powDist){//向点的方向运动,方向_nDir和每帧移动速度moveSpeedcharPos.x += _nDir.x * moveSpeed;charPos.y += _nDir.y * moveSpeed;}else{//碰到目标点后随机改变目标点的位置randomPoint();}//这俩都是很基础的内容了,设置精灵的坐标SPR_setPosition(spr_char, fix16ToRoundedInt(charPos.x), fix16ToRoundedInt(charPos.y));SPR_setPosition(spr_point, fix16ToRoundedInt(point.x), fix16ToRoundedInt(point.y));//更新精灵SPR_update();VDP_waitVSync();}return 0;
}//向量归一化,计算方法是,先计算出向量所有数的和,二维向量就是x+y,三维向量就是x+y+z,然后再用每个元素除以这个和,得出归一化的元素
Vect2D_f16 vector_normalize(Vect2D_f32 _v)
{Vect2D_f16 _tmp;fix16 sum = fix32ToFix16(abs(_v.x) + abs(_v.y));_tmp.x = fix16Div(fix32ToFix16(_v.x), sum);_tmp.y = fix16Div(fix32ToFix16(_v.y), sum);return _tmp;
}//随机设置点的位置
void randomPoint()
{point.x = FIX16(random() % 319);point.y = FIX16(random() % 223);
}

还是挺简单的^_^

世嘉MD游戏开发进阶篇【三】:向量归一化的实现及应用相关推荐

  1. 世嘉MD游戏开发进阶篇【四】:向量点乘的计算

    向量点乘有时候是很有用的,在Unity等游戏引擎里向量点乘都是自带函数的,直接调用就可以,但是在世嘉MD这种简陋的平台,什么运算都得自己去实现,向量点乘也不例外. 直接看公式: //如果是三维向量的话 ...

  2. 世嘉MD游戏开发【四】:输入控制(下)

    上一节讲了世嘉MD两种输入控制当中的一种,也是比较容易理解的一种,这一节讲一下剩下的这种控制方式:回调函数式. 建好文件夹,用vscode打开,新建main.c,依然是直觉一般的写下如下代码: #in ...

  3. 世嘉MD游戏开发【三】:输入控制(上)

    这一节讲一下SGDK中的输入控制,SGDK提供了两种输入控制方式,一种是用回调函数接收输入信息,很自然的另一种就没有用回调函数了(貌似废话-.-!),成上下两节,这一节讲不用回调函数来接收输入信息. ...

  4. 世嘉MD游戏开发【七】:绘制图片,drawImage

    这一期讲绘制图片. 上一期讲的是绘制tile,还要用那个不怎么好用的工具导出数组数据,很繁琐,这次就不用那个蹩脚的工具了,随便一个图片用photoshop处理一下就可以了,对于图片的要求有这么几点: ...

  5. 世嘉MD游戏开发【五】:显示Tile图块

    显示Tile图块,首先要有tile图块,这就要用到一个小工具了,叫Sega Genesis Tile Designer,软件界面如下: 看起来很复杂,其实自己亲自操作一下几分钟就能搞懂了,都是些很基础 ...

  6. 世嘉MD游戏开发【六】:矩形填充Tile图块

    上节课讲了如何显示一个Tile图块,这节课我来讲一下Tile图块的矩形填充. 打开Sega Genesis Tile Designer,设置tile宽度为4tiles,高度也是4tiles: 随便绘制 ...

  7. 世嘉MD游戏开发【九】:Sprite精灵

    终于讲到Sprite精灵了,我自己也很希望快点讲精灵,但是欲速则不达,自己要是还没研究透彻这个知识点就去讲下一个,感觉文章肯定是写不好的. 我用下图来做演示,SFC幽游白书-魔界最强列传里的雷禅: 怎 ...

  8. 世嘉MD游戏开发【八】:淡入和淡出

    淡入淡出,很好理解,淡入就是画面由黑过渡到彩色,淡出就是画面由彩色过渡到黑色,其实也不一定必须是黑色,看你自己需求了. 注:淡入淡出的功能可以完成非常多的游戏玩法设计哦~打开脑洞就有惊喜~ 效果图如下 ...

  9. M8SDK教程-游戏开发心得(三):DDraw进阶教程-贴图,Alpha和Sprite动画,RPG游戏雏形

    M8SDK教程-游戏开发心得(三):DDraw进阶教程-贴图,Alpha和Sprite动画,RPG游戏雏形 引用: M8 SDK教程- 游戏开发心得(一): 游戏程序框架 http://bbs.mei ...

最新文章

  1. 先装VS2008再装SQL2005的问题
  2. Redis 和 Memcached 的区别
  3. python 寻找比目标字母大的最小字符
  4. Android免Root环境下Hook框架Legend原理分析
  5. MySQL的索引特性
  6. 树莓派使用STEP5:安装samba文件共享服务器
  7. 哈工大等提出轻量级盲超分辨模型LESRCNN,代码已开源
  8. python 图片 变清晰_python模糊图片过滤的方法
  9. HFSS学习笔记—19.HFSS模型导出dxf文件并绘制PCB
  10. 删除目录以及子目录以下所有目录和文件
  11. 企业级代码静态测试工具Helix QAC——Helix QAC Dashboard基于团队的工程质量管理系统/Helix QAC资质认证
  12. 2016年中国的SaaS服务商企业研究
  13. Protel.DXP2004 电路板设计
  14. 微信公众号使用:给微信公众号设置头像和微信号的步骤
  15. 卫生事业管理学重点 题库含答案(终极完全版)
  16. 名师出高徒!请关注领英上这十位活跃的大神
  17. 设置电脑 保护视力 还有桌面默认颜色
  18. 本地BLAST的使用方法及基本操作步骤
  19. Mysql8.0设置允许远程连接
  20. Python 深度学习目标检测结果可视化

热门文章

  1. .NET处理CSV文件 插件CSVReader
  2. 我是如何同时在字节和微信成功拿到实习转正offer
  3. js基础知识(二十五)--DOM查询的其他方法、获取元素的后代和子元素
  4. sql server 删表外键约束报错
  5. 【数据网格架构】数据网格架构详解
  6. 面试315--》转自佩奇银角大王
  7. 程序员工作轶事(不定更)
  8. 【码云周刊第 11 期】追踪代码大仓库? Git 的拿手好戏!
  9. charles突然无法手机,手机开启代理后显示网络不可用
  10. 最大连接数和最大线程数相关知识点的总结