文档章节

JavaFx版本植物大战僵尸

OSC首席小可爱
 OSC首席小可爱
发布于 2015/11/09 09:58
字数 1088
阅读 95
收藏 1

     闲来没事,把以前做的Swing植物大战僵尸稍微改版了一下,用的javafx2.x,效果没有变化,边的只是代码。。源码地址:http://pan.baidu.com/share/link?shareid=249059&uk=522491644  先上两张效果图吧:

1

2

3

项目结构:

image

role包为角色,把各个部分都作为一个角色来处理,详细的下面再说;

util包为工具类,以及事件处理,用户信息等。

window为窗口,系统面板。

1.系统整体结构:

jg

  window包中MainFrame为Main类,

public class MainFrame extends Application {

private TitlePanel titlePanel;
private WelcomePanel welcomePanel ;
private HelpPanel helpPanel;
private GamePanel gamePanel;
/**
* 玩家对象
*/
private UserBean userBean;


private StackPane stack = new StackPane();
private Stage stage;


public MainFrame() {
GameUtil.initImage();
}

@Override
public void start(Stage stage) {
this.stage =stage;
Scene scene = new Scene(stack, 900, 600);
scene.getStylesheets().add("file:resources/DarkTheme.css");
stage.setResizable(false);
scene.setFill(Color.WHITE);
stage.setTitle("植物大战僵尸");
stage.getIcons().add(GameUtil.iconImage);

titlePanel = new TitlePanel(this);
welcomePanel = new WelcomePanel(this);
helpPanel = new HelpPanel(this);
gamePanel=new GamePanel(this);
stack.getChildren().addAll(titlePanel, welcomePanel,helpPanel,gamePanel);
stack.setAlignment(Pos.CENTER_RIGHT);

stage.setScene(scene);
stage.show();

}


public void switchPanel(AnchorPane fromPanel,AnchorPane toPanel) {
// 切换面板的方法
fromPanel.setVisible(false);
toPanel.setVisible(true);
}

public static void main(String[] args) {
launch(args);
}

}

Root为StackPane布局,每个面板为都为AnchorPane布局,面板叠堆到StackPane中,并提供switchPanel方法进行面板切换。运行程序后首先进入欢迎界面,点击鼠标进入选项界面。

TitlePanel中由ImageView添加各个图片,并为TitlePanel添加鼠标事件,监听OnMousePressed以及OnMouseMoved,OnMousePressed处理鼠标点击事件,OnMouseMoved主要处理鼠标移动到某个选项上变成手型。

获取鼠标点击的坐标,判断进入的图片的范围,产生响应的事件,进行面板切换和用户存档的读取。

详细参考代码。帮助面板和排行榜面板与此类似。排行榜使用的是table,用户信息存放在文件中,文件操作在fileutil以及baseDao中。

点击开始冒险进入游戏主面板。

2、游戏主面板

public GamePanel(MainFrame mainFrame) {
        this.frame = mainFrame;
        setVisible(false);
        canvas = new Canvas(900, 600); // 构建画布
        g = canvas.getGraphicsContext2D(); // 获取画笔
        startGame();
        getChildren().addAll(canvas);
        GameMousePressed gameMousePressed = new GameMousePressed(this);
        GameMouseMoved gameMouseMoved = new GameMouseMoved(this);
        this.setOnMousePressed(gameMousePressed);
        this.setOnMouseMoved(gameMouseMoved);
    }
在GamePanel构造器中首先构建了画布和画笔,游戏元素通过画笔绘制,而不是之前的ImageView添加图片。startGame开始游戏方法,同样监听鼠标点击和移动事件。
public void startGame() {
        init();
        gameStatus = BaseRole.GAME_START;
        // 太阳种子落下
        GameUtil.generateSunSeed(this);
        // 产生僵尸
        GameUtil.generateZombie(this);
        initTimeLine();
    }
startGame方法中线初始化游戏,更新游戏状态为start,通过线程产生太阳花和僵尸,代码在gameutil中。最后使用timeline重复游戏绘制
private void initTimeLine() {
        Timeline timeline = new Timeline();
        timeline.setCycleCount(Timeline.INDEFINITE);

        KeyFrame keyFrame = new KeyFrame(Duration.millis(100),
                new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent arg0) {
                                                                                    //。。。省略部分代码
                        paint();
                    }
                });
        
        timeline.getKeyFrames().add(keyFrame);
        timeline.play();
    }

通过timeline调用paint方法完成游戏元素的绘制。

3、角色配置

结构图如下:

role

baserole中添加了很多状态常量,用来标识系统和角色状态。

