从星期一开始一直郁闷……

最近的状况……用迷信的说法就是犯小人,以社会学的观点是由于出现人际交往困难造成社会评价降低……无比郁闷中,继续写这个……

上一回我们写到关于如何改变角色的移动样式及线程的初步处理,本次将继续进行下一步,即角色多步走法中方向变化的实现。

程序源码如下,我一直相信,源码是最好的老师,与其向白痴一样以死背下多少API自鸣得意,还不如踏踏实实写点东西!!!了解一下程序本质!!!竟然让我一个搞后台的默写,默写!!!出CSS的布局实现效果……7456~~~(这种人也能当技术总监……中国啊~~~)

程序源码如下:

package org.loon.chair.example4;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.ImageIcon;

import javax.swing.JPanel;

/**

* Example3中自定义面板,用于描绘底层地图。

*

* @author chenpeng

*

* Loon Framework in Game

*

* PS:请注意,此处与前例不同,新增键盘事件监听

*/

public class MyPanel extends JPanel implements  KeyListener {

//窗体的宽与高

private static final int WIDTH = 480;

private static final int HEIGHT = 480;

//设定背景方格默认行数

private static final int ROW = 15;

//设定背景方格默认列数

private static final int COL = 15;

//单个图像大小,我默认采用32x32图形,可根据需要调整比例。

//当时,始终应和窗体大小比例协调;比如32x32的图片,如何

//一行设置15个,那么就是480,也就是本例子默认的窗体大小,

//当然,我们也可以根据ROW*CS,COl*CS在初始化时自动调整

//窗体大小,以后的例子中会用到类似情况。总之一句话,编程

//是[为目的而存在的],所有的方法,大家都可任意尝试和使用。

private static final int CS = 32;

//设定地图,通常在rpg类型游戏开发中,以[二维数组]对象为

//基础进行地图处理,用以描绘出X坐标和Y坐标。实际上,即令

//再华丽的RPG类游戏,都是从这些简单的X,Y坐标开始的。

//PS:所谓[数组],大家可以简单的理解为即数据的集合,一维数组

//仅包含X轴,而二维是由X,Y两个轴组成的,X与Y的交织点,即为

//一条数据。

private int[][] map = {

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,1,1,1,1,1,0,0,0,0,1},

{1,0,0,0,0,1,0,0,0,1,0,0,0,0,1},

{1,0,0,0,0,1,0,0,0,1,0,0,0,0,1},

{1,0,0,0,0,1,0,0,0,1,0,0,0,0,1},

{1,0,0,0,0,1,1,0,1,1,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

//设定显示图像对象

private Image floorImage;

private Image wallImage;

//角色

private Image roleImage;

//角色坐标

private int x, y;

//增加计步器

private int count;

//此处我们添加一组常数,用以区别左右上下按键的触发,

//之所以采用数字进行区别,原因大家都很清楚^^,数字

//运算效率高嘛~

private static final int LEFT = 0;

private static final int RIGHT = 1;

private static final int UP = 2;

private static final int DOWN = 3;

private int direction; //新增变量,用以确认角色所对方向,对应按键触发

private Thread threadAnime;

public MyPanel() {

//设定初始构造时面板大小

setPreferredSize(new Dimension(WIDTH, HEIGHT));

//于初始化时载入图形

loadImage();

//初始化角色所在位置,由于本例行列皆为15,估x与y的极限数值也皆为15,

//即由15x15的方格图像,组成了角色的可见活动区域。

x = 8;

y = 8;

direction=DOWN; //默认为角色向下

//在面板构建时赋予计步器初值

count = 0;

//设定焦点在本窗体并付与监听对象

setFocusable(true);

addKeyListener(this);

//实例化内部线程AnimationThread

threadAnime = new Thread(new AnimationThread());

//启动线程

threadAnime.start();

}

//描绘窗体,此处在默认JPanel基础上构建底层地图.

public void paintComponent(Graphics g) {

super.paintComponent(g);

//画出地图

drawMap(g);

//画出人物

drawRole(g);

}

/**

* 载入图像

*

*/

private void loadImage() {

//获得当前类对应的相对位置image文件夹下的地板图像

ImageIcon icon = new ImageIcon(getClass().getResource("image/floor.gif"));

//将地板图像实例付与floorImage

floorImage = icon.getImage();

//获得当前类对应的相对位置image文件夹下的墙体图像

icon = new ImageIcon(getClass().getResource("image/wall.gif"));

//将墙体图像实例付与wallImage

wallImage = icon.getImage();

icon = new ImageIcon(getClass().getResource("image/role.gif"));

roleImage = icon.getImage();

}

/**

* 绘制角色

*/

private void drawRole(Graphics g) {

//以count作为图像的偏移数值,并于Example4中添加direction以获取所处图像块位置

g.drawImage(roleImage, x * CS, y * CS, x * CS + CS, y * CS + CS,

count * CS, direction * CS, CS + count * CS, direction * CS + CS, this);

}

//换算公式如下:

private void drawMap(Graphics g) {

//在Java或任何游戏开发中,算法都是最重要的一步,本例尽使用

//简单的双层for循环进行地图描绘,

for (int x = 0; x < ROW; x++) {

for (int j = 0; j < COL; j++) {

// switch作为java中的转换器,用于执行和()中数值相等

// 的case操作。请注意,在case操作中如果不以break退出

// 执行;switch函数将持续运算到最后一个case为止。

switch (map[x][j]) {

case 0 : //map的标记为0时画出地板

//在指定位置[描绘]出我们所加载的图形,以下同

g.drawImage(floorImage, j * CS, x * CS, this);

break;

case 1 : //map的标记为1时画出城墙

g.drawImage(wallImage, j * CS, x * CS, this);

break;

//我们可以依次类推出无数的背景组合,如定义椅子为2、宝座为3等

//很容易即可勾勒出一张背景地图。

default: //当所有case值皆不匹配时,将执行此操作。

break;

}

}

}

}

public void keyPressed(KeyEvent e) {

//获得按键编号

int keyCode = e.getKeyCode();

//通过转换器匹配事件

switch (keyCode) {

//当触发Left时

case KeyEvent.VK_LEFT :

//进行left操作,仅符合move()中[规范]时执行,以下相同

move(LEFT);

break;

//当触发Right时

case KeyEvent.VK_RIGHT :

move(RIGHT);

break;

//当触发Up时

case KeyEvent.VK_UP :

move(UP);

break;

//当触发Down时

case KeyEvent.VK_DOWN :

move(DOWN);

break;

}

// 重新绘制窗体图像

// PS:在此例程中,仅进行了角色的简单移动处理

// ,关于避免闪烁及限制活动区域问题,请见后续

// 案例。

repaint();

}

/**

* 用于判定是否允许移动的发生,被move()函数调用

* @param x

* @param y

* @return

*/

private boolean isAllow(int x, int y) {

// 以(x,y)交点进行数据判定,我们都知道,

// 在本例中我仅以0作为地板的参数,1作为

// 墙的参数,由于我们的主角是[人类],而

// 不是[幽灵],所以当他要[撞墙]时,我们

// 当然不会允许,至少,是我讲到剧情的触发

// 以前……

if (map[y][x] == 1) {

// 不允许移动时,返回[假]

return false;

}

// 允许移动时时,返回[真]

return true;

}

/**

* 判断移动事件,关联isAllow()函数

* 在Example4中,添加了对于移动方向的整型记录变量direction

* @param event

*/

private void move(int event) {

//以转换器判断相关事件,仅执行符合[规范]的操作。

switch (event) {

case LEFT:

//依次判定事件

if (isAllow(x-1, y)) x--;

direction = LEFT;

break;

case RIGHT:

if (isAllow(x+1, y)) x++;

direction = RIGHT;

break;

case UP:

if (isAllow(x, y-1)) y--;

direction = UP;

break;

case DOWN:

if (isAllow(x, y+1)) y++;

direction = DOWN;

break;

default:

break;

}

}

/**

* 暂无释放键盘事件

*/

public void keyReleased(KeyEvent e) {

}

/**

* 暂无字符输入事件

*/

public void keyTyped(KeyEvent e) {

}

//内部类,用于处理计步动作。

private class AnimationThread extends Thread {

public void run() {

while (true) {

// count计步

if (count == 0) {

count = 1;

} else if (count == 1) {

count = 0;

}

// 重绘画面。

repaint();

// 每300毫秒改变一次动作。

try {

Thread.sleep(300);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

新改角色图如下:

越想越生气……越想越生气……越想越生气……今天就写到这里了……下次继续……

本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/130241

人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[4]——一步莲华相关推荐

  1. 人生如梦游戏间,RPG游戏开源开发讲座 JAVA篇 4 ——一步莲华

    从星期一开始一直郁闷-- 最近的状况--用迷信的说法就是犯小人,以社会学的观点是由于出现人际交往困难造成社会评价降低--无比郁闷中,继续写这个-- 上一回我们写到关于如何改变角色的移动样式及线程的初步 ...

  2. 【转】人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[4]——一步莲华

    来源:http://blog.csdn.net/cping1982/article/details/1747703 从星期一开始一直郁闷-- 最近的状况--用迷信的说法就是犯小人,以社会学的观点是由于 ...

  3. 人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[0]——月晕础润

    开场诗: 不儒不道又不仙,非神非圣也非贤.轻吐心头寻常语, 开辟文武一片天. 自表诗: 北冥沉渊有鲲鹏, 吞噬金乌戮真龙.一日扶摇凌天起,三千世界可横行. 小子"鹏凌三千",欲将心 ...

  4. 人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[3]——邯郸学步

    书接前文,事表上回.话说上回书提到"画面闪烁问题和角色动作的变更"是目前我们所面临的两大难点之一,本次,将就解决画面闪烁的前提条件--角色动作变更,也即"动画" ...

  5. 【转载】人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[3]——邯郸学步

    书接前文,事表上回.话说上回书提到"画面闪烁问题和角色动作的变更"是目前我们所面临的两大难点之一,本次,将就解决画面闪烁的前提条件--角色动作变更,也即"动画" ...

  6. 【转】人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[2]——踏破红尘

    来源:http://blog.csdn.net/cping1982/article/details/1664380 "本鹏"上回书言道,Java 游戏中地图的构建是一件极其简单的事 ...

  7. 人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[2]——踏破红尘

    "本鹏"上回书言道,Java 游戏中地图的构建是一件极其简单的事情,本次书接前文,探讨游戏中角色的移动问题. 众所周知,[角色]是一个游戏的灵魂所在,没有角色的游戏,就是没有灵魂的 ...

  8. 网络游戏demo开发实例:多人在线RPG游戏(MMO RPG)demo的开发记录(第0篇)

    最近在业余时间制作一个MMO RPG的demo,代码提交在github上,有兴趣的朋友可以自己导出代码(https://github.com/changjixiong/MMO-RPGGame), 方法 ...

  9. 游戏开发总结-java篇

    游戏开发总结-java篇 前言 网络通信 数据存储 逻辑开发 逻辑开发一般遇到的问题有: Java游戏服务器方面的开发要掌握的技术: java服务器目前主流框架技术 前言 Java语言,由于学习成本低 ...

最新文章

  1. 全国大学智能车竞赛完全模型组中的赛道标志
  2. vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法
  3. [转]COM对象创建-外部机制
  4. Symfony2插件StofDoctrineExtensionsBundle的使用说明
  5. java se的api下载_API specification for java SE 1.7
  6. java课程设计模拟画图_课程设计java画板模拟画图工具
  7. excel转PDF时,画图不分页
  8. 开通华为平板的调试功能
  9. 苹果手表出现,请在iphone 打开apple watch 应用,前生Passcode,轻点密码重试
  10. POJO类的提效利器Lombok插件IDEA安装
  11. 自动化测试方案设计和实现
  12. EDCSA OPENSSL签名验签方法
  13. 迷你世界服务器为什么在维护,迷你世界为什么进不去迷你世界进不去怎么办
  14. 服务器日志显示system特殊登陆,事件查看器 安全 特殊登陆 什么意思??
  15. Centos7 快捷键调节屏幕亮度
  16. 如何实现SQL中加减乘除等四则运算
  17. ESP8266开发之旅 阿里云物联网平台篇⑤ LED智能灯控制系统(使用HTTPS认证再连接)
  18. 几点项目里的经验教训
  19. [iOS]如何向 appstore 查询已发布 APP 的信息?
  20. 2011中国国际金融展隆重举行

热门文章

  1. ABB机器人日常检查保养维护
  2. 贝叶斯统计R语言操作3——假设检验
  3. 关于工资结算的C语言程序,C语言程序设计,纳税工资系统
  4. 甜度超标,程序员的尿竟是甜的,但更可怕的却是...
  5. 原生JS总结-- JS 绑定点击事件
  6. PCIe(peripheral component interconnect express)
  7. 关于遥感bil bsq bip三种格式互换
  8. 全球最好听的50首英文歌
  9. 企业微信公告可以发布图片吗?
  10. css弹性盒模型详解----flex-wrap