package org.jfx.sample.slg;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.jfx.sample.slg.BasePlayer.Group;
import org.wing.jfx.game.core.astar.WPath;
import org.wing.jfx.game.core.astar.WNode;
import org.wing.jfx.game.core.geometry.Point2D;
import javafx.application.Platform;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.input.MouseButton;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
public class MainCanvas extends Canvas {
// 游戏状态
enum Status {
NONE, SHOW_ENEMY_PROPERTY, SHOW_MENU, PREPARE_MOVE, MOVE, PREPARE_ATTACK, ATTACK, WAIT, GAME_WIN, GAME_OVER
}
enum GameTurn {
PLAYER, ENEMY
}
// 当前游戏状态
private Status nowStatus = Status.NONE;
// 当前游戏回合
private GameTurn nowTurn = GameTurn.PLAYER;
private GraphicsContext gContext;
private Image map;
// 游戏地图
private GameMap gameMap;
// 操作菜单
private ActionMenu actionMenu;
// 属性菜单
private PropertyMenu propertyMenu;
// 单元格宽高
private int tileWidth = 32;
private int tileHeight = 32;
private boolean isRunning = true;
private long sleep = 100;
// 移动的Timer
private WTimer moveTimer;
// Action Timer
private WTimer actioTimer;
// 当前操作的角色
private BasePlayer nowControllPlayer;
// 当前被攻击角色
private BasePlayer nowBeAttackedPlayer;
private int nowActionIndex = 0;
// 移动到X,和Y
private int moveToX, moveToY;
// 是否可以移动
private boolean isCanMove = false;
// 主线程
private Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
Platform.runLater(new Runnable() {
@Override
public void run() {
draw();
update();
}
});
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
// 我方角色
private List<BasePlayer> players = new ArrayList<>();
// 敌方角色
private List<BasePlayer> enemys = new ArrayList<BasePlayer>();
private WPath path;
public MainCanvas(double width, double height) {
super(width, height);
map = new Image(getClass().getResourceAsStream("map0.png"));
gContext = getGraphicsContext2D();
// 初始化游戏地图
gameMap = new GameMap(tileWidth, tileHeight, map);
thread.start();
moveTimer = WTimer.createWTimer(50, new WTimer.OnTimerListener() {
@Override
public void onTimerRunning(WTimer mTimer) {
if (nowStatus == Status.MOVE) {
int nowPlayerX = (int) (nowControllPlayer.getX() / tileWidth);
int nowPlayerY = (int) (nowControllPlayer.getY() / tileHeight);
if (nowPlayerX != moveToX) {
nowControllPlayer.moveX(nowPlayerX > moveToX ? -tileWidth : tileWidth);
} else {
if (nowPlayerY != moveToY) {
nowControllPlayer.moveY(nowPlayerY > moveToY ? -tileHeight : tileHeight);
} else {
nowControllPlayer.setWaitToAttack(false);
nowControllPlayer.setWaitToMove(false);
nowControllPlayer.setCanMove(false);
nowControllPlayer = null;
nowStatus = Status.NONE;
moveTimer.stop();
}
}
}
}
});
actioTimer = WTimer.createWTimer(50, new WTimer.OnTimerListener() {
@Override
public void onTimerRunning(WTimer mTimer) {
//敌方回合
if (nowTurn == GameTurn.ENEMY) {
if (nowStatus == Status.NONE) {
//当前敌方角色索引
if (nowActionIndex < enemys.size()) {
//选择操作的敌方角色
nowControllPlayer = enemys.get(nowActionIndex);
nowControllPlayer.setChoose(true);
// 没有就近角色
if (!nowControllPlayer.isHasNearBP(players)) {
//如果可以移动
if (nowControllPlayer.isCanMove()) {
//获取最近的一个角色(这里可以更改规则,比如HP最低的等等)
BasePlayer player = nowControllPlayer.getNearestBP(players);
path.clear();
// path.map_sprite = createMapSprite();
//搜索移动范围
LinkedList<WNode> nodeList = path.SearchMoveScan(
new Point2D(nowControllPlayer.getX() / tileWidth, nowControllPlayer.getY()
/ tileHeight), nowControllPlayer.getMove());
// 删选当前可移动范围内 如果有角色,则把该移动点删除
List<WNode> deleteList = new ArrayList<>();
for (WNode node : nodeList) {
if (isPointHasPlayer((int) node.getPoint().getX(), (int) node.getPoint().getY())) {
deleteList.add(node);
}
}
for (WNode node : deleteList) {
nodeList.remove(node);
}
nowControllPlayer.nodeList = nodeList;
//获取可移动范围里距离 最近角色的最近的点
Point2D point = player.getNearestNode(nodeList);
moveToX = (int) (point.getX());
moveToY = (int) (point.getY());
//状态更改为移动
nowStatus = Status.MOVE;
moveTimer.start();
} else {
//状态更改为准备攻击
nowStatus = Status.PREPARE_ATTACK;
}
} else {
//状态更改为准备攻击
nowStatus = Status.PREPARE_ATTACK;
}
} else {
//当操作角色的索引大于 敌方角色集合的大小时,回合结束 并重置所有敌方角色状态
nowStatus = Status.NONE;
nowTurn = GameTurn.PLAYER;
nowActionIndex = 0;
for (BasePlayer enemy : enemys) {
enemy.reset();
}
}
} else if (nowStatus == Status.PREPARE_ATTACK) {
// 敌人周边四个方格是否有角色
if (nowControllPlayer.isHasNearBP(players)) {
//敌人获取最近的我方角色,并攻击
BasePlayer bp = nowControllPlayer.getNearestBP(players);
nowControllPlayer.attack(bp);
nowBeAttackedPlayer = bp;
bp.setFlash(true);
nowStatus = Status.ATTACK;
} else {
//没有攻击对象,则操作下一个敌方角色
nowControllPlayer.setCanAction(false);
nowActionIndex++;
nowControllPlayer.setChoose(false);
nowStatus = Status.NONE;
}
} else if (nowStatus == Status.ATTACK) {
//角色死亡
if (!nowBeAttackedPlayer.isFlash()) {
if (nowBeAttackedPlayer.getHp() <= 0) {
players.remove(nowBeAttackedPlayer);
}
nowControllPlayer.setCanAction(false);
nowActionIndex++;
nowControllPlayer.setChoose(false);
nowStatus = Status.NONE;
//当没有我方角色时,游戏结束
if (players.size() == 0) {
nowStatus = Status.GAME_OVER;
nowTurn = GameTurn.PLAYER;
}
}
}
} else if (nowTurn == GameTurn.PLAYER) {
if (nowStatus == Status.ATTACK) {
if (!nowBeAttackedPlayer.isFlash()) {
//敌人死亡
if (nowBeAttackedPlayer.getHp() <= 0) {
nowControllPlayer.getExp(nowBeAttackedPlayer.getExp());
enemys.remove(nowBeAttackedPlayer);
}
waitToNextPlayer();
//当没有敌方角色时,游戏胜利
if (enemys.size() == 0) {
nowStatus = Status.GAME_WIN;
}
}
}
}
}
});
actioTimer.start();
// 初始化操作菜单
actionMenu = new ActionMenu(new String[] { "移动", "攻击", "待机" }, 50, 100);
actionMenu.setOnMenuItemClickListener(new ActionMenu.OnMenuItemClickListener() {
@Override
public void onMenuItemClick(int index) {
if (nowTurn == GameTurn.PLAYER) {
switch (index) {
case 0: // 移动
if (nowControllPlayer.isCanMove()) {
nowStatus = Status.PREPARE_MOVE;
// 搜索移动范围
nowControllPlayer.setWaitToMove(true);
path.clear();
// path.map_sprite = createMapSprite();
LinkedList<WNode> nodeList = path.SearchMoveScan(new Point2D(nowControllPlayer.getX()
/ tileWidth, nowControllPlayer.getY() / tileHeight), nowControllPlayer.getMove());
// 删选当前可移动范围内 如果有角色,则把该移�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
JFXSLGSample.zip (53个子文件)
JFXSLGSample
bin
org
wing
jfx
game
core
astar
WNode.class 3KB
WLevelList.class 1KB
WPath.class 7KB
geometry
Point2D.class 2KB
jfx
sample
slg
MainCanvas$Status.class 2KB
MainCanvas$3.class 5KB
MainCanvas$4.class 3KB
WTimer$OnTimerListener.class 266B
player2.png 5KB
MainCanvas$1$1.class 799B
WTimer.class 1KB
MainCanvas$GameTurn.class 1KB
BaseObject.class 2KB
TextObject.class 3KB
enemy1.png 5KB
application.css 0B
MainCanvas.class 14KB
Main.class 2KB
map0.png 32KB
BasePlayer.class 9KB
GameMap.class 2KB
BasePlayer$Group.class 1KB
player1.png 5KB
ActionMenu.class 3KB
PropertyMenu.class 3KB
MainCanvas$1.class 1KB
MainCanvas$2.class 2KB
ActionMenu$OnMenuItemClickListener.class 269B
player3.png 5KB
build.fxbuild 311B
.settings
org.eclipse.core.resources.prefs 92B
org.eclipse.jdt.core.prefs 598B
src
org
wing
jfx
game
core
astar
WNode.java 2KB
WLevelList.java 637B
WPath.java 6KB
geometry
Point2D.java 947B
jfx
sample
slg
ActionMenu.java 2KB
TextObject.java 2KB
player2.png 5KB
MainCanvas.java 16KB
GameMap.java 2KB
enemy1.png 5KB
application.css 0B
BasePlayer.java 8KB
BaseObject.java 1KB
map0.png 32KB
player1.png 5KB
PropertyMenu.java 2KB
Main.java 796B
WTimer.java 1KB
player3.png 5KB
.project 576B
.classpath 384B
共 53 条
- 1
资源评论
- xx401422020-05-19学习了,受益匪浅
- roylIlIlIlIlI2018-01-24资源很好帮助很大
- 大爽歌2018-10-25很不错,学习了~
ml3947
- 粉丝: 487
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功