{"id":22243831,"url":"https://github.com/guyi2000/tan","last_synced_at":"2025-03-25T10:44:57.945Z","repository":{"id":242317862,"uuid":"809249187","full_name":"guyi2000/Tan","owner":"guyi2000","description":"最强弹一弹游戏-java实现","archived":false,"fork":false,"pushed_at":"2024-06-02T06:39:05.000Z","size":36474,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-30T10:13:07.546Z","etag":null,"topics":["game","game-development","java"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guyi2000.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-02T06:29:11.000Z","updated_at":"2024-06-02T06:39:59.000Z","dependencies_parsed_at":"2024-06-02T07:50:34.981Z","dependency_job_id":null,"html_url":"https://github.com/guyi2000/Tan","commit_stats":null,"previous_names":["guyi2000/tan"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guyi2000%2FTan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guyi2000","download_url":"https://codeload.github.com/guyi2000/Tan/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245449531,"owners_count":20617187,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["game","game-development","java"],"created_at":"2024-12-03T04:29:31.793Z","updated_at":"2025-03-25T10:44:57.907Z","avatar_url":"https://github.com/guyi2000.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 最强弹一弹游戏\n\n## 游戏操作方式\n\n![image-20210607012513482](assets/image-20210607012513482.png)\n\n- 进入界面，点击开始游戏，即可开始游戏\n\n![image-20210607012537005](assets/image-20210607012537005.png)\n\n- 开始游戏后，界面左上角为当前分数与当前球数，右上角为菜单按钮，其余部分为游戏屏幕\n- 游戏屏幕可分为边框内与边框外，球不会运动到边框外\n\n![image-20210607013148779](assets/image-20210607013148779.png)\n\n- 鼠标点击即可发球，程序自动计算并向鼠标位置发射小球，其余流程与大作业要求相同\n\n![image-20210607012623258](assets/image-20210607012623258.png)\n\n- 点击右上角菜单按钮后，会出现菜单面板，上面可以点选重新开始游戏，或显示操作提示\n- 点选重新开始游戏后，游戏会重新开始\n\n![image-20210607012643318](assets/image-20210607012643318.png)\n\n- 点选操作提示后，会显示操作提示，单击鼠标即可退出\n- 在游戏界面点击鼠标右键也可打开操作提示\n\n![image-20210607013457572](assets/image-20210607013457572.png)\n\n- 如果几何体到达顶部，游戏结束，会弹出游戏结束界面，显示最终得分，此时单击也可以重新开始游戏\n\n## 架构设计\n\n- 具体可参见 API 文档，API 文档在提交文件的 `doc` 文件夹下\n- 类图也附在 API 文档内，当然下面将详细解释架构设计\n\n![类图](assets/class.png)\n\n- 上面是整个项目的类图\n\n主要的类为 `GeometryObejct` 类，所有的几何体与道具抽象类 `ToolBox` 均继承于此，其定义了几何体的行为，绘制方法，碰撞方法等\n\n![package](assets/package.svg)\n\n- 上图即为 `geometryobejct` 包的类图，通过这种继承关系，可以增强代码的复用性，也提升程序的可修改性\n- `GameUpdater` 控制程序时钟，使用高分辨率的系统时钟作为更新触发器，也实现了将Swing组件与Graphics共同主动渲染\n- `GameData` 存储游戏数据，这里定义了整个游戏流程\n- `bgm` 包处理背景音乐\n- `view` 包定义了大部分界面，处理了界面逻辑\n- `main` 包是程序运行的入口\n- `utilities` 本意是作为功能函数，但这里用做一些全局定义的字体等，减小新建对象带来的开销\n- 通过设计资源文件夹的方式，将资源文件与代码文件分开，提升了代码的观感\n- 本设计还有几处有趣之处，将在后面的亮点章节说明\n\n## 实现的提高部分\n\n- [x] 使用双缓冲绘图避免画面闪烁\n- [x] 实现背景音乐\n- [x] 优化程序提高效率，在有许多几何体时，依旧保持帧率流畅，如下图\n\n![image-20210607013336021](assets/image-20210607013336021.png)\n\n## 亮点\n\n- 双缓冲绘图参考了\u003chttps://www.jamesgames.org/resources/double_buffer/double_buffering_and_active_rendering.html\u003e，可能有部分代码比较相似，特此声明。除此以外，其余部分代码均为自己写成。\n- 当小球在几何体上速度几乎为0时，将会弹起，以避免小球在几何体上停留过长时间\n- 小球在第一次发生撞击前不受重力影响，指哪打哪，在第一次撞击后，小球会受重力影响，呈抛物线轨迹运动\n- 考虑 Insets，将窗体大小设置为真实值，并且不可更改\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguyi2000%2Ftan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguyi2000%2Ftan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguyi2000%2Ftan/lists"}