×

俄罗斯方块游戏开发(三)–方块变形与移动

发表于3年前(Dec 23, 2014 7:27:14 PM)  阅读 440  评论 0

分类: Flex 俄罗斯方块

标签: tetris 俄罗斯方块 方块变形 方块移动 监听键盘事件

经过上一节,已经可以使方块自动下落,这节我们给他加入键盘事件,来实现控制方块变形与移动。

首先我们加上键盘事件监听,要考虑的是键盘事件监听加到哪个对象上面,GamePanel?不,如果加在GamePanel上,只有焦点在GamePanel上时才有用,我们应该加在整个应用上,只要焦点在应用上,就能控制方块,所以我们应该加在TETRIS上面。然后我们应该监听KeyboardEvent.KEY_DOWN事件还是KEY_UP事件呢?如果是KEY_UP事件,只有键盘释放时才会移动,这样的话,如果我们按住方向键不动的话,方块将不会移动,所以我们应该监听KEY_DOWN事件。

打开TETRIS.mxml,在init方法里面加上监听:this.addEventListener(KeyboardEvent.KEY_DOWN, mainPanel.gamePanel.keyDown); 这里响应事件的方法是在GamePanel里面的,我们用GamePanel来驱动方块。在GamePanel里面加上public function keyDown(e:KeyboardEvent):void {},这个方法要能被TETRIS调用,所以必须是public的。

运行测试,发现按键操作并没有监听上,在这里我们不应该把监听加在Application上,而是应该加在stage舞台上,他表示内容的整个区域。为什么加在Application上没用,我也说不清楚。我们来修改代码,在TETRIS里添加appInit()方法,这个方法在Application初始化的时候调用,这时stage已被创建,加上this.stage.addEventListener(KeyboardEvent.KEY_DOWN, mainPanel.gamePanel.keyDown);就可以实现监听键盘事件了。

现在我们来看keyDown方法的实现:


public function keyDown(e:KeyboardEvent):void {
	if(e.keyCode==Keyboard.UP) {
		trace("rotate");
		currentShape.rotate();
	} else if(e.keyCode==Keyboard.LEFT) {
		trace("move left");
		currentShape.moveLeft();
	} else if(e.keyCode==Keyboard.RIGHT) {
		trace("move right");
		currentShape.moveRight();
	} else if(e.keyCode==Keyboard.DOWN) {
		trace("move down");
		currentShape.moveDown();
	} else if(e.keyCode==Keyboard.SPACE) {
		trace("down over");
	}
}

这里实现了大部分方法,现在已经可以控制方块移动了。

几点说明:昨天晚上写了不少代码,改了一些bug,设计方面也做了些修改,因为是文字描述,然后又是写完代码描述,所以肯定有很多漏掉的地方,这节的代码肯定也会跟上面写的有很大不同,这是没办法的事。我会尽量将里面的重点挑出来说明。

这节代码地址:/upload/2014/11/23/TETRIS1.03.zip

发表评论