Keyboard

S60平台只有一种控制游戏的方法就是键盘控制.虽然Symbian也支持手写输入,但是很不方便,实际应用中通常都是使用键盘来控制.但是各种 手机,他的键盘设计又各不相同,所以,最理想化的就是让用户自己定义控制键.

    键盘事件处理起来很简单,(简单毛啊)AppUI使用HandleKeyEventL方法接收键盘事件.AppUI通过调用OfferKeyEventL将键盘事件传递给活动的View.

    如果使用了AddToStackL,则键盘事件将会自动的从AppUI传递到View并且添加到控制栈中.键盘事件将不在AppUI里进行操作处理,除非键盘事件是全局性的.

    TKeyEvent和TEventCode作为OfferKeyEventL的参数传递,他包含了:键盘事件类型,键盘扫描码,键盘字符码.每一次点击按键都会依次发生如下三个事件:EEventKeyDown (接收按键按下时的信息),EEventKey(在按键按下后,到按键松开前,周期性的收集信息.键盘连击率,RWsSession::GetKeyboardRepeatRate方法设置时间间隔.),EEventKeyUp(收集按键释放信息).

    在实际运用中,如果一个按键被按下,并且持续一段时间,你应该做一个标记,例如持续移动一个物体.当按键被放开时,重新标记.

    另外,EEventKey可以作为一个时间器来使用.在按键按下后,你可以使用他来多次执行同一个动作.使用RWsSession::SetKeyboardRepeatRate来设定动作重复的时间间隔.

    每一个键的TKeyEvent包含两段独立的代码,扫描码和特征码.扫描码:TKeyEvent::iScanCode选择处理键盘事件,主要负责接收按键的顺序.而TKeyEvent::iCode主要是负责处理一些相应的事件.

    在Symbian里面,同时按下两个以上的键是无效的,只有先被按下的那个会被相应,(Power键除外)这就是键盘锁机制.我们通过CAknAppUi提供的SetKeyBlockMode方法来解决这一问题.键盘锁在很多操作 系统中使用,所以这种修改是不推荐的.示例代码:
以下内容为程序代码:

void CMyGameAppUi::ConstructL()

   {

      // Disable key blocking

      SetKeyBlockMode(ENoKeyBlock);

   }

Typically the OfferKeyEventL method in the game"s view would look like this:

TKeyResponse CMyGameView::OfferKeyEventL(const TKeyEvent&  

      aKeyEvent,TEventCode aType) 

   {

   switch(aType)

      {

      case EEventKey:

         if(aKeyEvent.iScanCode == EStdKeyNkp5 || 

               aKeyEvent.iScanCode == EStdKeyDevice3) 

            {

            // EEventKey is called multiple times periodically as 

            // long as the key is pressed down, so the ship will be

            // firing periodically too.

            iMyGameEngine->Fire();

            return EKeyWasConsumed;

            }

         break;



      case EEventKeyDown:

         switch(aKeyEvent.iScanCode)

            {

            // Key pressed down; start moving the ship to left or 

            // right, and keep it moving as long as the key is 

            // pressed.

            case EStdKeyNkp4:

            case EStdKeyLeftArrow:

               iMyGameEngine->SetShipMovingTo( ELeft  ;

               return EKeyWasConsumed;



            case EStdKeyNkp6:

            case EStdKeyRightArrow:

               iMyGameEngine->SetShipMovingTo( ERight  ;

               return EKeyWasConsumed;

            }

         break;



      case EEventKeyUp:

         switch(aKeyEvent.iScanCode)

            {

            // Key released; stop moving the ship

            case EStdKeyNkp4:

            case EStdKeyLeftArrow:

            case EStdKeyNkp6:

            case EStdKeyRightArrow:

               iMyGameEngine->SetShipMovingTo( ENowhere  ;

               return EKeyWasConsumed;

            }

         break;

      }



   return EKeyWasNotConsumed;

   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值