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;
}
键盘事件处理起来很简单,(简单毛啊)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
![](http://images/wink.gif)
return EKeyWasConsumed;
case EStdKeyNkp6:
case EStdKeyRightArrow:
iMyGameEngine->SetShipMovingTo( ERight
![](http://images/wink.gif)
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
![](http://images/wink.gif)
return EKeyWasConsumed;
}
break;
}
return EKeyWasNotConsumed;
}