我的这个碰撞检测方法仅适用于tile级别的碰撞检测。 精灵初始化后,映射在ROM中的内存地址会保存在Sp_addr1,水平和垂直偏移量会置0。 所以精灵所在的tile将会有3种状态:仅占1个tile位置,此时水平偏移量Xp,垂直偏移量Yp均为0; 占2个tile位置,此时会是Xp==0&&Yp!=0,或者Xp!=0&&Yp==0,对应垂直方向占2格,水平方向占2格; 占4个tile位置,Xp!=0&&Yp!=0。 但是精灵的移动是按像素来的,所以将会在精灵完全进入下一个tile中后,改变其在ROM中映射的内存地址,这由每个按键事件的第一个判断语句来实现。 精灵在移动的过程中将会在这3中情况中变换。每种情况有不同的检测方法,这取决于精灵所占的tile情况,和将要移动的方向。 我花费了大量的时间去演算所有在精灵移动中可能发生的情况,它是大量的,我在试图描述它们的过程中遇到了很多困扰。终于在第四天的时候想到了一个充分描述它们的办法。 算法的核心在于如何随着精灵的移动去改变其映射在ROM中的内存地址,这由change_addr方法进行实现。 当精灵处于占1个tile的状态时,如果成功向按键方向进行了移动,将会把前进方向在ROM中映射的内存地址写入Sp_addr2。 当精灵处于占2个tile的状态时,会有四种情况: Xp==0&&Yp!=0{向垂直方向移动是向占1tile的状态变化,无需碰撞检测;向水平方向移动时将会触发碰撞检测} Xp!=0&&Yp==0{向水平方向移动是向占1tile的状态变化,无需碰撞检测;向垂直方向移动时将会触发碰撞检测} 当精灵处于占4个tile的状态时,无需进行碰撞检测,因为检测发生在进入这种状态之前,所以已经进入后就可以随意移动了。 而在精灵从占4个tile的状态变化成占2个tile的状态时,将对它在ROM中映射的内存地址(Sp_addr1,Sp_addr2)进行改变。 以上就完成了对精灵移动的完整描述,如果您发现了Bug,希望及时联系我,在此表示感谢。
|