Layer
类
-
属性:
-
x, y, NUM, MODE
: 用于表示位置、数量和模式等信息。 -
TYPE
: 保存木板类型的数组。 -
PROP
: 代表道具的属性。 -
myBoard
: 存储多个木板对象的数组。 -
prop
: 代表道具的对象。 -
myPosition
: 存储位置信息的数组。 -
Layer
类:-
继承自
JLabel
,代表游戏中的图层。 -
包含了关于位置、类型和板块的信息。
-
创建了多个木板(
Board
)对象以及位置(Position
)。 -
通过各种方法(
NewNUM
,NewPosition
,NewTYPE
,NewBoard
,NewPROP
)初始化并管理游戏中的木板和道具。 -
通过
Change()
方法处理道具与游戏中的碰撞交互。
-
-
-
构造方法:
-
接收
y
,mode
,score
参数,根据这些参数初始化对象。 -
调用
NewNUM(score)
初始化NUM
。 -
设置
y
属性。 -
调用
NewPosition(NUM)
初始化位置数组。 -
调用
NewTYPE(NUM, score)
初始化木板类型数组。 -
设置
MODE
。 -
调用
NewBoard(NUM, TYPE)
创建并初始化多个Board
对象。 -
调用
NewPROP(score)
初始化道具属性。
-
-
方法功能:
-
NewNUM(int score)
: 根据得分score
初始化NUM
属性,决定木板数量。NewNUM方法根据得分(score)来确定每层的板(NUM)的数量,具体规则如下:
-
如果得分score小于500,会生成一个0-99的随机数(ran),如果ran小于80,则生成的板的数量(NUM)为1,否则数量为2。
-
如果得分score在500和20000之间,同样生成一个0-99的随机数(ran),如果ran小于80,则生成的板的数量(NUM)为1;如果ran在80和95之间(包含80),数量为2;如果ran大于95,则数量为3。
-
如果得分score大于等于20000,生成的板的数量(NUM)直接设为1。
这个规则的设计意图似乎是随着玩家得分的提高,增加游戏的挑战性。在得分低的时候,每层的板的数量相对较多;
-
-
NewPROP(int score)
: 根据得分score
初始化PROP
属性,决定道具的属性,以及创建道具对象prop
。 -
NewPosition(int NUM)
: 根据给定数量创建并初始化位置数组myPosition
。 -
NewTYPE(int NUM, int score)
: 根据得分和数量初始化木板类型数组TYPE
。 -
NewBoard(int NUM, int[] TYPE)
: 创建并初始化多个Board
对象存储在myBoard
数组中。 -
Change()
: 根据道具的属性PROP
执行不同的操作,比如改变道具状态或可见性。
Layer类的构造函数是如何根据分数来生成板的数量和位置的
-
这个过程主要由Layer类中的构造函数和NewNUM,NewPosition两个方法实现的。具体来看:
-
Layer类构造函数:通过Layer(int y,int mode,int score)构造函数传入三个参数,y代表当前层的纵坐标,mode代表模式,score代表当前的得分。在构造函数中,首先调用NewNUM(score)方法,根据当前得分score来生成board的数量。然后调用NewPosition(NUM)方法,生成对应于板数量的位置。最后,调用NewTYPE(NUM,score)、NewBoard(NUM,TYPE)和NewPROP(score)来生成对应的板和道具。
-
NewNUM方法:这个方法负责根据当前的得分score计算板的数量。如果得分小于500,随机数ran小于80时板的数量NUM设为1,否则设为2。如果得分在500到20000之间,ran小于80时NUM=1, ran小于等于95时NUM=2, 否则NUM=3。否则,NUM设为1。
-
NewPosition方法:该方法负责生成板的位置,传入的参数NUM是板的数量。首先创建一个大小为NUM的Position数组,然后对每个元素进行赋值。每个元素表示一个板的位置,这个位置是通过Position类的构造方法随机生成的。不过新生成的位置与之前已经存在的位置水平距离应大于63像素,否则需要重新生成。
总的来说,当创建一个Layer对象时,会根据当前的得分来确定该层中板的数量和位置,然后生成对应数量和位置的板。
Board
类
-
属性:
-
TYPE
: 木板类型。 -
MODE
: 模式。 -
PROP
: 道具属性。 -
filepath
: 文件路径。
Board
类:-
继承自
JLabel
,代表游戏中的木板或道具。 -
通过不同的构造函数初始化木板或道具。
-
加载对应模式和类型的图片。
-
提供
Change()
方法用于处理碰撞后的更改,例如,当碰到弹簧时将其外观更改为弹起状态。
-
-
构造方法:
-
Board(int type, int mode)
: 初始化木板对象,根据给定的类型和模式。 -
Board(int mode, int prop, int zz)
: 初始化道具对象,根据给定的模式和属性。
-
-
方法功能:
-
BoardLoading(int type)
: 根据类型加载木板图片。 -
PropLoading(int prop)
: 根据属性加载道具图片。 -
Change()
: 根据碰撞状态改变道具的图片状态。
-
Layer类和Board和Position类的逻辑关系
类之间的关系:
-
Layer
类通过调用Board
类的构造函数创建并管理多个木板对象和道具对象。 -
Layer
类的属性myBoard
存储了多个Board
对象,即木板对象。 -
Layer
类内部的方法通过调用Board
类的方法来实现道具和木板的状态变化和加载图片等功能。
逻辑关系:
-
Layer
类通过NewNUM
,NewPosition
,NewTYPE
,NewBoard
,NewPROP
等方法管理和初始化游戏中的木板和道具。 -
Layer
类中的myBoard
和prop
对象是Board
类的实例,用于创建和处理游戏中的木板和道具。 -
Board
类根据不同的模式和类型加载相应的图片,提供了不同类型木板和道具的视觉呈现。 -
通过
Change()
方法,在Layer
类中处理道具与木板的交互,例如,当道具类型为弹簧时,触发对应的外观更改。
Layer
类负责管理游戏中的图层、位置和类型,而Board
类则负责加载和呈现不同类型的木板和道具,二者共同构建了游戏中木板和道具的逻辑与视觉展现。
对于Board类,Layer类和Position类之间的逻辑关系,可以从Layer类的构造函数看出:首先,Layer类的构造函数会根据分数来生成板的数量和位置,然后生成相应数量的板和道具,最后将这些板添加到当前层中。对于每个板,构造函数会创建一个新的Board对象,并根据板的类型加载相应的图片。同时,每个板的位置由Position对象确定。所以,从这个角度来看,Layer类依赖于Board类和Position类,而Board类与Position类之间没有直接的依赖关系。
FileReadWrite类
方法功能:
-
FileRW()
方法:-
该方法用于读取、排序和更新分数记录文件。
-
首先,使用
FileReader
从文件 "ScoreRecord.txt" 中读取数据。 -
将读取的数据逐行存储到
list
中,并关闭读取器。 -
创建
FileWriter
,准备将排好序的数据重新写入同一文件。 -
使用
Collections.sort
对list
中的数据进行排序,排序依据是分数记录的第二部分。 -
将排序后的数据写回到文件中,并更新最高分数记录
highscore
。
-
-
FileRead(JTextArea a)
方法:-
此方法用于读取文件中的分数记录并显示在
JTextArea a
中。 -
同样使用
FileReader
读取文件内容。 -
循环读取文件中的前三行数据,将其逐行添加到
JTextArea a
中展示。
-
-
FileWrite(String a)
方法:-
该方法用于向文件中追加写入新的分数记录。
-
使用
FileWriter
打开文件并设置为追加模式。 -
将参数
a
中的内容写入文件中,并换行。
-
类属性:
-
highscore
: 字符串类型,保存最高分数记录。
总结:
这个类主要用于管理游戏中分数记录的读取和写入。FileRW()
方法负责读取、排序和更新文件中的记录,FileRead()
方法用于展示文件中的记录,而 FileWrite()
方法则负责追加写入新的记录。通过这些方法,可以实现对分数记录文件的读取、展示和更新。
dis()回收木板模块
方法功能
-
迭代处理元素
-
使用
for
循环遍历一个长度为 30 的数组或集合。这里的k
是一个数组(或集合),并且这个循环用于处理数组中的每个元素。
-
-
条件检查
-
在循环中,首先检查
k[i].y
是否大于等于 690。这可能是在检查元素的纵坐标是否达到或超过某个阈值(690)。
-
-
元素处理
-
如果条件成立(
k[i].y
大于等于 690),则执行以下操作:
a. 移除元素 - 如果当前元素的
PROP
属性不为 0,则移除k[i]
的prop
组件(可能是指游戏板块上的道具)。b. 移除板块 - 移除与该元素相关的所有板块(
k[i].myBoard
中的元素)。c. 创建新元素 - 创建一个新的
Layer
对象,可能根据某些参数和计算生成一个新的元素。d. 设置道具位置 - 根据
k[i].PROP
的不同值,设置prop
组件在特定位置(使用setLocation
方法)。e. 重新添加板块 - 遍历
k[i].myBoard
数组中的每个元素,并使用setBounds
方法将它们放置到新的坐标位置上,将板块重新添加到界面中。 -
碰撞检测
这段代码实现了游戏中的碰撞检测,主要涉及两个部分:
-
角色处于跳跃状态时的碰撞检测
-
在
jumpStatus
为真(角色处于跳跃状态)时,检查角色是否与特定类型的物体碰撞。这个检测是根据角色位置(X, Y)
以及物体的位置和大小进行的。 -
使用
if
语句和一系列条件判断物体的类型和角色位置,如果检测到碰撞,将停止角色的跳跃,并在某些情况下可能会使角色消失(比如碰到黑洞)。
-
-
角色处于下落状态时的碰撞检测
-
当
jumpStatus
为假(角色处于下落状态)时,检查角色与不同类型物体的碰撞情况。 -
通过检查角色
(X, Y)
位置是否与特定物体的位置和尺寸重叠,来检测碰撞。 -
如果检测到碰撞,根据不同类型的物体可能执行不同的操作,比如改变跳跃状态、删除板子、改变角色属性(道具类型)、增加得分等。
-
背景移动
这段代码中的背景移动主要是由变量 moveBg
控制的,它是一个标志位,在代码的不同条件下被设置为 true
或 false
,从而控制背景的移动。
-
当
moveBg
为false
时:-
在
if(moveBg==false)
的条件下,执行的代码会根据角色的跳跃状态来处理。当角色在上升过程中(jumpStatus==true
)且moveBg
为false
时,背景不移动。 -
在这种情况下,通过计算角色的位置
Y = StanBasePOS - jump(t)
来模拟角色的上升,然后更新一些参数如t
和propt
。
-
-
当
moveBg
为true
时:-
在
else
语句块中,moveBg
被设置为true
,表示背景开始移动。 -
使用一个循环来更新背景中每个元素的位置,根据一定的速度(
V0-t/a
)更新k[i].y
和k[i].myPosition[j].y
等参数。 -
计算得分
SCORE+=V0-t/a
,更新得分显示。 -
控制角色的动作和状态,比如根据不同条件设置
Stan.TYPE
和Stan.FLASH
。 -
根据不同条件判断游戏状态,比如判断角色是否处于死亡状态。
-
所以,moveBg
控制着背景是移动还是静止。在代码中,根据不同的游戏状态和条件,moveBg
被设置为不同的值,从而控制着背景的移动和停止。