JavaFX游戏(四连环)

这是我的第一个JavaFX游戏教程,也是我关于JavaFX面板的第一篇博客文章。 我仅用200几行代码就完成了这款四连环游戏,足以应付一个简单的游戏。 我在这里使用GridPane面板对磁盘进行布局,GridPane是JavaFX布局窗格之一,但它与另一个窗格不同,因为它在行和列的灵活网格内布局了其子项。

这是有关如何设置GridPanes列和行约束的代码片段:

gridpane.getColumnConstraints().addAll(new ColumnConstraints(100,100,Double.MAX_VALUE), new ColumnConstraints(100,100,Double.MAX_VALUE),new ColumnConstraints(100,100,Double.MAX_VALUE),new ColumnConstraints(100,100,Double.MAX_VALUE));gridpane.getRowConstraints().addAll(new RowConstraints(100,100,Double.MAX_VALUE), new RowConstraints(100,100,Double.MAX_VALUE),new RowConstraints(100,100,Double.MAX_VALUE),new RowConstraints(100,100,Double.MAX_VALUE));

GridPane将具有4行4列100宽的正方形网格。

您可以享受下面的其余代码。

import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.beans.property.SimpleObjectProperty;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.Reflection;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Path;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
import javafx.util.Duration;/**** @author mark_anro*/
public class Main extends Application {/*** @param args the command line arguments*/private SimpleObjectProperty<Color> playerColorProperty = new SimpleObjectProperty<Color>(Color.RED);private int r;private int c;public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) {final BorderPane root = new BorderPane();final GridPane gridpane = new GridPane();primaryStage.setTitle('JavaFX Connect Four');primaryStage.setResizable(true);final Button addCellButton = new Button('Add Grids');Scene scene = new Scene(root, 750, 680, true);scene.setFill(Color.BLACK);scene.getStylesheets().add('net/glyphsoft/styles.css');gridpane.setTranslateY(20);gridpane.setAlignment(Pos.CENTER);gridpane.getColumnConstraints().addAll(new ColumnConstraints(100,100,Double.MAX_VALUE), new ColumnConstraints(100,100,Double.MAX_VALUE),new ColumnConstraints(100,100,Double.MAX_VALUE),new ColumnConstraints(100,100,Double.MAX_VALUE));gridpane.getRowConstraints().addAll(new RowConstraints(100,100,Double.MAX_VALUE), new RowConstraints(100,100,Double.MAX_VALUE),new RowConstraints(100,100,Double.MAX_VALUE),new RowConstraints(100,100,Double.MAX_VALUE));createGrids(gridpane);root.setCenter(gridpane);DropShadow effect = new DropShadow();effect.setColor(Color.BLUE);addCellButton.setEffect(effect);addCellButton.setTranslateY(10);addCellButton.setTranslateX(10);root.setTop(addCellButton);addCellButton.setOnMouseClicked(new EventHandler<MouseEvent>(){@Overridepublic void handle(MouseEvent arg0) {addGrid(gridpane);}});primaryStage.setScene(scene);primaryStage.setResizable(false);primaryStage.show();}//Add Column and Rowprivate void addGrid(final GridPane gridpane){gridpane.getColumnConstraints().addAll(new ColumnConstraints(100,100,Double.MAX_VALUE));gridpane.getRowConstraints().addAll(new RowConstraints(100,100,Double.MAX_VALUE));createGrids(gridpane);}//Create Gridsprivate void createGrids(final GridPane gridpane){gridpane.getChildren().clear();for(r=0;r<gridpane.getColumnConstraints().size(); r++){for(c=0; c<gridpane.getColumnConstraints().size(); c++){Rectangle rect = new Rectangle(100,100);Circle circ = new Circle(47);circ.centerXProperty().set(50);circ.centerYProperty().set(50);Shape cell = Path.subtract(rect, circ);cell.setFill(Color.BLUE);cell.setStroke(Color.BLUE);cell.setOpacity(.8);DropShadow effect = new DropShadow();effect.setSpread(.2);effect.setRadius(25);effect.setColor(Color.BLUE);cell.setEffect(effect);final Circle diskPreview = new Circle(40);diskPreview.setOpacity(.5);diskPreview.setFill(Color.TRANSPARENT);diskPreview.setOnMouseEntered(new EventHandler<MouseEvent>(){@Overridepublic void handle(MouseEvent arg0) {diskPreview.setFill(Color.WHITE);if(playerColorProperty.get()==Color.RED){diskPreview.setFill(Color.RED);}else{diskPreview.setFill(Color.YELLOW);}}});diskPreview.setOnMouseExited(new EventHandler<MouseEvent>(){@Overridepublic void handle(MouseEvent arg0) {diskPreview.setFill(Color.TRANSPARENT);}});final Circle disk = new Circle(40);disk.fillProperty().bind(playerColorProperty);disk.setOpacity(.5);disk.setTranslateY(-(100*(r+1)));final TranslateTransition translateTranstion = new TranslateTransition(Duration.millis(300), disk);disk.setOnMouseEntered(new EventHandler<MouseEvent>(){@Overridepublic void handle(MouseEvent arg0) {diskPreview.setFill(Color.WHITE);if(playerColorProperty.get()==Color.RED){diskPreview.setFill(Color.RED);}else{diskPreview.setFill(Color.YELLOW);}}});disk.setOnMouseExited(new EventHandler<MouseEvent>(){@Overridepublic void handle(MouseEvent arg0) {diskPreview.setFill(Color.TRANSPARENT);}});disk.setOnMouseClicked(new EventHandler<MouseEvent>(){@Overridepublic void handle(MouseEvent arg0) {if(disk.getTranslateY()!=0){translateTranstion.setToY(0);translateTranstion.play();if(playerColorProperty.get()==Color.RED){playerColorProperty.set(Color.YELLOW);disk.fillProperty().bind(new SimpleObjectProperty<Color>(Color.RED));}else{playerColorProperty.set(Color.RED);disk.fillProperty().bind(new SimpleObjectProperty<Color>(Color.YELLOW));}}}});diskPreview.setOnMouseClicked(new EventHandler<MouseEvent>(){@Overridepublic void handle(MouseEvent arg0) {if(disk.getTranslateY()!=0){translateTranstion.setToY(0);translateTranstion.play();if(playerColorProperty.get()==Color.RED){playerColorProperty.set(Color.YELLOW);disk.fillProperty().bind(new SimpleObjectProperty<Color>(Color.RED));}else{playerColorProperty.set(Color.RED);disk.fillProperty().bind(new SimpleObjectProperty<Color>(Color.YELLOW));}}}});StackPane stack = new StackPane();stack.getChildren().addAll(cell, diskPreview, disk);gridpane.add(stack, c, r); if(r==gridpane.getColumnConstraints().size()-1){stack.setEffect(new Reflection());}}}}
}

