突然发现,之前还有个JavaFX游戏开发 第一课。不过,这两个教程并不冲突。目前这个系列是做一个完整的打砖块游戏。
第一课主要用到的知识有,JavaFX的动态绑定,Rectangle的使用,简单的MouseMove事件,BoxBlur特效。
那么,我们首先创建一个名叫BrickBlock的JavaFX Project。本人是使用的e(fx)clipse进行开发的。
e(fx)clipse的官方网站为:http://www.efxclipse.org/,下载整合插件的eclipse即可。
首先创建一个游戏对象的基类BaseObject,继承于Parent。
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Parent;
/**
* @author wing
* @date 2012/7/26
*/
public abstract class BaseObject extends Parent{
protected DoubleProperty widthProperty = new SimpleDoubleProperty(0);
protected DoubleProperty heightProperty = new SimpleDoubleProperty(0);
protected DoubleProperty xProperty = new SimpleDoubleProperty(0);
protected DoubleProperty yProperty = new SimpleDoubleProperty(0);
public DoubleProperty widthProperty() {
return widthProperty;
}
public double getWidth(){
return widthProperty.get();
}
public void setWidth(double width){
this.widthProperty.set(width);
}
public DoubleProperty heightProperty() {
return heightProperty;
}
public double getHeight(){
return heightProperty.get();
}
public void setHeight(double height){
this.heightProperty.set(height);
}
public DoubleProperty xProperty() {
return xProperty;
}
public double getX(){
return xProperty.get();
}
public void setX(double x){
this.xProperty.set(x);
}
public DoubleProperty yProperty() {
return yProperty;
}
public double getY(){
return yProperty.get();
}
public void setY(double y){
this.yProperty.set(y);
}
public void moveX(double x){
this.xProperty.set(getX() + x);
}
public void moveY(double y){
this.yProperty.set(getY() + y);
}
public boolean isCollisionWith(BaseObject baseObject){
if(getX() + getWidth() > baseObject.getX() && getX() < baseObject.getX() + baseObject.getWidth() && getY() + getHeight() > baseObject.getY() && getY() < baseObject.getY() + baseObject.getHeight()){
return true;
}
return false;
}
}
可以看到,基类BaseObject中,包含有坐标和宽高的属性,并且还有一个检测碰撞的isCollisionWith方法。
大家可以看到,基类BaseObject中没有使用常规的数据类型,而是使用的DoubleProperty。而DoubleProperty这样
的类型,也正是JavaFX中的动态绑定的机制,set get方法只是改变DoubleProperty的值。
为了方便,isCollisionWith只是简单的矩形碰撞。
下面我们创建一个打砖块中底部拦截的游戏对象类MainBrick。
import javafx.scene.effect.BoxBlur;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import org.wing.game.BrickBlock;
/**
* @author wing
* @date 2012/7/25
*/
public class MainBrick extends BaseObject{
private Rectangle mRectangle;
private BoxBlur mBlur;
public MainBrick(){
mRectangle = new Rectangle();
mRectangle.widthProperty().bindBidirectional(widthProperty());
mRectangle.heightProperty().bindBidirectional(heightProperty());
mRectangle.xProperty().bindBidirectional(xProperty());
mRectangle.yProperty().bindBidirectional(yProperty());
mRectangle.setArcWidth(20);
mRectangle.setArcHeight(20);
mRectangle.setFill(Color.YELLOW);
mBlur = new BoxBlur();
mBlur.setWidth(5);
mBlur.setHeight(5);
mRectangle.setEffect(mBlur);
setWidth(150);
setHeight(25);
getChildren().add(mRectangle);
}
public void onMouseMove(MouseEvent event){
if (event.getX() >= getWidth()/2 && event.getX() <= BrickBlock.WIDTH - getWidth()/2) {
setX(event.getX() - getWidth()/2);
}
}
}
MainBrick中的代码也很简单。
1.创建了一个Rectangle,这里使用了bindBidirectional方法,这个方法在JavaFX中的意义是双向绑定,只能对Property使用。
我们将Rectangle的宽度,高度,坐标与基类的属性进行了双向绑定,也就是说整个MainBrick已经是一个Rectangle了。
2.设置Rectangle的圆角,让它成为一个圆角矩形。
3.创建了一个BoxBlur效果,通过setEffect给Rectangle设置BoxBlur效果。
4.设置MainBrick的宽度和高度,由于进行了双向绑定,在这里setWidth,setHeight属性将会同步更新到Rectangle的width和height属性。
5.这里还有一个onMouseMove的事件,主要是让Rectangle跟着鼠标动,通过判断使矩形不会超出左右边界,并且将Rectangle中心与鼠标对齐。当然,这个事件现在是不能执行的。
接下来,我们创建一个游戏场景类GameScene,继承Parent。
import org.wing.game.object.MainBrick;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Parent;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.util.Duration;
public class GameScene extends Parent {
private int width, height;
private Rectangle background;
private MainBrick mainBrick = new MainBrick();
public GameScene(int width, int height){
this.width = width;
this.height = height;
initGameObjects();
}
private void initGameObjects(){
background = new Rectangle(0, 0, this.width, this.height);
background.setOnMouseMoved(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
mainBrick.onMouseMove(event);
}
});
background.setFill(Color.BLACK);
mainBrick.setX(0);
mainBrick.setY(height - mainBrick.getHeight());
getChildren().add(background);
getChildren().add(mainBrick);
}
}
在游戏场景类GameScene中,我们通过构造函数,传入场景的宽度和高度。
然后创建了一个背景Rectangle。
设置Rectangle的onMouseMove事件,在其中执行MainBrick中我们刚才写的onMouseMove函数。通过setFill将Rectangle的填充色设为黑色。
接下来,将MainBrick的作为设置为屏幕最下方。
最后,通过getChildern().add()将背景Rectangle和MainBrick添加进GameScene中。
最后就是我们的JavaFX Main Class了。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
* @author wing
* @date 2012/7/26
*/
public class BrickBlock extends Application {
public static final int WIDTH = 800;
public static final int HEIGHT = 600;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
GameScene root = new GameScene(WIDTH, HEIGHT);
primaryStage.setTitle("BrickBlock");
primaryStage.setScene(new Scene(root, WIDTH, HEIGHT));
primaryStage.show();
}
}
大家可以看到,由于将游戏对象和游戏场景都分离出来,主类已经变得很简洁了。
那么我们运行运行看看效果。
图中的黄色的砖块会跟着鼠标移动,并且不会超过左右的边界。(截图看不到鼠标...)
看似效果很简单,不过我们整体的结构已经差不多了,这将有利于我们后续的开发。
在第二课中,我们将会增加一个小球在这个空间中弹来弹去,并且可以与图中的黄色砖块进行碰撞。
转载请注明出处:http://blog.csdn.net/ml3947/
分享到:
相关推荐
该项目是一款采用JavaFX技术实现的打砖块游戏,源码包含45个文件,其中33个为Java源代码文件,5个为PNG图片资源文件,并附带必要的Git忽略和项目配置文件。
【打砖块游戏源码】是一款基于Java编程语言开发的经典街机游戏,它包含了丰富的游戏功能,如关卡设计、视觉图像以及各种特殊效果。在这款游戏中,玩家通过控制一个可移动的挡板来反弹小球,击碎屏幕上方排列的砖块。...
在本项目中,"Java打砖块小游戏"是一款利用Java编程语言开发的简单娱乐软件,旨在提供一个轻量级的休闲体验。打砖块游戏是一种经典的街机游戏,玩家通过控制一个可移动的挡板来反弹小球,目标是打破屏幕上方的砖块。...
标题中提到的“基于Java打砖块游戏的设计与实现”指出了本文是探讨如何利用Java编程语言开发一个打砖块游戏,强调了游戏开发的具体实现细节。Java是一种广泛使用的编程语言,适合于各种应用程序的开发,包括游戏。打...
打砖块游戏,也被称为Breakout或Arkanoid,是一种经典的街机游戏,玩家通过移动一个挡板来反射弹球,目标是打破屏幕上排列的砖块。 源码分析: 1. **基础架构**:Java游戏通常基于Java Swing或JavaFX库构建图形用户...
首先,"打砖块"游戏的基础架构基于Java Swing或JavaFX库来构建用户界面,这两个库为开发桌面应用提供了丰富的组件和功能。Swing是Java的标准GUI工具包,而JavaFX则提供更现代、更高级的图形效果。开发者可以根据自己...
【基于JAVA的打砖块游戏】是一款非常适合初学者学习编程的项目,它涵盖了Java语言的基础知识和游戏开发的一些核心概念。下面将详细讲解这个项目中涉及的重要知识点。 首先,Java是一种广泛使用的面向对象编程语言,...
通过对"打砖块游戏"的源代码进行深入研究,我们可以了解到游戏开发的基本流程,提高编程技能,特别是对于游戏开发感兴趣的开发者来说,这是一个极好的学习资源。通过实际动手修改和优化代码,可以进一步加深对游戏...
【打砖块游戏(Java)】是一款基于Java编程语言开发的简单休闲游戏,它适合初学者作为学习Java的实践项目。在游戏中,玩家通过控制一块可移动的挡板来反弹小球,使小球击碎屏幕上方排列的砖块。当所有砖块被消除后,...
【打砖块小游戏】是一个基于JAVA编程语言开发的微型游戏,它模仿了微信上流行的“疯狂打砖块”玩法。这款游戏虽然在代码完善性上还有待提升,但已经实现了基本的游戏功能,包括但不限于游戏界面、玩家操作、砖块碰撞...
《打砖块小游戏带音效》是一款基于Java编程语言开发的趣味休闲游戏,它结合了经典的游戏机制与音频效果,为玩家提供了丰富的娱乐体验。在本文中,我们将深入探讨这款小游戏的设计原理、Java编程基础、音效处理以及...
打砖块是一款经典且深受玩家喜爱的小游戏,它的设计简单却富有挑战性。在这个Java实现的版本中,我们可以通过研究源码深入理解游戏的逻辑和编程技巧。下面将详细探讨这款"JBricks"游戏的实现原理和关键知识点。 ...
【打砖块JAVA游戏代码】是一款基于Java编程语言开发的经典休闲游戏,它的核心玩法是通过一个可移动的挡板来反弹小球,击碎屏幕上排列的砖块。在这个项目中,我们将深入探讨Java编程在游戏开发中的应用以及游戏设计的...
在这个战旗类游戏开发示例中,我们将会深入探讨如何利用JavaFX来设计和实现一款类似棋盘游戏的战旗游戏。 首先,我们需要了解JavaFX的基本结构。一个JavaFX应用通常由多个场景(Scene)和视图(Node)组成。场景是...
在Java编程领域,开发一款打砖块游戏是一个经典的练习项目,它涉及到许多基础和进阶的编程概念。在这个场景中,我们关注的核心是"碰撞检测",这是游戏开发中的一个重要环节,尤其是对于像打砖块这样需要实时反应的...
在本项目中,"Java打砖块儿游戏代码" 是一个专门为初级Java程序员设计的实践项目,它将帮助初学者理解和应用基本的编程概念。这个项目包含了一个完整的打砖块游戏的实现,游戏元素如背景、弹球、挡板以及各种砖块都...
《基于JAVA的打砖块游戏开发》这篇论文探讨的是如何使用JAVA编程语言来设计和实现一款经典的打砖块游戏。打砖块游戏以其简单的规则和趣味性深受玩家喜爱,它通常包含一个可左右移动的挡板和一个弹球,玩家通过控制...
【基于Java打砖块小游戏】是一款适合初学者的编程实践项目,它利用Java语言实现了一个基本的游戏框架,展示了Java在游戏开发中的应用。这个小游戏的界面简洁,旨在帮助初学者理解面向对象编程、事件处理、图形用户...
Java课程设计中的打砖块游戏是一款利用Java编程语言开发的休闲娱乐游戏,旨在提供一个简单易上手且具有趣味性的用户体验。游戏的核心是基于Java的图形用户界面(GUI)技术,这使得游戏能够具备丰富的视觉效果和交互...