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,一经查实,立即删除!

相关文章

vs使用了未初始化的局部变量怎么解决_C程序为什么要初始化?

作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。 前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题。 什么是初始化 初始化…

maven 配置 pom.xml 打包生成:单jar包/jar包+lib目录

http://www.jianshu.com/p/9146cec6cc60转载于:https://www.cnblogs.com/Baronboy/p/7510942.html

zabbix安装MySQL失败_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...

本文主要向大家介绍了MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。如题所示&#xff0c;在CentOS6.x的系统中安装zabbix3.x&#xff…

拼图项目:延期的后果

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;接收来自用户的内容更…

【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s=a+b+c+d;...

数组没有length()这个方法&#xff0c;有length的属性。String有有length()这个方法。 int a[]; a.length;//返回a的长度 String s; s.length();//返回s的长度 java中数组没有length()方法&#xff0c;求数组的长度可以使用数组的length属性。 int[] arr{1,2,3,4,5};int length…

Spring范围代理

考虑以这种方式定义的两个Spring bean&#xff1a; Component class SingletonScopedBean{Autowired private PrototypeScopedBean prototypeScopedBean;public String getState(){return this.prototypeScopedBean.getState();} }Component Scope(value"prototype")…

递归和分治的概念性的理解

递归的概念表述&#xff1a; 直接或间接调用自身的算法称为递归算法。 理解&#xff1a;递归算法的可以理解为多个算法的嵌套调用&#xff0c;只是调用算法是同一个&#xff0c;同时需要一个工作栈来作为各层次的数据存储区&#xff0c;包括所有实参指针&#xff0c;局部变量&a…

ibatis mysql sqlmapconfig_iBATIS sqlMapConfig配置详解

1 <?xml version"1.0" encoding"UTF-8"?>2 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">5 6 11 13 enhancementEnabled"true"14 lazyLoadingEnabled"true"15 errorTracingEnabled"true"16 m…

什么情况使用 weak 关键字,相比 assign 有什么不同?

什么情况使用 weak 关键字&#xff1f; 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak&#xff1b;当然…

使用Spring Redis发布/订阅

继续发现功能强大的Redis功能集&#xff0c;值得一提的是对发布/订阅消息的开箱即用支持。 发布/订阅消息传递是许多软件体系结构的重要组成部分。 某些软件系统要求消息传递解决方案提供高性能&#xff0c;可伸缩性&#xff0c;队列持久性和持久性&#xff0c;故障转移支持&am…

python在律师上作中的实例_python-基础面试题

深拷贝1.对象A拷贝&#xff0c;生成对象B&#xff0c;且我们修改对象B(对象A)中的数据或方法&#xff0c;对象A(对象B)不会受影响&#xff0c;这就是深拷贝2.对于可变与不可变类型对于不可变类型&#xff0c;深拷贝会和浅拷贝一样&#xff0c;拷贝的是引用&#xff0c;不会创建…

2017 校招华为上机题

1. 给定一个字符串&#xff0c;把字符串内的字母转换成该字母的下一个字母&#xff0c; a 换成b&#xff0c;z 换成a&#xff0c;Z 换成A&#xff0c;如aBf 转换成bCg&#xff0c;字符串内的其他字符不改变&#xff0c;给定函数&#xff0c;编写函数void Stringchang&#xff0…

JSON –拯救杰克逊

有时您必须使用JavaScript从服务器中获取一些数据&#xff0c; JSON是完成此任务的不错选择。 让我们玩一下JPA揭秘&#xff08;第1集&#xff09;-OneToMany和ManyToOne映射中的“雇主-雇员-福利”示例。 我们将在基于Spring Framework的Web应用程序中使用它。 我们的第一个…

maven 使用记录之修改 maven默认jdk版本

maven package执行的时候会遇到jdk版本不对的问题 &#xff1a;原因是 maven所指定的jdk版本与项目使用的jdk版本不一致1.项目属性的 java compiler可以设置2.直接修改 maven 的 settings.xml 一劳永逸settiings.xml <profiles>标签内加入<profile> <id>j…

java默认值_Java中八种基本数据类型的默认值

通过一段代码来测试一下 8种基本数据类型的默认值package dierge;public class Ceshi {int a;double b;boolean c;char d;float f;byte e;long h;short j;public static void main(String args[]){Ceshi anew Ceshi();System.out.println("整型的默认值是&#xff1a;&quo…

HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化

给定n个数字&#xff0c;求其中m段的最大值&#xff08;段与段之间不用连续&#xff0c;但是一段中要连续&#xff09; 例如&#xff1a;2 5 1 -2 2 3 -1五个数字中选2个&#xff0c;选择1和2 3这两段。 dp[i][j]从前j个数字中选择i段&#xff0c;然后根据第j个数字是否独立成一…

JavaFX教程–基础

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