doodleJump游戏难点解释

Layer

  1. 属性:

    • x, y, NUM, MODE: 用于表示位置、数量和模式等信息。

    • TYPE: 保存木板类型的数组。

    • PROP: 代表道具的属性。

    • myBoard: 存储多个木板对象的数组。

    • prop: 代表道具的对象。

    • myPosition: 存储位置信息的数组。

    • Layer类:

      • 继承自JLabel,代表游戏中的图层。

      • 包含了关于位置、类型和板块的信息。

      • 创建了多个木板(Board)对象以及位置(Position)。

      • 通过各种方法(NewNUM, NewPosition, NewTYPE, NewBoard, NewPROP)初始化并管理游戏中的木板和道具。

      • 通过Change()方法处理道具与游戏中的碰撞交互。

  2. 构造方法:

    • 接收 y, mode, score 参数,根据这些参数初始化对象。

    • 调用 NewNUM(score) 初始化 NUM

    • 设置 y 属性。

    • 调用 NewPosition(NUM) 初始化位置数组。

    • 调用 NewTYPE(NUM, score) 初始化木板类型数组。

    • 设置 MODE

    • 调用 NewBoard(NUM, TYPE) 创建并初始化多个 Board 对象。

    • 调用 NewPROP(score) 初始化道具属性。

  3. 方法功能:

    • NewNUM(int score): 根据得分 score 初始化 NUM 属性,决定木板数量。

      NewNUM方法根据得分(score)来确定每层的板(NUM)的数量,具体规则如下:

      1. 如果得分score小于500,会生成一个0-99的随机数(ran),如果ran小于80,则生成的板的数量(NUM)为1,否则数量为2。

      2. 如果得分score在500和20000之间,同样生成一个0-99的随机数(ran),如果ran小于80,则生成的板的数量(NUM)为1;如果ran在80和95之间(包含80),数量为2;如果ran大于95,则数量为3。

      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两个方法实现的。具体来看:

  1. 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)来生成对应的板和道具。

  2. NewNUM方法:这个方法负责根据当前的得分score计算板的数量。如果得分小于500,随机数ran小于80时板的数量NUM设为1,否则设为2。如果得分在500到20000之间,ran小于80时NUM=1, ran小于等于95时NUM=2, 否则NUM=3。否则,NUM设为1。

  3. NewPosition方法:该方法负责生成板的位置,传入的参数NUM是板的数量。首先创建一个大小为NUM的Position数组,然后对每个元素进行赋值。每个元素表示一个板的位置,这个位置是通过Position类的构造方法随机生成的。不过新生成的位置与之前已经存在的位置水平距离应大于63像素,否则需要重新生成。

总的来说,当创建一个Layer对象时,会根据当前的得分来确定该层中板的数量和位置,然后生成对应数量和位置的板。

Board

  1. 属性:

    • TYPE: 木板类型。

    • MODE: 模式。

    • PROP: 道具属性。

    • filepath: 文件路径。

    Board类:

    • 继承自JLabel,代表游戏中的木板或道具。

    • 通过不同的构造函数初始化木板或道具。

    • 加载对应模式和类型的图片。

    • 提供Change()方法用于处理碰撞后的更改,例如,当碰到弹簧时将其外观更改为弹起状态。

  2. 构造方法:

    • Board(int type, int mode): 初始化木板对象,根据给定的类型和模式。

    • Board(int mode, int prop, int zz): 初始化道具对象,根据给定的模式和属性。

  3. 方法功能:

    • BoardLoading(int type): 根据类型加载木板图片。

    • PropLoading(int prop): 根据属性加载道具图片。

    • Change(): 根据碰撞状态改变道具的图片状态。

Layer类和Board和Position类的逻辑关系

类之间的关系:
  • Layer 类通过调用 Board 类的构造函数创建并管理多个木板对象和道具对象。

  • Layer 类的属性 myBoard 存储了多个 Board 对象,即木板对象。

  • Layer 类内部的方法通过调用 Board 类的方法来实现道具和木板的状态变化和加载图片等功能。

逻辑关系:
  • Layer类通过NewNUM, NewPosition, NewTYPE, NewBoard, NewPROP等方法管理和初始化游戏中的木板和道具。

  • Layer类中的myBoardprop对象是Board类的实例,用于创建和处理游戏中的木板和道具。

  • Board类根据不同的模式和类型加载相应的图片,提供了不同类型木板和道具的视觉呈现。

  • 通过Change()方法,在Layer类中处理道具与木板的交互,例如,当道具类型为弹簧时,触发对应的外观更改。

Layer类负责管理游戏中的图层、位置和类型,而Board类则负责加载和呈现不同类型的木板和道具,二者共同构建了游戏中木板和道具的逻辑与视觉展现。

