`
micheal19840929
  • 浏览: 163200 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

2D跟踪弹算法

阅读更多

       最近在写一个手机游戏,其中涉及到一个跟踪弹的算法,成果如下:

/*子弹到目标的向量分量*/
int vx=target.getPosition().x-this.position.x;
int vy=target.getPosition().y-this.position.y;
/*使用内积判断向量的夹角[0,180]*/
double dot=Util.dot(dx,dy,vx,vy);//dx,dy为速度向量分量
double cos=dot/velocity*Util.modulus(vx,vy);//velocity为速度标量
double angle=Math.acos(cos);//两向量的夹角
/*使用外积判断向量的夹角是顺时针还是逆时针*/
double cross=Util.cross(dx,dy,vx,vy);
if(angle!=0&&Math.abs(cross)>0.00001)
{
	/*参考偏转角界限进行调整*/
	Point2D result=new Point2D();
	if(angle<deflectionAngleLimit)//deflectionAngleLimit为子弹最大偏转角,即从一帧跳到下一帧最大的旋转角度
	{
		if(cross>0)
		{
			//逆时针旋转
			direction+=angle;
			Util.rotate(dx,dy, angle, result);
			Log.d("TrackingBullet","ccw angle:"+angle+",direction:"+direction);
		}
		else if(cross<0)
		{
			//顺时针旋转
			direction-=angle;
			Util.rotate(dx,dy, -angle, result);
			Log.d("TrackingBullet","cw angle:"+angle+",direction:"+direction);
		}
	}
	else
	{
		if(cross>0)
		{
			//逆时针旋转
			direction+=deflectionAngleLimit;
			Util.rotate(dx,dy, deflectionAngleLimit, result);
			Log.d("TrackingBullet","ccw limit:"+deflectionAngleLimit+",direction:"+direction);
		}
		else if(cross<0)
		{
			//顺时针旋转
			direction-=deflectionAngleLimit;
			Util.rotate(dx,dy, -deflectionAngleLimit, result);
			Log.d("TrackingBullet","cw limit:"+deflectionAngleLimit+",direction:"+direction);
		}
	}
	Log.d("TrackingBullet","dx:"+dx+",dy:"+dy+"--result:"+result.x+","+result.y);
	this.dx=result.x;//新的速度分量
	this.dy=result.y;
}

 

然而其间遇到了一个问题,就是在数学中坐标系统Y分量的正方向是向上的,而手机的坐标系统Y分量的正方向是向下的,根据经验是可能使用y'=-y来转换的,不过在这里还不知道怎么转换,有机会我会再做进一步的研究,也希望有同道中人一起交流^_^

分享到:
评论

相关推荐

    Unity导弹追踪算法演示

    1. **目标检测**:导弹首先需要锁定目标,这通常通过碰撞检测或者射线投射实现,确保导弹能够识别和跟踪正确的目标。 2. **目标运动分析**:获取目标的速度和位置信息,根据这些信息预测未来的运动轨迹。 3. **...

    UNITY自动追踪导弹源码

    标签中的“Unity”是游戏开发的流行平台,它支持3D和2D图形,物理模拟,以及一套强大的脚本系统。"导弹"在这里是指游戏或模拟中的虚拟对象,它可以按照预设的规则移动。"自动追踪"是关键功能,意味着导弹能自动调整...

    躲避子弹_躲避子弹游戏_

    在编程实现中,我们可以用计时器来跟踪游戏时间,并根据此来评估玩家的生存能力和游戏难度等级。例如,游戏可以设置多个关卡,每个关卡的子弹数量和速度会随时间递增,增加挑战性。 在技术实现上,"躲避子弹"游戏...

    使用Java开发的飞机大战.zip

    通常,我们可以使用矩形或圆形碰撞检测算法,如轴对齐边界框(AABB)或点在圆内的检查。当检测到碰撞时,应执行相应的逻辑,比如消除敌机和子弹。 4. **敌机消失**:当敌机被子弹击中,我们需要清除敌机的实例以...

    Kinect-v2-Testing:学习 Kinect v2 SDK。 具有碰撞和物理的交互式 2d 对象

    对于更复杂的形状,可能需要使用分离轴定理或其他更高级的碰撞检测算法。 在这个项目中,预览功能可能展示了如何实时渲染2D对象并响应用户的Kinect手势。Kinect v2 SDK提供了骨骼跟踪功能,可以通过分析骨骼关节的...

    微信飞机大战源码和资源

    3. 问题调试:遇到不理解的地方,可以使用调试工具进行单步跟踪,查看变量值变化,有助于找出问题所在。 4. 学习交流:与他人分享你的学习心得,或者在社区提问,可以获得更多的见解和建议。 总结,微信飞机大战的...

    cocos2dx3.10 飞机类游戏

    金币可能存储在数据库或者本地文件中,以便跟踪玩家的积累。同时,金币的显示和碰撞检测则通过`cc::Sprite`和`cc::CollisionManager`实现。 其次,**用户数据管理**是游戏持久化的重要部分。这通常涉及到保存和加载...

    关于飞机射击类游戏的设计原理.docx

    学习并熟练运用DirectDraw部分,可以创建出流畅的2D动画。 2. **数据结构与对象**:飞机射击游戏的核心是对象的管理,包括玩家飞机、敌人飞机以及子弹。通过定义类来表示这些对象,如`CPlayer`类代表玩家飞机,包含...

    飞机大战code(code源码资源 以及svn文件)

    SVN(Subversion)是一种广泛使用的版本控制系统,用于跟踪和管理软件开发过程中的文件和目录变更。通过使用SVN,开发者可以记录每一次代码修改,便于回溯和协作。对于"飞机大战"项目而言,SVN文件可以帮助我们理解...

    初学JAVA制作的坦克大战小游戏,使用JAVA 的GUI模拟2,5D界面.zip

    4. AI设计:为电脑控制的坦克编写简单的智能行为,可能包括随机移动、跟踪玩家坦克等策略。 通过这个项目,学习者不仅能巩固Java编程基础,还能接触到游戏开发的基本流程和技术,提高问题解决和项目管理能力。同时...

    经典飞机大战源码

    可能涉及到的算法包括随机生成、波浪式推进、跟踪射击等,开发者需要根据游戏节奏和难度调整这些策略。 6. 敌机行为与AI: 敌机的智能行为通常由简单的AI算法实现,如预设路径、随机移动或对玩家飞机的简单追逐。更...

    Defender Game游戏例子代码

    使用SpriteKit或Cocos2d-x等游戏引擎,可以方便地实现2D图形的绘制和动画效果。 三、游戏对象与行为 1. 角色:主角通常具有移动、射击等基本能力。角色的行为由其属性(位置、速度、生命值等)和方法(move、shoot...

    android坦克大战源码

    3. OpenGL ES:坦克大战的图形渲染可能采用了OpenGL ES,这是Android上用于2D和3D图形处理的API。了解基本的OpenGL ES概念和命令是理解游戏画面绘制的关键。 二、源码结构分析 1. MainActivity:作为主入口,通常...

    TankGame.zip

    "TankGame.zip" 文件是一个包含了实现坦克游戏的代码资源的压缩包,这为我们提供了一个深入理解游戏开发,特别是2D游戏编程的宝贵学习材料。在这个项目中,我们可以学习到如何使用编程语言来创建游戏逻辑、处理用户...

    一个C#写的射击类游戏源代码。

    虽然它的功能相对有限,不支持高级3D图形,但对初学者来说,GDI提供了一个简单易懂的2D绘图接口,可以快速实现基本的游戏画面。 在这个C#射击游戏中,开发者可能使用GDI进行以下操作: 1. 绘制游戏背景:使用GDI的...

    SpaceShip:我的第一个使用 JFrame (SpaceShip) 的 2d Java 游戏

    此外,还需要跟踪游戏时间,比如游戏的计分系统、生命值的减少等,这些都需要对时间进行精确管理。 ### 4. 事件监听与处理 在`SpaceShip`中,玩家可能通过键盘或鼠标来控制飞船移动、射击等操作。Java Swing提供了...

    非线性UEL.rar_ABAQUS UEL_uel_uel abaqus_非线性单元

    1. **应力应变关系**:用户需要定义单元的应力-应变关系,这可能涉及到非线性材料模型,如塑性、蠕变、弹塑性等。 2. **几何变形**:对于几何非线性问题,需要考虑大位移、大应变的影响,更新单元的形状函数和坐标...

    基于vc++经典坦克游戏

    例如,坦克的移动可以通过改变其在二维坐标系中的位置来实现,碰撞检测则需要比较不同对象之间的边界,射击则需要跟踪炮弹的轨迹和碰撞检测。这些都需要对数据结构和算法有深入的理解。 此外,为了增加游戏趣味性,...

    VC++ 简单的飞机射击游戏

    我们可以使用GDI+(Graphics Device Interface Plus)库绘制2D图形,或者更高级的DirectX来实现更复杂的3D效果。动画则通过改变物体的位置、角度等属性来实现。 3. **碰撞检测**:为了使游戏有互动性,我们需要实现...

    matlab开发-swaytree

    5. **计算机视觉**:虽然"swaytree"主要关注的是生成而不是分析图像,但其动态特性可能与计算机视觉中的运动估计或跟踪技术有关。例如,通过模拟风力对树的影响,可以理解自然界中的物体运动如何被视觉系统捕捉和...

Global site tag (gtag.js) - Google Analytics