/**
     * 初始化角色属性
     */
    public abstract void initRole();
    
    /**
     * 绘制角色
     * @param g
     */
    public abstract void paintRole(GraphicsContext g);
    
    /**
     * 角色执行的动作
     */
    public abstract void action();

三个抽象方法,子类实现抽象方法。initRole方法初始化角色信息,包括角色长度,宽度;paintRole方法中进行角色绘制,action中操作角色运动。

4、鼠标事件处理

gamepanel中监听了鼠标的移动和点击事件,移动事件主要控制产生植物后随鼠标移动到草地,点击事件控制植物和铲子的选择和安放到草地。

5、gameutil游戏工具类

此工具类预处理游戏中所有元素的图片,图片路径存放在xml配置文件中,通过gameImage中XStream加载图片资源。gameutil中还封装了其他工具方法,包括计算草地上方块坐标,判断鼠标是否进入某个角色,计算两点之间所有坐标点,检测两个角色是否碰撞以及产生太阳种子和僵尸的方法。

 

6、问题:

  • 植物阴影尚未实现
  • 开始游戏时地图移动尚未实现
  • 游戏进度条控制游戏结束尚未实现
  • 植物卡片冷却效果未实现

植物大战僵尸初步只完成这样了,最近工作也很忙,没有时间,对javafx也还不是很熟悉,待日后在进一步优化和完善吧。

© 著作权归作者所有

OSC首席小可爱

OSC首席小可爱

粉丝 3
博文 51
码字总数 66269
作品 0
无锡
后端工程师
私信 提问
JavaFX 2.2 正式发布,下一版本为 8.0

甲骨文今天正式发布了JavaFX 2.2。 该版本中包含了针对Windows、Linux和Mac OS X平台的SDK,不过JavaFX运行时仍然只支持Windows和Linux平台。 该版本的主要新特性包括: 支持H.264和AAC编码的...

Jeky
2012/08/16
2.7K
20
認識JavaFX

作者:蔡學鏞 注意:本文章內容是依據alpha版技術做描述,讀者閱讀時可能已經和實際現況有所差異。 雖 然Ajax方興未艾,但RIA(Rich Internet/Interface Application)也已經揭開序幕,同樣是...

红薯
2009/02/12
906
2
集成在 NetBeans 6.5 -- JavaFX SDK 1.1 发布

JavaFX SDK 1.1 一个最大的改进就是支持移动设备,该版本支持 JavaFX Mobile 同时附带了一个移动设备的模拟器。JavaFX Mobile 构建在 JavaME 平台上,你可以利用已有的 JavaME 知识和资源来快...

红薯
2009/02/13
413
0
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏

JavaFX主要致力于富客户端开发,以弥补swing的缺陷,主要提供图形库与media库,支持audio,video,graphics,animation,3D等,同时采用现代化的css方式支持界面设计。同时又采用XUI方式以XML方式...

OSC闲人
2014/10/19
8.8K
28
JavaFX 2.0 Beta 发布

JavaFX 2.0 发布 Beta 版本,包括 SDK 和运行环境。 该版本提供了 JavaFX 的 Java API,使得所有 Java 开发者可以使用熟悉的 Java 技术来创建 JavaFX 应用。该版本主要改进包括: 高性能图形...

红薯
2011/05/27
2.3K
12

没有更多内容

加载失败,请刷新页面

加载更多

关于早起

早起是非常好的事情,但是像如果前一天睡得晚,或者第二天早上是非常冷的时候,那就不是很美好了。 但是本身早起是一件非常棒的事情,我记得我每次早起 如果不觉得困的话,世界是那么安静,脑...

T型人才追梦者
13分钟前
3
0
Java输入输出

JDK中的InputStream/OutputStream构成了IO输入输出继承层次的基础。它们都是面向字节序列的,每次可以从序列中读入或者写出一个字节或者指定大小的字节数组。但是面向字节流的输入输出不便于...

ytuan996
30分钟前
3
0
Xamarin图表开发基础教程(9)OxyPlot框架

Xamarin图表开发基础教程(9)OxyPlot框架 OxyPlot组件构成 OxyPlot组件主要由两个类构成,分别为PlotView和PlotModel。这两个类我们在上文中也使用到了。本节将讲解介绍这两个类。 1.图表视...

大学霸
35分钟前
3
0
协议栈

一、关键技术点分析 不同服务在性能上适用不同协议进行传输,如对接异构第三方服务时,通常选择HTTP/Restful等公有协议;而对于内部不同模块之间的服务调用,一般选择性能较高的二进制私有协...

edwardGe
43分钟前
7
0
新建时隐藏按钮,显示明细时显示

在InitControl()中 if (saTableKeys != null) { rpgDesign.Visible = true; rpgPrint.Visible = true; }......

_Somuns
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部