Flash/Flex学习笔记(17):按键捕获
时间:2022-04-23
本文章向大家介绍Flash/Flex学习笔记(17):按键捕获,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
先来看简单的单个按键捕获:
package {
import flash.display.Sprite;
import fl.controls.Label;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class KeyDown extends Sprite {
private var lbl:Label;
private var ball:Sprite;
public function KeyDown():void {
init();
}
private function init():void {
stage.focus=this;//N多资料上说要先设置焦点,但是在实际测试中,发现不加这一行,好象也能处理键盘事件?
lbl = new Label();
lbl.text="请按键,这里将显示您的按键值,按方向键可以移动小球";
lbl.autoSize="center";
addChild(lbl);
lbl.width=stage.stageWidth;
lbl.height=20;
lbl.move(0,10);
ball = new Sprite();
addChild(ball);
//画小球
ball.graphics.beginFill(0xff0000);
ball.graphics.drawCircle(0,0,30);
ball.graphics.endFill();
//定位到舞台中心
ball.x=stage.stageWidth/2;
ball.y=stage.stageHeight/2;
stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);
}
public function KeyDownHandler(e:KeyboardEvent):void {
lbl.text="您的按键值是:"+e.keyCode.toString()+";按键是:"+String.fromCharCode(e.keyCode);
switch (e.keyCode) {
case Keyboard.UP :
ball.y-=10;
break;
case Keyboard.DOWN :
ball.y+=10;
break;
case Keyboard.LEFT :
ball.x-=10;
break;
case Keyboard.RIGHT :
ball.x+=10;
default :
break;
}
if (e.ctrlKey) {
lbl.text="您按下了Ctrl键!";
}
if (e.shiftKey) {
lbl.text="您按下了Shift键!";
}
//注:实际上,在很多浏览器,包括flash播放器里,Alt都是默认用做菜单激活键的,所以Alt键会被他们拦截,从而导致Flash无法捕获
if (e.altKey) {
lbl.text="您按下了Alt键!";
}
}
}
}
再来看下类似: A + B + C 的这种组合键捕获:
先分析一下过程,比如用户按下Ctrl + A 时,实际上是先按下Ctrl键,同时触发KeyDown事件,然后在Ctrl不放的同时,再按下A键,再次触发KeyDown事件,然后松开(触发KeyUp事件),这是一个顺序的过程。
思路:在用户按下键且尚未松开任何键时,可以考虑用一个数据,把本次按下的所有的键值都存储起来,然后等待用户松开,一旦松开,就可以认为本次组合键 输入完成,这时再清空数据,准备下次使用,这样数组中保存的就是用户按下的组合键。
按这个思路把上面的代码改进一下:
package {
import flash.display.Sprite;
import fl.controls.Label;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.ui.*;
public class KeyDown extends Sprite {
private var lbl:Label;
private var ball:Sprite;
private var keyValueArr:Array;//捕获组合键时,用来存放本次(在未触KeyUp事件前)所有按下的所有键值
private var keyNameArr:Array;//按键值对应的字符
public function KeyDown():void {
init();
}
private function init():void {
stage.focus=this;//N多资料上说要先设置焦点,但是在实际测试中,发现不加这一行,好象也能处理键盘事件?
lbl = new Label();
lbl.text="请按键(支持Ctrl,Shift组合键),这里将显示您的按键值,按方向键可以移动小球";
lbl.autoSize="center";
addChild(lbl);
lbl.width=stage.stageWidth;
lbl.height=20;
lbl.move(0,10);
ball = new Sprite();
addChild(ball);
//画小球
ball.graphics.beginFill(0xff0000);
ball.graphics.drawCircle(0,0,30);
ball.graphics.endFill();
//定位到舞台中心
ball.x=stage.stageWidth/2;
ball.y=stage.stageHeight/2;
stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler);
keyValueArr = new Array();
keyNameArr = new Array();
}
public function KeyDownHandler(e:KeyboardEvent):void {
//注:既然Alt总是被浏览器或播放器菜单栏 拦截,干脆就不检测了
if (!(e.keyCode==Keyboard.SHIFT||e.keyCode==Keyboard.CONTROL)) {
keyValueArr.push(e.keyCode);
keyNameArr.push(String.fromCharCode(e.keyCode));
}
lbl.text="您的按键值是:" + e.keyCode.toString()+";按键是:" + String.fromCharCode(e.keyCode);
switch (e.keyCode) {
case Keyboard.UP :
ball.y-=10;
break;
case Keyboard.DOWN :
ball.y+=10;
break;
case Keyboard.LEFT :
ball.x-=10;
break;
case Keyboard.RIGHT :
ball.x+=10;
default :
break;
}
if (e.ctrlKey) {
if (keyValueArr.length>0) {
lbl.text="您按下了Ctrl + "+keyNameArr.join(',');
}
}
if (e.shiftKey) {
if (keyValueArr.length>0) {
lbl.text="您按下了Shift + "+keyNameArr.join(',');
}
}
}
public function KeyUpHandler(e:KeyboardEvent):void {
keyValueArr.length=0;
keyNameArr.length=0;
}
}
}
最后再来看看所谓的"八方向"移动:很多小游戏都可以用方向键控制人物的移动方向,上面的示例中,只能沿水平垂直四个方向移动,如果要做到8方向移动,就要用到组合键,仍然在上面的代码基本上做些修改:
package {
import flash.display.Sprite;
import fl.controls.Label;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.ui.*;
public class KeyDown extends Sprite {
private var lbl:Label;
private var ball:Sprite;
private var keyValueArr:Array;//捕获组合键时,用来存放本次(在未触KeyUp事件前)所有按下的所有键值
private var keyNameArr:Array;//按键值对应的字符
public function KeyDown():void {
init();
}
private function init():void {
stage.focus=this;//N多资料上说要先设置焦点,但是在实际测试中,发现不加这一行,好象也能处理键盘事件?
lbl = new Label();
lbl.text="请按键(支持Ctrl,Shift组合键),这里将显示您的按键值,按方向键可以移动小球(支持8方向)";
lbl.autoSize="center";
addChild(lbl);
lbl.width=stage.stageWidth;
lbl.height=20;
lbl.move(0,10);
ball = new Sprite();
addChild(ball);
//画小球
ball.graphics.beginFill(0xff0000);
ball.graphics.drawCircle(0,0,30);
ball.graphics.endFill();
//定位到舞台中心
ball.x=stage.stageWidth/2;
ball.y=stage.stageHeight/2;
stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler);
keyValueArr = new Array();
keyNameArr = new Array();
}
public function KeyDownHandler(e:KeyboardEvent):void {
//注:既然Alt总是被浏览器或播放器菜单栏 拦截,干脆就不检测了
if (!(e.keyCode==Keyboard.SHIFT||e.keyCode==Keyboard.CONTROL)) {
if (keyValueArr.indexOf(e.keyCode)==-1) {
keyValueArr.push(e.keyCode);
keyNameArr.push(String.fromCharCode(e.keyCode));
}
}
lbl.text="您的按键值是:"+ keyValueArr.join(',') +";按键是:" + keyNameArr.join(',');
//单方向移动
if (keyValueArr.length==1) {
switch (e.keyCode) {
case Keyboard.UP :
ball.y-=10;
break;
case Keyboard.DOWN :
ball.y+=10;
break;
case Keyboard.LEFT :
ball.x-=10;
break;
case Keyboard.RIGHT :
ball.x+=10;
default :
break;
}
} else if (keyValueArr.length>1) {
//trace(keyValueArr.join(','));
if (keyValueArr.indexOf(Keyboard.UP)!=-1 && keyValueArr.indexOf(Keyboard.LEFT)!=-1) {
//左上
ball.x -= 10;
ball.y -= 10;
} else if (keyValueArr.indexOf(Keyboard.UP)!=-1 && keyValueArr.indexOf(Keyboard.RIGHT)!=-1) {
//右上
ball.x += 10;
ball.y -= 10;
}
else if (keyValueArr.indexOf(Keyboard.DOWN)!=-1 && keyValueArr.indexOf(Keyboard.RIGHT)!=-1) {
//右下
ball.x += 10;
ball.y += 10;
}
else if (keyValueArr.indexOf(Keyboard.DOWN)!=-1 && keyValueArr.indexOf(Keyboard.LEFT)!=-1) {
//左下
ball.x -= 10;
ball.y += 10;
}
}
if (e.ctrlKey) {
if (keyValueArr.length>0) {
lbl.text="您按下了Ctrl + "+keyNameArr.join(',');
}
}
if (e.shiftKey) {
if (keyValueArr.length>0) {
lbl.text="您按下了Shift + "+keyNameArr.join(',');
}
}
}
public function KeyUpHandler(e:KeyboardEvent):void {
keyValueArr.length=0;
keyNameArr.length=0;
}
}
}
- 算法系列
- .net页面生命周期
- JavaScript 基础(四) 循环
- 【译】WordPress 中的50个过滤器(6):第41-50个过滤器
- 【译】WordPress 中的50个过滤器(5):第31-40个过滤器
- 使用VS2010 C#开发ActiveX控件
- JavaScript 基础(三) 对象 条件判断
- “大数据+定制化服务”或将引领高端旅游市场
- FrameLayout(框架布局)
- WordPress 中变量$allowedposttags 添加自定义HTML属性
- 移动端UC /QQ 浏览器的部分私有Meta 属性
- RelativeLayout(相对布局)
- TableLayout(表格布局)
- 【MindiaX实例】 PHP 在foreach 中获取JSON 单个数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【STM32F407】第9章 RL-TCPnet V7.X调试方法(Event Recorder和串口两种)
- CentOS7的udev的绑定规则
- 案例:记录一则强制开库遭遇ORA-16433的处理过程
- mybatis升级为mybatis-plus踩到的坑
- Treepath
- linux 远程ssh免密登录
- npm 安装 electron taobao镜像 404错误 自用 实践笔记
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署
- 队列的一种实现:循环队列
- StackExchange.Redis .net core Timeout performing 超时问题
- G1 垃圾回收器简单调优
- Docker安装官方Redis镜像并启用密码认证 实践笔记
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚
- linux centos 安装Jenkins(非docker方式)
- mysql5.7 derived_merge=on 弄丢了我的 order by!