Windows Phone 7 有四种用户交互的方式:
- 按键
- 触控
- 手势
- 外设(例如重力感应等)
通常来说Windows Phone 7的按键一般只支持Back按键(返回键)的可控操作,其他的两个是不受控的。
在XNA中会自动的生成这样一段代码,就是表示对Back按键的事件响应。
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit();
意思就是当Back按键被按下(Pressed)的时候,退出游戏。这个一般是比较简单的。
一、触控
触控最简单的方式就是直接触碰屏幕,Windows Phone 7最多支持4个触控点.
11在XNA中,需要先获得触控装置的状态,然后才能获得触控点的信息(比如触控ID,坐标信息等)。
取得触控信息的方法是由TouchPanel来控制的。通过是使用TouchPanel的GetState()可获得TouchCollection集合(由于支持至少4点的触控,所以取得是集合),集合中存放的是TouchLocation的结构,有三个成员:
ID:表示触控的代码,每一次触控都会有一个唯一的编号
Position:触控的位置
State:触控的状态
State有以下三种状态:
①Pressed.即当前用户触控的状态是按下(手指按在屏幕上).
②Moved.即当前用户触控的状态是移动(手指按在屏幕上并移动)
③Release.当手指从触摸屏上离开的时候
下面的一个例子可以获取State的三种状态。
首先我们声明一个String类型的全局变量TouchMessage
string TouchMessage="";
然后添加一个SpriteFont文件,用于在屏幕上显示文本
接着添加一个SpriteFont类型的全局变量,用来将spritefont资源加载到内容管道中,以便程序使用。
SpriteFont spritefont;
加载SpriteFont资源
spritefont = Content.Load<SpriteFont>(@"Fonts\SpriteFont");
然后我们需要在Update中添加捕获TouchPanel状态的代码,通过TouchPanel的Getstate()方法实现。
protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // TODO: Add your update logic here TouchMessage=” ”; TouchCollection tc = TouchPanel.GetState(); //由于GetState获得是状态的集合,所以需要使用foreach取出其中的每个状态。 //通过tc.Count的属性,可以获得集合的数目 foreach (var location in tc) { TouchMessage + = string.Format(" ID:{0}\n Location:{1}\n Position:{2}\n tc.Count:{3}\r\n", location.Id, location.State, location.Position,tc.Count); } base.Update(gameTime); }
然后在Draw方法中绘制出SpriteFont。
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); // TODO: Add your drawing code here spriteBatch.DrawString(spritefont, TouchMessage, Vector2.Zero, Color.Black); spriteBatch.End(); base.Draw(gameTime); }
当手触碰到屏幕时,第一个状态是Pressed,不过很快会变成Moved,当手放开时会出现Released状态,然后会显示没有信号,即TouchMessage内容为空,因为我们是用鼠标在模拟器上点击,只有一个点,当放开鼠标时,就会没有任何状态所以TouchMessage内容为空。