package app.sokoban;
import android.view.KeyEvent;
/**
*
* 该类为键盘监听线程类
* 定时检测当前键盘的状态
* 然后根据状态调用相应的处理
*
*/
public class KeyThread extends Thread{
int sleepSpan = 150;
SokobanActivity sokobanActivity;//Activity的引用
boolean flag = true;//循环标志
boolean keyFlag = true;//是否监听标志
int action;//键盘状态码
private boolean KEY_UP = false;//向上键是否被按下
private boolean KEY_DOWN = false;//向下键是否被按下
private boolean KEY_LEFT = false;//向左的键被按下
private boolean KEY_RIGHT = false;//向右的键被按下
private boolean KEYCODE_BACK = false;//返回建是否按下
public KeyThread(SokobanActivity sokobanActivity){//构造器
this.sokobanActivity = sokobanActivity;
}
@Override
public void run(){//重写的方法
while(flag){
if(keyFlag){//是否需要键盘监听
boolean typeFlag = true;//什么类型。推箱子或者走路
action = sokobanActivity.action;//得到当前键盘的状态码
if((action & 0x08) != 0){//上
KEY_UP = true;
}
else{
KEY_UP = false;
}
if((action & 0x04) != 0){//下
KEY_DOWN = true;
}
else{
KEY_DOWN = false;
}
if((action & 0x02) != 0){//左
KEY_LEFT = true;
}
else{
KEY_LEFT = false;
}
if((action & 0x01) != 0){//右
KEY_RIGHT = true;
}
else{
KEY_RIGHT = false;
}
if(KEY_UP == true){//向上键被按下
this.keyFlag = false;
if(!(sokobanActivity.man.i-1 <=0)){//没到最上方时
if(sokobanActivity.map2[sokobanActivity.man.i-1][sokobanActivity.man.j] == 1 || sokobanActivity.map2[sokobanActivity.man.i-1][sokobanActivity.man.j] == 3){//当上侧有箱子时
if(sokobanActivity.map2[sokobanActivity.man.i-2][sokobanActivity.man.j] == 0){//检测箱子的上边是否为空地
if(sokobanActivity.map1[sokobanActivity.man.i-2][sokobanActivity.man.j] == 2 || sokobanActivity.map1[sokobanActivity.man.i-2][sokobanActivity.man.j] == 3){//是否为目的地
sokobanActivity.map2[sokobanActivity.man.i-2][sokobanActivity.man.j] = 3;//绿色的箱子
}
else{
sokobanActivity.map2[sokobanActivity.man.i-2][sokobanActivity.man.j] = 1;
}
sokobanActivity.map2[sokobanActivity.man.i-1][sokobanActivity.man.j] = 0;
sokobanActivity.gameView.tempi = sokobanActivity.man.i-2;//移动箱子
sokobanActivity.gameView.tempj = sokobanActivity.man.j;
BoxThread bt = new BoxThread(1,sokobanActivity,sokobanActivity.gameView.tempi,sokobanActivity.gameView.tempj);//无极运动箱子
bt.start();//启动箱子移动的线程
typeFlag = false;//此时失去屏幕监听
}
}
}
ManMoveThread mm = new ManMoveThread(1,sokobanActivity, typeFlag);//人物无极移动
mm.start();
ManThread mt = new ManThread(1, sokobanActivity, typeFlag);//人物换帧
mt.start();
}
if(KEY_DOWN == true){//向下键被按下
this.keyFlag = false;
if(!((sokobanActivity.man.i + 1) >= (sokobanActivity.map2.length-1))){
if(sokobanActivity.map2[sokobanActivity.man.i+1][sokobanActivity.man.j] == 1 || sokobanActivity.map2[sokobanActivity.man.i+1][sokobanActivity.man.j] == 3){//当下侧有箱子时
if(sokobanActivity.map2[sokobanActivity.man.i+2][sokobanActivity.man.j] == 0){//检测箱子的下边是否为空地
if(sokobanActivity.map1[sokobanActivity.man.i+2][sokobanActivity.man.j] == 2 || sokobanActivity.map1[sokobanActivity.man.i+2][sokobanActivity.man.j] == 3){//是否为目的地
sokobanActivity.map2[sokobanActivity.man.i+2][sokobanActivity.man.j] = 3;
}
else{
sokobanActivity.map2[sokobanActivity.man.i+2][sokobanActivity.man.j] = 1;
}
sokobanActivity.map2[sokobanActivity.man.i+1][sokobanActivity.man.j] = 0;
sokobanActivity.gameView.tempi = sokobanActivity.man.i+2;
sokobanActivity.gameView.tempj = sokobanActivity.man.j;
BoxThread bt = new BoxThread(2,sokobanActivity,sokobanActivity.gameView.tempi,sokobanActivity.gameView.tempj);//无极运动箱子
bt.start();
typeFlag = false;
}
}
}
ManMoveThread mm = new ManMoveThread(2,sokobanActivity, typeFlag);//人物无极移动
mm.start();
ManThread st = new ManThread(2, sokobanActivity,typeFlag);//人物换帧
st.start();
}
if(KEY_LEFT == true){//向左键被按下
this.keyFlag = false;//去掉键盘监听
if(!(sokobanActivity.man.j-1 <= 0)){
if(sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j-1] == 1 || sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j-1] == 3){//当左侧有箱子时
if(sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j-2] == 0){//检测箱子的左边是否为空地
if(sokobanActivity.map1[sokobanActivity.man.i][sokobanActivity.man.j-2] == 2 || sokobanActivity.map1[sokobanActivity.man.i][sokobanActivity.man.j-2] == 3){//是否为目的地
sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j-2] = 3;//绿箱子
}
else{
sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j-2] = 1;
}
sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j-1] = 0;
sokobanActivity.gameView.tempi = sokobanActivity.man.i;
sokobanActivity.gameView.tempj = sokobanActivity.man.j-2;
BoxThread bt = new BoxThread(3,sokobanActivity,sokobanActivity.gameView.tempi,sokobanActivity.gameView.tempj);//无极运动箱子
bt.start();
typeFlag = false;
}
}
}
ManMoveThread mm = new ManMoveThread(3,sokobanActivity, typeFlag);//人物无极移动
mm.start();
ManThread st = new ManThread(3, sokobanActivity,typeFlag);//人物换帧
st.start();
}
if(KEY_RIGHT == true){//向右键被按下
this.keyFlag = false;
if(!(sokobanActivity.man.j+1 >= sokobanActivity.map2[sokobanActivity.man.i].length-1)){
if(sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j+1] == 1 || sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j+1] == 3){//当左侧有箱子时
if(sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j+2] == 0){//检测箱子的左边是否为空地
if(sokobanActivity.map1[sokobanActivity.man.i][sokobanActivity.man.j+2] == 2 || sokobanActivity.map1[sokobanActivity.man.i][sokobanActivity.man.j+2] == 3){//是否为目的地
sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j+2] = 3;
}
else{
sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j+2] = 1;
}
sokobanActivity.map2[sokobanActivity.man.i][sokobanActivity.man.j+1] = 0;
sokobanActivity.gameView.tempi = sokobanActivity.man.i;//移动箱子
sokobanActivity.gameView.tempj = sokobanActivity.man.j+2;
BoxThread bt = new BoxThread(4,sokobanActivity,sokobanActivity.gameView.tempi,sokobanActivity.gameView.tempj);//无极运动箱子
bt.start();
typeFlag = false;
}
}
}
/*if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
dialog();
return false;
} */
ManMoveThread mm = new ManMoveThread(4,sokobanActivity, typeFlag);//人物无极移动
mm.start();
ManThread st = new ManThread(4, sokobanActivity,typeFlag);//人物换帧
st.start();
}
}
try{
Thread.sleep(sleepSpan);//睡觉指定毫秒数
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
android-推箱子游戏源代码
5星 · 超过95%的资源 需积分: 9 103 浏览量
2011-04-17
00:23:06
上传
评论 3
收藏 2.44MB RAR 举报
ctc512435760
- 粉丝: 0
- 资源: 2
最新资源
- 基于MATLAB的钢板表面缺陷检测系统
- MS SQL里生成行政区域县区信息表和相应数据
- delphi实现DBGrid全选和反选功能
- 25C11F41-2B2A-4D1A-AAA8-7C654526B129.pdf
- Android Studio Jellyfish(android-studio-2023.3.1.18-cros.deb)
- MVC+EF框架+EasyUI实现权限管理源码程序
- python第66-75天,Day66-75.rar
- python后端服务project-of-tornado.rar
- python测验,hello-tornado.rar
- 基于SpringBoot+Vue3快速开发平台、自研工作流引擎源码设计.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页