实现俄罗斯方块的左移,右移,加速下移和旋转
来源:互联网 发布:淘宝开书店 编辑:程序博客网 时间:2024/05/21 08:04
俄罗斯方块的左移,右移和加速下移的实现:
1,游戏的启动通过“开始”按钮启动;
2,实现方块的左移,右移,加速下移,旋转;
3,在测试类里面测试;
一、对控制面板进行设置
(1)在CControlPanel.java控制面板类中为控制面板注册监听器,新增如下代码:private ActionListener listener; /*** 给控制面板注册一个监听器* @param l*/public void addListener(ActionListener l){if (l!=null) {this.listener=l;conButtonPanel.registerListener(l);}}
(2)在ConButtonPanel.java控制按钮面板中,为控制面板中的按钮注册监听器,新增如下代码:
/** * 方法说明:为控制面板中的按钮注册监听器 * @param l */public void registerListener(ActionListener l) {btPlay.addActionListener(l);btPause.addActionListener(l);btStop.addActionListener(l);}
二、游戏控制器实现游戏监听接口
public interface GameListener extends ActionListener{public void startGame();public void exitGame();}
三、实现方块的左移、右移、加速下移、旋转:
/** *作 者: Helloway *类 名:CController *类说明: 控制器类,主要用来控制游戏 */public class CController extends KeyAdapter implements GameListener,BlockListener{private BlockFactory factory;private CBlock block;private CShowPanel gamePanel;private int gameLevel;//游戏控制器掌控游戏的难度等级private int STYLES[][]={//方块的28种状态{ 0x0f00, 0x4444, 0x0f00, 0x4444 }, // 长条型的四种状态 { 0x04e0, 0x0464, 0x00e4, 0x04c4 }, { 0x4620, 0x6c00, 0x4620, 0x6c00 }, { 0x2640, 0xc600, 0x2640, 0xc600 }, { 0x6220, 0x1700, 0x2230, 0x0740 }, { 0x6440, 0x0e20, 0x44c0, 0x8e00 }, { 0x0660, 0x0660, 0x0660, 0x0660 }//正方形方块的四种状态都一样};private Point newPos;public CController(BlockFactory factory,CShowPanel gamePanel) {this.factory=factory;this.gamePanel=gamePanel;}/*** 定义一个内部类,专门生产方块*/private class BlockGenerator{public BlockGenerator(){ int style=STYLES[2][1]; block=factory.generateBlock(Color.GREEN, style, new Point(3,2)); int speed; //50表示5毫秒 //3表示调整系数,防止speed=0,一旦speed=0,则sleep(speed)时则没有睡眠,此时速度超快 speed=50*(CGlobal.MAXLEVEL-gameLevel+3); block.addBlockListener(CController.this); block.startMotor(speed); //block.drawSelf(gamePanel, null, -1);}}/*** 开始游戏*/public void startGame() {BlockGenerator blockGenerator=new BlockGenerator();gamePanel.requestFocus();//让游戏画布获得事件焦点}/*** 实现actionEvent事件的方法*/public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("退出")) {exitGame();}//点击"开始"按钮,开始生产自定义方块if (e.getActionCommand().equalsIgnoreCase("开始")) {startGame();}}/*** 实现退出游戏的方法*/public void exitGame() {System.exit(0);}/*** 方法说明:擦除旧方块*/public void erase(CShowPanel panel, Point pos) {for (int i = 0; i < CGlobal.Block_Rows; i++) {for (int j = 0; j < CGlobal.Block_Cols; j++) {CGrid grid = panel.getPanelGrid(pos.x+i, pos.y+j);if (grid==null) {continue;}grid.setGridColor(panel.getPanelColor());}}}/*** 方法说明:移动方块到一个新的位置*/public boolean moveTo(Point newPos) {erase(gamePanel, block.getPos());//block.getPos()擦除当前方块位置block.drawSelf(gamePanel, newPos, -1);//-1表示方块的形状不改变block.setPos(newPos);//更新方块的位置return true;}public void keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_LEFT://左方向键{blockLMove(); }break;case KeyEvent.VK_RIGHT://右方向键{blockRMove(); }break;case KeyEvent.VK_DOWN://下方向键{blockFall();}break;case KeyEvent.VK_UP://上方向键{blockTurn();}break; }}/***方法说明:方块左移*/public void blockLMove(){erase(gamePanel, block.getPos()); //擦除方块当前位置 newPos=new Point(block.getPos().x,block.getPos().y-1); //在新位置画出方块 block.drawSelf(gamePanel, newPos, -1); block.setPos(newPos); //更新方块的位置属性}/***方法说明:方块右移*/public void blockRMove(){erase(gamePanel, block.getPos()); // 擦除方块当前位置newPos = new Point(block.getPos().x, block.getPos().y + 1); // 在新位置画出方块block.drawSelf(gamePanel, newPos, -1);block.setPos(newPos); // 更新方块的位置属性}/***方法说明:方块下落*/public void blockFall(){erase(gamePanel, block.getPos()); // 擦除方块当前位置newPos = new Point(block.getPos().x + 1, block.getPos().y); // 在新位置画出方块block.drawSelf(gamePanel, newPos, -1);block.setPos(newPos); // 更新方块的位置属性 }/***方法说明:方块旋转*/public void blockTurn(){int newStyle = 0;for (int i = 0; i < CGlobal.Block_KIND_NUM; i++)for (int j = 0; j < CGlobal.Block_STATES_NUM; j++) {if (STYLES[i][j]==block.getBlockStyle()) {newStyle = STYLES[i][(j + 1) % CGlobal.Block_STATES_NUM];break;}} turnNext(newStyle);}public synchronized void turnNext(int newStyle) { for (int i = 0; i < CGlobal.Block_Rows; i++) {for (int j = 0; j < CGlobal.Block_Cols; j++) {erase(gamePanel, block.getPos()); block.drawSelf(gamePanel, block.getPos(), newStyle);block.setBlockStyle(newStyle);}} }}
四、在TestMyGame.java测试类中注册监听器,新增如下代码:
myControlPanel.addListener(myController);//为控制面板注册监听器gamePanel.addKeyListener(myController);//为游戏画布注册监听器
具体界面展示如下:
左图实现了方块的左移,右图实现了方块的右移:
以下四幅图实现了方块的旋转:
0 0
- 实现俄罗斯方块的左移,右移,加速下移和旋转
- 进一步完善实现俄罗斯方块的左移,右移,下移和旋转
- Flex 图片调整(Matrix 矩阵)(放大/放小/左旋转/右旋转/上移/下移/左移/右移/还原/调整 ...
- Flex 图片调整(Matrix 矩阵)(放大/放小/左旋转/右旋转/上移/下移/左移/右移/还原/调整
- Flex 图片调整(Matrix 矩阵)(放大/放小/左旋转/右旋转/上移/下移/左移/右移/还原/调整 ...
- ListBox实现上移,下移,左移,右移操作
- ListBox实现上移,下移,左移,右移操作
- ListBox控件实现选项的上移、下移、左移、右移
- ListBox(上移,下移,左移,右移)
- ListBox(上移,下移,左移,右移)
- ListBox(上移,下移,左移,右移)
- js 上移 下移 左移 右移
- js实现动画,右移、左移,上移,下移,左上角移动等
- ListBox(上移,下移,左移,右移)(全部是javascript)
- js选择左移 右移 上移 下移
- 位运算:右移,左旋转,右旋转
- js select实现项目的左移和右移
- 负数的左移和右移
- NFC-SWP系统培训材料(总体)
- JAVA知识 简单记录-多线程
- 第40讲项目7——找数字
- Java字符串、集合
- Button OnClick
- 实现俄罗斯方块的左移,右移,加速下移和旋转
- Python:如何将字符串作为变量名
- 嵌入式 DirectFB
- SASS入门之SASS安装
- StoryBoard
- 排序算法之快速排序和归并排序
- android 开发 命名规范
- Asp.net mvc
- C 宏和位操作