package cn.campsg.practical.bubble;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import javafx.animation.ParallelTransition;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.campsg.practical.bubble.common.Message;
import cn.campsg.practical.bubble.common.StarAnimation;
import cn.campsg.practical.bubble.common.StarFormUtils;
import cn.campsg.practical.bubble.entity.MovedStar;
import cn.campsg.practical.bubble.entity.Star;
import cn.campsg.practical.bubble.entity.StarList;
import cn.campsg.practical.bubble.service.ScoreService;
import cn.campsg.practical.bubble.service.StarService;
/**
* 泡泡糖窗体类,用于显示泡泡糖阵列、处理泡泡糖点击事件与动画
*
*
* @author Frank.Chen
* @version 1.5
*/
public class MainForm extends Application {
private Logger logger = Logger.getLogger(MainForm.class);
private AnchorPane mRoot = null;
private AnchorPane mAnchorPane = null;
private Label scoreLabel = null;
private StarList mCurretStars = null;
private StarService mStarService = null;
private ScoreService mScoreService = null;
// 开始分数为0
private static int score = 0;
// 开始关卡为1
private static int currentLevel = 1;
// 保存通关上一关时的分数,也就是当前这一关的起始分数
private static int lastLevelScore = 0;
// 未通关时保存当前关卡的等级(初始值为第一关)
private static int lastLevel = 1;
// 未通过时当前通关的目标分数(初始目标分数1000)
private static int lastLevelTargetScore = 0;
public static void show(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
initServiceComponent();
try {
AnchorPane root = (AnchorPane) FXMLLoader.load(getClass()
.getResource("/res/layout/main_layout.fxml"));
if (logger.isDebugEnabled())
addDebugListener(root);
// 将主布局加入到视图场景中
Scene scene = new Scene(root);
primaryStage.setScene(scene);
// 页面加载时或重新开始新的泡泡糖棋局时候初始化泡泡糖
initGameStars(root);
primaryStage.setTitle("消灭泡泡糖-Popstar3");
primaryStage.setResizable(false);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private void addDebugListener(AnchorPane root) {
root.setOnMouseClicked(new EventHandler<Event>() {
@Override
public void handle(Event event) {
logger.debug(event.getTarget().getClass().getName());
if(event.getTarget() instanceof Text) {
logger.debug(((Text)event.getTarget()).getText());
}
}
});
}
/**
* 页面加载时或重新开始新的泡泡糖棋局时候初始化泡泡糖
*
* @param root
* 窗体总布局
*
*/
private void initGameStars(AnchorPane root) {
// 调用业务层获取随机10*10泡泡糖阵列
mCurretStars = mStarService.createBubbleMatrix();
if (mCurretStars == null || mCurretStars.size() == 0) {
logger.error("服务端没有提供正确的泡泡糖阵列");
return;
}
mRoot = root;
// 获取泡泡糖布局对象
mAnchorPane = (AnchorPane) root.lookup("#game_pane");
// 调试状态下可显示泡泡糖的坐标
if (logger.isDebugEnabled())
showStarsCoordinate();
StartEventHandler handler = new StartEventHandler();
// 将StarList中的所有Star对象转换成Label视图对象
List<Label> starFrames = StarFormUtils.convert(mCurretStars);
for(Label starFrame : starFrames)
starFrame.setOnMouseClicked(handler);
// 将Label加入到视图布局中
for (int i = 0; i < starFrames.size(); i++) {
mAnchorPane.getChildren().add(starFrames.get(i));
}
// 获得第一关的通关分数
lastLevelTargetScore = mScoreService.getCurrentLevelScore();
Label lastLevelTargetScore1 = (Label) root.lookup("#targetScore");
lastLevelTargetScore1.setText(lastLevelTargetScore+"");
}
/**
* 调试状态下可显示泡泡糖的坐标
*
* @param root
* @param pane
*/
private void showStarsCoordinate() {
// 获取菜单对象
FlowPane menu_title = (FlowPane) mRoot.lookup("#menu_title");
menu_title.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
for (int i = 0; i < mAnchorPane.getChildren().size(); i++) {
Label button = (Label) mAnchorPane.getChildren().get(i);
button.setText("(" + button.getId() + ")");
}
}
});
menu_title.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
for (int i = 0; i < mAnchorPane.getChildren().size(); i++) {
Label button = (Label) mAnchorPane.getChildren().get(i);
button.setText("");
}
}
});
}
/**
* 初始化并加载服务类组件
*/
private void initServiceComponent() {
ApplicationContext context = new ClassPathXmlApplicationContext(
"service.xml");
try {
mStarService = (StarService) context.getBean("starService");
mScoreService = (ScoreService) context.getBean("scoreService");
} catch (Exception e) {
logger.error("无法加载StarService和ScoreService,系统非法退出");
System.exit(0);
}
}
protected boolean isClickAvailable = true;
/**
* 泡泡糖被点击的事件处理对象
*/
public class StartEventHandler implements EventHandler<MouseEvent> {
public StartEventHandler() {
mAnchorPane = (AnchorPane) mRoot.lookup("#game_pane");
scoreLabel = (Label) mRoot.lookup("#lblScore");
}
@Override
public void handle(MouseEvent event) {
if(isClickAvailable == false)
return;
isClickAvailable = false;
// 获取被点击的泡泡糖视图
Label starFrame = (Label) event.getTarget();
// 将视图转换为泡泡糖实体
Star base = StarFormUtils.convert(starFrame);
// 从服务端获取需要清除的泡泡糖列表
StarList clearStars = mStarService.tobeClearedStars(base,
mCurretStars);
// 无需消除泡泡糖,则停止点击事件的处理(例如:用户点击的泡泡糖周边没有关联颜色的泡泡糖)
if (clearStars == null || clearStars.size() == 0){
isClickAvailable = true;
return;
}
// 从服务端获取需要移动的泡泡糖(垂直方向的)
StarList movedYStars = mStarService.getVMovedStars(clearStars,
mCurretStars);
// 根据从服务端获取需要清除的泡泡糖列表,清除对应的视图
clearStars(clearStars);
if (logger.isDebugEnabled())
logger.debug("清除后相关泡泡糖后,内存泡泡糖对象阵列:" + mCurretStars);
// 创建线程同步器,用于保证水平泡泡糖移动慢于垂直移动
CountDownLatch yLatch = new CountDownLatch(movedYStars.size());
// 移动界面上的泡泡糖,并保证水平移动在垂直移动后完成
moveYStars(movedYStars, yLatch);
if (logger.isDebugEnabled())
logger.debug("垂直方向泡泡糖移动后(Y轴),内存泡泡糖对象阵列:" + mCurretStars);
// 移动水平方向的泡泡糖(在垂直方向星星完成后操作)
new MoveXStarController(yLatch).start();
// 显示分数动画
showScore(clearStars);
}
}
/**
* 每次消除一组泡泡糖后,显示分数动画
*
* @param clearStars
* 待消除的泡泡糖列表
*
*/
private void showScore(StarList clearStars) {
int addScore = mScoreService.getScoreByStars(clearStars);
if (addScore != 0) {
// 获得所有待移动泡泡糖的坐标
List<Integer> clearStarsCoordinate = StarFormUtils
.getClearStarsCoordinate(clearStars);
// 动画显示点击所得增加分数
ParallelTransition parallelTransition = StarAnimation
.getScoreAnimation(mRoot, clearStarsCoordinate,
mScoreService);
parallelTransition.play();
score += addScore;
// 刷新总得分
scoreLabel.setText("分数: " + score);
}
// 当分数第一次达到每一关的目标分数时出现通关通知
if (mScoreService.isNoticedPassLevel
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Java程序设计实践泡泡糖游戏代码+文档说明(95分以上项目)zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 Java程序设计实践泡泡糖游戏代码+文档说明(95分以上项目)zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。Java程序设计实践泡泡糖游戏代码+文档说明(95分以上项目)zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。Java程序设计实践泡泡糖游戏代码+文档说明(95分以上项目)zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。Java程序设计实践泡泡糖游戏代码+文档说明(95分以上项目)zip已获导师指导并通过的97分的高分大作业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。Java程序设计实践泡泡糖游戏代码+文档说明(95分以上项目)zip已获导
资源推荐
资源详情
资源评论
收起资源包目录
Java程序设计实践泡泡糖游戏代码+文档说明(95分以上项目)zip (201个子文件)
.classpath 841B
.classpath 783B
.classpath 783B
.classpath 783B
score.conf 16B
score.conf 16B
score.conf 16B
score.conf 16B
score.conf 16B
score.conf 16B
score.conf 16B
score.conf 16B
skin2.css 1KB
skin2.css 1KB
skin2.css 1KB
skin2.css 1KB
skin2.css 1KB
skin2.css 1KB
skin2.css 1KB
skin2.css 1KB
skin1.css 944B
skin1.css 944B
skin1.css 944B
skin1.css 944B
skin1.css 944B
skin1.css 944B
skin1.css 944B
skin1.css 944B
build.fxbuild 298B
build.fxbuild 298B
build.fxbuild 298B
build.fxbuild 298B
main_layout.fxml 4KB
main_layout.fxml 4KB
main_layout.fxml 4KB
main_layout.fxml 4KB
main_layout.fxml 4KB
main_layout.fxml 4KB
main_layout.fxml 4KB
main_layout.fxml 4KB
.gitattributes 378B
.gitignore 566B
MainForm.java 18KB
StarAnimation.java 17KB
StarAnimation.java 17KB
MainForm.java 16KB
StarAnimation.java 14KB
StarServiceImpl.java 11KB
StarFormUtils.java 5KB
StarFormUtils.java 5KB
StarFormUtils.java 5KB
MainForm.java 5KB
StarsUtil.java 4KB
StarsUtil.java 4KB
ScoreServiceImpl.java 4KB
MainForm.java 4KB
StarServiceImpl.java 4KB
ScoreServiceImpl.java 4KB
ScoreService.java 2KB
ScoreService.java 2KB
StarServiceImpl.java 2KB
ScoreManager.java 2KB
StarService.java 2KB
StarService.java 2KB
StarService.java 2KB
ScoreManager.java 2KB
StarService.java 2KB
StarServiceImpl.java 2KB
StarsUtil.java 914B
StarsUtil.java 757B
Message.java 404B
Message.java 404B
Message.java 404B
MainClass.java 139B
MainClass.java 139B
MainClass.java 139B
MainClass.java 139B
front.jpg 6KB
front.jpg 6KB
front.jpg 6KB
front.jpg 6KB
front.jpg 6KB
front.jpg 6KB
front.jpg 6KB
front.jpg 6KB
获得待消除的泡泡糖(1).md 6KB
显示泡泡糖(1).md 6KB
随机显示泡泡糖(1).md 4KB
获得待消除的泡泡糖(2).md 3KB
泡泡糖体验(1).md 3KB
随机显示泡泡糖(3).md 2KB
随机显示泡泡糖(2).md 1KB
获得待消除的泡泡糖(4).md 1KB
显示泡泡糖(2).md 1KB
获得待消除的泡泡糖(5).md 1KB
显示泡泡糖(3).md 1KB
获得待消除的泡泡糖(3).md 1KB
泡泡糖体验(2).md 1KB
泡泡糖体验(3).md 994B
front2.png 73KB
共 201 条
- 1
- 2
- 3
资源评论
不安分的小女孩
- 粉丝: 9691
- 资源: 2293
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功