祝您编程愉快,别忘了分享!

参考:来自GlyphSoft博客的JCG合作伙伴 Mark Anro Silva的JavaFX Game(四人连接) 。


翻译自: https://www.javacodegeeks.com/2012/09/javafx-game-connect-four.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拼图项目:延期的后果

Mark Reinhold先生于2012年7月宣布 &#xff0c;他们计划从Java 8撤回Jigsaw项目 &#xff0c;因为Jigsaw计划于2013年9月&#xff08;从现在开始一年&#xff09;推迟其发布。 这个日期是众所周知的&#xff0c;因为Oracle已决定实施Java的两年路线图计划&#xff0c;因此2013…

Navicat下Oracle数据泵的使用简单例子

如何使用Navicat等数据库开发工具进行高效开发将是未来工作的重点。Navicat一来美观而来够操作够傻瓜&#xff0c;使用得当其强大功能与PL SQL不相上下。今天学习就是如何在Navicat中使用数据泵进行数据导入导出。 数据泵使用前事项&#xff1a;想使用数据泵必须以sys或system等…

前端自动化之nvm安装

nvm ——node环境版本控制工具。 1.解压安装包 2.打开setting文件&#xff0c;修改文件内容 root: D:\node\nvm path: D:\node\nodejs arch: 64 proxy: root&#xff1a;当前nvm所在的路径 path&#xff1a;将root路径的nvm改为nodejs arch&#xff1a;64位系统 3.配置环境变量…

mysql 主从复制介绍_MySQL 主从复制介绍

一、MySQL 主从复制简介(1) MySQL 主从复制通过逻辑的 binlog 日志复制到要同步的服务器本地&#xff0c;然后由本地的线程读取日志里面的 SQL 语句&#xff0c;重新应用到 MySQL 数据库中(2) 在复制过程中&#xff0c;一台服务器充当主服务器&#xff0c;接收来自用户的内容更…

JavaFX教程–基础

JavaFX似乎正在RIA领域获得发展。 有了正确的工具和开发支持&#xff0c;它肯定会在下一个最佳技术“物”上付出巨大的代价。 我没有在这里写任何JavaFX评论&#xff0c;因为有很多技术评论可能对它进行了广泛的评论&#xff0c;但是&#xff0c;我将编写一个简单的教程&#x…

java swing 案例详解_《Java Swing图形界面开发与案例详解》PDF_IT教程网

资源名称&#xff1a;《Java Swing图形界面开发与案例详解》PDF内容简介&#xff1a;《Java Swing图形界面开发与案例详解》全书共20章&#xff0c;其中第1&#xff5e;2章主要介绍有关Swing的基础知识&#xff0c;包括Swing的基本概述、如何使用IDE开发Swing程序&#xff1b;第…

Python—day3

1、字符串在C里边就是字符数组 Python里边一切事物都是对象&#xff0c;对象则是类创建的 2、set集合 set是一个无序且不能重复的元素集合 #!/usr/bin/env python# encoding: utf-8#set对象不能有重复s1 set()s1.add(alex)print(s1)s1.add(alex)print(s1)s1.add(shidong)print…

