LAB 6::探索和使用鼠标事件、键事件和简单线程(计时器)先决条件-实验室1-5实验室资源:
Java API:https://docs.oracle.com/javase/8/docs/api/
Java Swing:https://docs.oracle.com/javase/tutorial/uiswing/components/index.html
**事件/事件处理程序接口的Swing层次结构提醒。
步骤1:导入存档项目
在这一步中,您将把一个归档的项目导入Eclipse工作区(的文件嵌入每个实验室练习)。每个问题都指向一个单独的java文件。这个以下文档中包含了每个问题所需内容的说明(STEP2以后)。为此创建一个单独的工作空间(例如“EECS1720”)是个好主意课程
a.您可以从上面的链接下载实验室项目文件(请参阅参考资料)这个文件是一个zip文件,也称为归档文件。单击下面的链接打开浏览器中的URL。在打开的对话框中,选择“保存”,而不是“打开”。此文件是通常保存到您的主页或下载文件夹中。
b.打开Eclipse并导入此归档文件重要提示:此过程与您将在实验室测试中使用的过程相同,因此请确保你遵守它,这样你就不会在提交过程中遇到困难实验室测试。不要双击要打开的文件。通过导入此项目,您将把它添加到您的EECS1720工作空间中。执行此操作的方法:
i.打开Eclipse(应用程序→ 编程→ Eclipse)设置/选择您的工作空间
ii。关闭“欢迎”选项卡,然后导航到“文件”→ 进口→ 全体的→ 现有的项目到工作区。点击“下一个”
iii.选择存档文件(您在(a)中下载的zip文件)。选择后,点击完成后,该文件将作为项目在project Explorer中打开。
iv.我们现在准备好进行实验室练习。
第2步:实验室练习
俄罗斯方块是一款益智游戏,玩家可以移动和旋转下落的方块各种形状。游戏的目标是在不留下任何空隙的情况下堆叠积木块之间。在这个实验室中,你将完成与为我们在俄罗斯方块的典型游戏中看到的“方块”建模,并将添加一些简单的基于事件的处理(对按键和鼠标),以允许“操纵”这些块(旋转/移动),以及设置块动画的一些基本功能。如果你以前从未玩过俄罗斯方块,这里有一个维基,里面有很多关于游戏有7个标准区块(称为Tetriminoes)。块都定义在尺寸为3乘3或4乘4的正方形网格。图1:俄罗斯方块游戏(游戏场地)在这个实验室里,你会得到一个类BlockGrid,它可以帮助你描述块的形状。
BlockGrid允许您获取、设置和清除各个网格位置。代 写EECS 1720网格位置是使用一对从零开始的整数索引(行索引和列索引)指定。下图显示了3乘3区块网格上每个网格位置的索引:每个块的形状都可以使用BlockGrid对象来表示。上图(右)显示了一个S块的BlockGrid;白色网格位置的值为false
并且绿色网格位置具有值true。玩家可以将方块旋转到4个可能的方向中的任何一个。以下数字显示了I区块、J区块和S区块的4种可能方向。列A显示块的起始方向。B列显示了旋转后的块向右一次。C列显示了再次向右旋转后的块。D列显示了再次向右旋转后的块。旋转blocks再次将blocks返回到列A。如果玩家向左旋转blocks从A列开始,方向由D列给出,然后由C列给出,然后是列B,返回到列A。俄罗斯方块游戏场通常是一个有20行10列的格子。的位置场上的块由其网格左上角的坐标给出。图像下面示出了在运动场上具有位置(6,14)的J块。对于这个实验室,您将首先完成三种类型的块的实现:IBlock,
Block和SBlock。所有俄罗斯方块都有三个基本特征:(1)它们可以绘制在赛场上;(2) 它们可以被移动;(3) 它们可以旋转。每种类型的块所需的信息,例如块在比赛场地、方块的颜色和方块的形状;该信息可以是由所有块都将扩展的抽象基类Block管理。关系类之间的关系如以下UML图所示:
请注意,在上面的定义中,Block类已经为您完成,但是您将需要完成子类(IBlock、JBlock和SBlock),即它们构造函数,以及spinLeft()和spinRight()方法的重写版本。请参阅关于抽象类的笔记(以及本实验室的视频演练)-在实验室录制会话,并发布在eClass上。本质上,抽象类是一个显式声明为“抽象”的类,并且可以具有一个或多个也可以声明为“抽象”的方法。这意味着抽象方法只被声明(并且没有被定义)。因此,抽象类起作用很像一个接口(也有部分定义)。对于任何抽象功能,都需要通过儿童班。因此,如果一个子类扩展了一个抽象类,为了使其完全具体,它必须对继承的每个抽象特性都有一个完整的实现。只有具有的类完整的实现可以实例化为对象。在这个实验室中,我们想实例化每个子类(作为块的具体子类型)。练习01在这个实验室中,第一个任务是完成子类(IBlock、JBlock和SBlock)。要完成Block子类,首先需要完成的构造函数IBlock、JBlock和SBlock类,以及它们的spinLeft()和spinRight()方法。您还需要完成抽象Block类中的moveDown方法(请参阅供参考的其他移动方法)。Block的构造函数已作为引用为您完成。请注意,该图显示了上面的IBlock的旋转版本(本文档第3页的底部),构成构造函数的基础,该构造函数利用现有的BlockGrid类实例化并存储4个独立的BlockGrid,以在旋转时保持IBlock的形状。
这些都存储在一个名为“网格”的ArrayList中。还有一种颜色、位置,块网格大小和与每个块相关联的网格索引(使用其中一些变量
以初始化父级的类字段)。gridIndex是一个变量,用于指示哪个版本的当前表示IBlock(因此值0表示第一个状态(上图中I块的水平或A位置),而网格索引3表示IBlock的最后一个D位置)。SBlock和JBlock类也是如此(尽管它们的状态指的是3x3块如前一张图所示,位于本文档第3页底部)。首先完成类IBlock、JBlock和SBlock的构造函数,然后运行TetrisBlockDemo.java文件,如果有效,则应在比赛场地的顶端。每次运行时,都会显示不同的块(运行足够
确认所有3个块初始化的时间,并根据位置A。提示:JBlock和SBlock的构造函数应该创建3x3(而不是4x4)GridBlocks,然后应该使用mutator(setter)为块的每个旋转版本设置适当的网格正方形。spinLeft()和spinRight()方法对于所有块应该是相似的,因为它们都包含4个要在其中切换的状态。A=>D如果
向左旋转,如果向右旋转则D=>A(对于所有块)。此外,您可以在完成构造函数(因为稍后将通过事件处理触发旋转行为)
在剩下的练习中,您将使用TetrisBlockDemo.java文件,位于以便添加管理用户与键盘交互的功能(按键事件),作为
以及鼠标,然后最终管理落在游戏场地上的块的动画(在它从底部的应用程序窗口掉下来后重新生成之前)。这不是完成俄罗斯方块的实现,但只是添加了一些交互并测试了这种交互用于在俄罗斯方块游戏中摔倒时管理障碍行为。无行为处理块如何在底部聚合/连接以得分
这个实验室。练习02(使用KeyEvents管理块的spinLeft/spinRight行为)在本练习中,您将完成的KeyListener接口的实现TetrisBlockDemo类。注意,这是为您启动的(可以是提供了所使用的)。该行为应看到以下按键执行以下操作:
“Z”键=>按下时,应将块(存储在块类字段中)向左移动1格position(即应该调用块的moveLeft()方法)
“X”键=>按下时,应向右移动块
“,”键(逗号键)=>应向左旋转块
“.”键(句点键)=>应向右旋转块
“SPACE BAR”key=>应设置将isFalling状态从true切换为false,或从false切换为
rue(此字段将用于练习04。
**请记住,KeyListener最好是针对JFrame注册的(并且应设置为具有焦点。请参阅课堂讲稿了解更多信息。通过运行TetrisBlockDemo.java测试您的实现