对于Board类,Layer类和Position类之间的逻辑关系,可以从Layer类的构造函数看出:首先,Layer类的构造函数会根据分数来生成板的数量和位置,然后生成相应数量的板和道具,最后将这些板添加到当前层中。对于每个板,构造函数会创建一个新的Board对象,并根据板的类型加载相应的图片。同时,每个板的位置由Position对象确定。所以,从这个角度来看,Layer类依赖于Board类和Position类,而Board类与Position类之间没有直接的依赖关系。

FileReadWrite类

方法功能:
  1. FileRW() 方法:

    • 该方法用于读取、排序和更新分数记录文件。

    • 首先,使用 FileReader 从文件 "ScoreRecord.txt" 中读取数据。

    • 将读取的数据逐行存储到 list 中,并关闭读取器。

    • 创建 FileWriter,准备将排好序的数据重新写入同一文件。

    • 使用 Collections.sortlist 中的数据进行排序,排序依据是分数记录的第二部分。

    • 将排序后的数据写回到文件中,并更新最高分数记录 highscore

  2. FileRead(JTextArea a) 方法:

    • 此方法用于读取文件中的分数记录并显示在 JTextArea a 中。

    • 同样使用 FileReader 读取文件内容。

    • 循环读取文件中的前三行数据,将其逐行添加到 JTextArea a 中展示。

  3. FileWrite(String a) 方法:

    • 该方法用于向文件中追加写入新的分数记录。

    • 使用 FileWriter 打开文件并设置为追加模式。

    • 将参数 a 中的内容写入文件中,并换行。

类属性:
  • highscore: 字符串类型,保存最高分数记录。

总结:

这个类主要用于管理游戏中分数记录的读取和写入。FileRW() 方法负责读取、排序和更新文件中的记录,FileRead() 方法用于展示文件中的记录,而 FileWrite() 方法则负责追加写入新的记录。通过这些方法,可以实现对分数记录文件的读取、展示和更新。

dis()回收木板模块

方法功能
  1. 迭代处理元素

    • 使用 for 循环遍历一个长度为 30 的数组或集合。这里的 k 是一个数组(或集合),并且这个循环用于处理数组中的每个元素。

  2. 条件检查

    • 在循环中,首先检查 k[i].y 是否大于等于 690。这可能是在检查元素的纵坐标是否达到或超过某个阈值(690)。

  3. 元素处理

    • 如果条件成立(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 方法将它们放置到新的坐标位置上,将板块重新添加到界面中。

碰撞检测

这段代码实现了游戏中的碰撞检测,主要涉及两个部分:

  1. 角色处于跳跃状态时的碰撞检测

    • jumpStatus 为真(角色处于跳跃状态)时,检查角色是否与特定类型的物体碰撞。这个检测是根据角色位置 (X, Y) 以及物体的位置和大小进行的。

    • 使用 if 语句和一系列条件判断物体的类型和角色位置,如果检测到碰撞,将停止角色的跳跃,并在某些情况下可能会使角色消失(比如碰到黑洞)。

  2. 角色处于下落状态时的碰撞检测

    • jumpStatus 为假(角色处于下落状态)时,检查角色与不同类型物体的碰撞情况。

    • 通过检查角色 (X, Y) 位置是否与特定物体的位置和尺寸重叠,来检测碰撞。

    • 如果检测到碰撞,根据不同类型的物体可能执行不同的操作,比如改变跳跃状态、删除板子、改变角色属性(道具类型)、增加得分等。

背景移动

这段代码中的背景移动主要是由变量 moveBg 控制的,它是一个标志位,在代码的不同条件下被设置为 truefalse,从而控制背景的移动。

  • moveBgfalse 时:

    • if(moveBg==false) 的条件下,执行的代码会根据角色的跳跃状态来处理。当角色在上升过程中(jumpStatus==true)且 moveBgfalse 时,背景不移动。

    • 在这种情况下,通过计算角色的位置 Y = StanBasePOS - jump(t) 来模拟角色的上升,然后更新一些参数如 tpropt

  • moveBgtrue 时:

    • else 语句块中,moveBg 被设置为 true,表示背景开始移动。

    • 使用一个循环来更新背景中每个元素的位置,根据一定的速度(V0-t/a)更新 k[i].yk[i].myPosition[j].y 等参数。

    • 计算得分 SCORE+=V0-t/a,更新得分显示。

    • 控制角色的动作和状态,比如根据不同条件设置 Stan.TYPEStan.FLASH

    • 根据不同条件判断游戏状态,比如判断角色是否处于死亡状态。

所以,moveBg 控制着背景是移动还是静止。在代码中,根据不同的游戏状态和条件,moveBg 被设置为不同的值,从而控制着背景的移动和停止。

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟鱼但不是终于

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值