iOS - The file “XXX.app” couldn’t be opened because you don’t have permission to view it.

当引入第三方的框架的时候 容易产生以下问题&#xff1a; The file “XXX.app” couldn’t be opened because you don’t have permission to view it. 如图&#xff1a; 造成的原因&#xff1a; info文件中的字段Executable file 与 build settings栏中的Packaging中的Produc…

使JFrame透明

首先创建一个带有滑块的框架&#xff0c;该滑块将用于设置透明度量。 import javax.swing.JFrame; import javax.swing.JSlider;public class TransparentFrame extends JFrame {public TransparentFrame() {setTitle(Transparent Frame);setSize(400,400);setDefaultCloseOper…

第一次作业之成员介绍

Lab205的新鲜血液 很理所当然的&#xff0c;实验室的4枚“小鲜肉”在现代软工的课程上组成了一个team&#xff0c;作为一个负责的team长&#xff0c;我当然要放上组员们的自述啦&#xff01;&#xff08;为什么不是他述&#xff0c;╭(╯^╰)╮&#xff0c;谁让我是个傲娇的组长…

java自定义分页标签_自定义分页标签--仿javaeye分页效果

效果如图&#xff1a;1、JSP规范1.1版本后增加了自定义标签库。实现自定义标签的步骤(1)开发自定义标签处理类。(2)建立*.tld文件。(3)在web.xml中增加自定义标签的定义。(4)在jsp中使用自定义标签。2、自定义标签类(1)继承javax.servlet.jsp.tagext.TagSupport(2)标签类属性&a…

201521123052《Java程序设计》第5周学习总结

1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点。 1.2 可选&#xff1a;使用常规方法总结其他上课内容。 学习了更多markdown的知识 参考资料: 百度脑图 XMind 2. 书面作业 作业参考文件下载 1.代码阅读&#xff1a;Child压缩包内源代码package parent;publi…

telnet测试端口是否正常打开

点击计算机的开始菜单--》运行 &#xff0c;输入CMD命令&#xff0c;然后确定。打开cmd命令行。 输入telnet测试端口命令&#xff1a; telnet IP 端口 或者 telnet 域名 端口 回车 如果端口关闭或者无法连接&#xff0c;则显示不能打开到主机的链接&#xff0c;链接失败 端口…

Java instead of 用法_我又不是你的谁--java instanceof操作符用法揭秘

背景故事《曾经最美》是朱铭捷演唱的一首歌曲&#xff0c;由陈佳明填词&#xff0c;叶良俊谱曲&#xff0c;是电视剧《水晶之恋》的主题曲。歌曲时长4分28秒。 歌曲歌词&#xff1a;看不穿你的眼睛藏有多少悲和喜像冰雪细腻又如此透明仿佛片刻就要老去整个城市的孤寂不止一个你…

3.26

http://codeforces.com/gym/101196/attachments A题 B题 题意&#xff1a;一群人玩桌上足球(>4人)&#xff0c;分成黑白两队&#xff0c;每队有进攻和防守两名玩家&#xff0c;如果有一方失败则失败方的防守坐到等候席的结尾、进攻被流放到防守区再上来一个人作为进攻方。而…

CentOS6.5安装MySQL5.7详细教程

CentOS6.5安装MySQL5.7详细教程 注&#xff1a;文中所写的安装过程均在CentOS6.5 x86下通过测试 主要参考博文&#xff1a; https://segmentfault.com/a/1190000003049498 http://www.th7.cn/db/mysql/201601/175073.shtml 1.检测系统是否已经安装过mysql或其依赖&#xff0c;若…

番石榴秒表

番石榴的秒表是番石榴第10版的另一个新番石榴类&#xff08;作为Optional &#xff0c;这是另一篇近期文章的主题&#xff09;。 顾名思义&#xff0c;这个简单的类提供了一种方便地测量两个代码点之间经过的时间的方法。 与使用System.currentTimeMillis&#xff08;&#xff…

盒模型的属性丶display显示丶浮动

一丶盒模型的属性(重要) 1.padding padding是标准文档流,父子之间调整位置 <!DOCTYPE html><html><head><meta charset"UTF-8"><title>padding</title><style>*{padding: 0;margin: 0;}.box{width: 200px;height: 200px;b…

CSS 小结笔记之滑动门技术

所谓的滑动门技术&#xff0c;就是指盒子背景能够自动拉伸以适应不同长度的文本。即当文字增多时&#xff0c;背景看起来也会变长。 大多数应用于导航栏之中&#xff0c;如微信导航栏: 具体实现方法如下&#xff1a; 1、首先每一块文本内容是由a标签与span标签组成 <a hr…

使用API​​身份验证的Spring Security

背景 尽管有许多博客文章详细介绍了如何使用Spring Security&#xff0c;但是当问题域位于标准LDAP或数据库身份验证之外时&#xff0c;我仍然经常发现配置挑战。 在本文中&#xff0c;我将介绍一些针对Spring Security的简单自定义&#xff0c;使其能够与基于REST的API调用一起…