用Unity3D做的一个小demo,简单地实现了人物行走、跳跃,以及场景的碰撞,给需要的朋友做个参考。为什么要用U3D搞2D游戏呢?想想看,如果你希望你的游戏可以在Android、Iphone、PC甚至网页上跑,是不是要学Android、XCODE、C++、AS3?有U3D,虽然做2D游戏有点绕,但开发一次就全搞定啦。
如果你还不了解U3D,请看一下我附件里的教学文档,然后看一看网上的一些入门视频,很快就能上手。
对于这个demo要阐述的几点:
1)如何做2D游戏。
其实还是3D的,只不过模型都是一个单面,忽视Z轴的处理,摄像机始终面向Z轴,让你的游戏看上去像2D而已。
2)如何实现碰撞。
如图所示,我是添加了一些刚体做地面碰撞,然后给精灵也添加刚体属性。脚本里只根据按键改变精灵的位置,物理运算就交给U3D了。
3)如何实现精灵的动画。
我的方法是不断地给精灵模型设置不同的纹理图片。当然你也可以用一张整的纹理图片,然后通过UV设置纹理。
最后附上工程文件。刚接触U3D不久,欢迎朋友加入我的群一起探讨游戏开发:50184572。
个人原创,转载请注明。
reg相当于存储单元,wire相当于物理连线
Verilog 中变量的物理数据分为线型和寄存器型。这两种类型的变量在定义时要设置位宽,缺省为1位。变量的每一位可以是0,1,X,Z。其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。z代表高阻状态或浮空量。
线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。
两者的区别是:即存器型数据保持最后一次的赋值,而线型数据需要持续的驱动
输入端口可以由net/reg驱动,但输入端口只能是net;输出端口可以使net/reg类型,输出端口只能驱动net;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型
用关键词inout声明一个双向端口, inout端口不能声明为寄存器类型,只能是net类型。
***************************************************************************************************************************************************
wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。
不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。
在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
输入端口可以由wire/reg驱动,但输入端口只能是wire;输出端口可以使wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型;输入和双向端口不能声明为寄存器类型。
简单来说硬件描述语言有两种用途:1、仿真,2、综合。
对于wire和reg,也要从这两个角度来考虑。
*********************************************************************************
从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。
这时:
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial
*********************************************************************************
从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。
这时:
1、wire型的变量综合出来一般是一根导线;
2、reg变量在always块中有两种情况:
(1)、always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑
(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)
在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。
注入是事件处理流程如:
1 .View 接受到上报的Touch事件,被分发到相应的View的OnTouch事件中,
2 .我可以通过覆盖这个方法,向InputManager中注入KeyCode事件,如:back,home等
3. .back ,home 等注入事件,然后分别通过Activity.java,和PhoneWindowsManager.java的处理Event实现功能
在3.0中,我可以通过
1 .framework/base/SystemUI/src/com/android/systemui/policy/KeyButtonView.java
可以看到注入事件使用IwindowManager接口中injectInputEventNoWait(KeyEvent event);
这个接口实现在WindowManagerService.java中
2 .然后WindowManagerService中将事件上报给相应的当前系统,被应用或者系统处理
====================================================================
下面是3.0中Home键的处理过程
1 .framework/base/SystemUI/src/com/android/systemui/policy/KeyButtonView.java 中,通过
injectInputEventNoWait ,输入Home键的keyCode(在Manifest中使用这个view中添加Keycode属性)
2 .Home事件在PhoneWindowManager中interceptKeyBeforeDispatching方法中被处理
3 .调用launchHomeFromHotKey();方法回到Launch主页面
===================================================================
android中,有4种注入输入事件的方法分别是:
1.boolean injectKeyEvent(in KeyEvent ev,boolean sync); //注入key事件
2.boolean injectPointerEvent(in MotionEvent ev,boolean sync); //注入mouse事件
3.boolean injectTrackballEvent(in MotionEvent ev,boolean sync); //注入轨迹球事件
4.boolean injectInputEventNoWait(in InputEvent ev); //注入输入事件
这个四个方法都是通过IWindowManager.aidl 方式提供给别的进程调用的。
可利用这个接口实现,windows鼠标,keyboard等事件通过socket传送给android,android的server实现注入事件,进而模拟windows的鼠标的事件,从而达到window鼠标控制android的系统。