Java究竟怎么玩?http://blog.csdn.net/cping1982

菩提本无树,明镜亦非台,本来无一物,何处惹尘埃

用户操作
[即时聊天] [发私信] [加为好友]
鹏凌三千(cping1982)ID:cping1982
150888次访问,排名520好友15人,关注者28
机密……
cping1982的文章
原创 138 篇
翻译 0 篇
转载 39 篇
评论 308 篇
鹏凌三千(cping1982)的公告
本博评论删除规则如下:

1、辱骂性发言,无视其辱骂对象,一律删。

2、登录发表的评论,不违背第一条者一律不删。非登录发表的评论,过激者删。

3、若发生例外情况,则为CSDN博客系统自动删除。

声援SOFF|声援珊瑚虫:如果你是珊瑚虫用户,请坚决力挺声援珊瑚虫!

平生进退如飙风,一睨人才天下空。独向苍天横冷剑,何必生我惭英雄。

本人有效BLOG:

cping1982

ceponline

音乐:

风姿花传

ドラグ.スレイブ

ヒカルの碁

Believe

世界で一番ヤバイ恋

あんなに一緒だった

精忠报国

谁是大英雄

随遇而安

明天会吹什么风

逍遥游

爱江山更爱美人

最近评论
sisharen:可以发个install4j的破解版给我吗?万分感谢啊!我找了很久都没找到,我的邮箱是qqyongqiangqq@126.com
sisharen:不错!我喜欢这篇文章!
sisharen:我把这样制作出来的rt.jar替换原来我可以运行的原89M里面的45M的rt.jar,不行啊
sisharen:我把这样制作出来的rt.jar替换原来我可以运行的原89M里面的45M的rt.jar,不行啊
sisharen:怎么我怎么搞都不成功的啊,楼主帮下忙啊
文章分类
收藏
    相册
    Java的PC游戏开发
    Java中的A*(A star)寻径实现
    Java仿雷电及其源代码
    Java制作的类祖码游戏-数字祖码
    Java实现窗体中角色逐渐风化效果
    Java版吃豆游戏
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[2]——踏破红尘
    Java[伪]寻径追踪实现
    JAVA中[人工无脑]系统(chatbot)的实现
    Java中2.5D游戏(斜45度角)的设计与实现(1)
    Java中2.5D游戏(斜45度角)的设计与实现(2)
    Java仿太阁立志传5
    JAVA图形操作中FPS的计算(附带随机生成乱数球体用例)
    JAVA实现拼图游戏
    Java来做马里奥[0]—让精灵再次舞动
    Java来做马里奥[1]—木叶传承
    Java来做马里奥[2]—食不厌精
    Java来做马里奥[3]—杂兵登场
    Java模拟桌球打击处理及绘制
    Java汉诺塔测试
    Java炸弹人实现及源码
    人生如梦游戏间,JAVA游戏开源开发讲座[番外篇]之AVG开发——皮影
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[0]——月晕础润
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[1]——风云初现
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[3]——邯郸学步
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[4]——一步莲华
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[5]——一树双花
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[6]——走马观花
    史上最扯Java图形绘制(J2SE)之一JAVA动画效果
    沉寂的国人开源项目
    bo-blog(blog系统,php项目)
    DockPanel Suite [Microsoft .NET Framework Winform UI]
    Hocate web framework[web框架]
    Loonframework-DAO[持久层框架]
    Loonframework-GAME[游戏框架,尚未发布]
    Loonframework-WEB[web框架,尚未发布]
    Luntbuild(软件管理工具)
    magike(php博客)
    myseelite(p2p流媒体系统,c++项目)
    newxy(新坐标)[web框架]
    opencrx(crm系统)
    redlion(web框架)
    x2blog(asp.net博客系统)
    YOYOPlayer(音乐播放器)
    袋鼠egg(服务器)
    经典Blog
    # gzfqh的专栏 →底层代码研究(病毒及汇编)(RSS)
    # java 3D 游戏编程(RSS)
    ApoGames(德国某人的Java游戏作品展示)
    Struts框架应用
    Struts框架应用~
    千里冰封[JAVA 浓香四溢]
    网络安全圈子
    经典站点
    Google
    IBM中国站
    JavaGame开发论坛
    JAVA开源大全
    Java爱好者
    Struts标签文档
    SUN 中国社区
    中国IT实验室
    数据库专区
    偶的其它应用实例
    C#将图像文件压缩为AVI文件播放
    Java&.Net虚拟机精简(GreenJVM&GreenDotNet发布)
    Java图形程序水纹倒映效果
    Java输出竖排古典文字
    .NET在线漫画下载程序
    C#转换AVI文件为BMP文件
    ClassLoader调用外部jar包
    ExtJS2.0开发与实践笔记[0]——初识ExtJS
    ExtJS2.0开发与实践笔记[1]——ExtJS中的Dialog与Form
    ExtJS2.0开发与实践笔记[2]——Ext中的Layout
    ExtJS2.0开发与实践笔记[3]——Ext中的Menu
    ExtJS2.0开发与实践笔记[4]——Ext中的动画处理
    JavaFx实现(1)-渐变效果
    JavaFx实现(2)-随机图形绘制
    Java中DAO的实现
    Java中Image翻转操作
    Java中将byte[]转为Blob对象
    Java中的A*(A star)寻径实现
    Java制作绿色软件(GreenJVM_0.1.0发布)
    JAVA图形操作类
    Java图形程序中的对话逐字显示实现
    Java实现任意文件在bmp中的隐藏与导出
    JAVA实现可设置背景的MDI窗口
    Java实现嵌入式数据库(文本数据库)代码实例
    Java实现类Windows导航栏
    Java正则表达式入门
    JAVA版JAVA IDE环境(源码)
    JAVA线程池的简单实现及优先级设置
    Java自定义JSlider UI
    Java获得系统环境变量
    Java音乐播放类
    ResultSet转为实体对象
    SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
    在JTable中加载进度条及进行操作
    在Swing中使用Html标签
    在SWT中使用ChartDirector
    浅谈java.util.concurrent包的并发处理
    浅谈Java集合中Array(数组)的应用
    精简JRE体积
    通过exe启动class
    偶的文章
    《三国以后有几国》
    中国本土化编程(汉语编程)之我见
    从珊瑚虫事件,看为什么中国出不了比尔.盖茨
    佛与专家
    叹今人无气节而作歌
    国产开源项目的七宗罪
    对Hibernate使用之愚见
    对Java(J2SE PC)开发之怪现象之我见
    浅谈命名规范[纯属强辩]
    灭了珊瑚虫,下一个是谁?
    率性而作无题歌一首
    百度对“十进制网络”的官方态度
    耻民
    论番茄花园的倒掉
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Java中2.5D游戏(斜45度角)的设计与实现(1)收藏

    新一篇: 原创小说连载:恋上Developer(1) | 旧一篇: 印尼前总统苏哈托终于死了!感动啊!特此纪念!

    通常的概念中,2D也就是所谓的二维,也就是平面图形——即由X与Y坐标构成的图形,其内容由水平的X轴向与垂直的Y轴描绘确定,也就是由长和高的形成所谓的二维平面。

    而所谓3D,也称之为三维。其图形内容除了有水平的X轴向与垂直的Y轴向外还有进深的Z轴,故称三维(XYZ),也就是由长、宽、高三项要素形成所谓的三维立体。

    2D与3D的主要区别在于,3D可以包含360度的信息,能从各个角度去表现,构成近似于现实空间的有质感视角;而2D通常只能表现如表格、棋盘版的平面数据。 3D的立体感、光景效果要比二维平面图形要好的多,因为它的立体、光线、阴影都是相对真实存在的,而2D显然不具备这些优势。高拟真度、高自由度使得3D图形大受欢迎。

    所以渐渐的3D图形开始成为主流,充斥于电影、电视乃至游戏的各个角落。但是,由于3D技术实现的复杂性及对用户环境的高要求,在所有领域都完全使用3D构图还并不现实,由此引发了另一种图形表现形式的出现——2.5D图形。

    所谓的2.5D,介乎于模真的3D与完全平面的2D之间。即模拟了3D的空间感,也兼具2D的灵动简单,是一种“优势”的综合体。就我个人认为,诚然2.5D最早的出现动机只是为了2D到3D间过渡。但就其应用而讲,好的2.5D图形即有3D的自由度与质感,又能利用2D图形将漫画式人物塑造得惟妙惟肖,使其拥有纯3D还无法做到的优势。因此2.5D在现在乃至未来的一段较长时间里还会和3D并存,直到3D图形的开发效率及表现形式能彻底取代2.5D为止。

    目前2.5D有两种大方向的实现思路:

    一、纯2D模拟实现,是由2D人物及2D模拟3D场景:比较常见的如《神奇传说》、《皇家骑士团》、《超时空英雄传说》(PS:我从1开始玩的,也由此和宇峻游戏结缘,虽然我不是游戏开发人员,但遥想当年宇峻科技刚开张时,李玉山一个人写出超时空英雄传说1所有程序代码[虽然有部分是国外引擎改的]的功力我至今望尘莫及,其不愧为我等程序员之楷模)《魔力宝贝online》等,利用近大远小的视觉差模拟3D物体,令用户产生在使用3D图形的错觉,通常为一个左或右偏的45度角,当然也有偏55度或其他不同的角度可供选择。

    二、2D+3D实现,是由3D场景加2D人物贴图:比如《MU奇迹online》、《RO仙境传说online》(PS:在RO中我练的高INT创造者,爱好是城战丢硫酸瓶毁对方装备……),由于场景采用3D绘制,可以360度自由旋转视角,真实感较强。纯2D的角色与遮挡关系处理简单。相对于纯3D来说代码量少且简单。美术方面工作量较少。比之纯3D占用系统资源也更少。

    平心而论,个人比较推崇2D+3D哪种类RO的表现方式,但由于吾辈是Java程序员且非游戏开发人员并不熟悉Java3D的关系,只能采用Java2D来进行演示。

    在当采用2D模拟3D实现2.5D(斜视角)时,我认为难点只有两个:

    1.你要有美工帮你做好斜视的tile及role

    2.你要转换2D坐标为2.5D坐标

    对于第一点,神仙都爱莫能助……没有美工就自己画吧……

    而对于第二点,也就是斜视图的坐标变换,大多数人最直接的想法可能就是利用三角函数。是的,从某种意义上说,俯视角度与正斜视角度的变化就是三角函数的应用,我也见过这类的45度斜视用例。但是,利用cos在Java中进行三角函数的运算,首先速度不能达到要求,其次图像衔接度结果并不理想,结果可能令图像有锯齿状偏移,所以我并不推荐使用。

    对于如类的菱形斜视图像,我们可以利用一个简单的行列运算获得俯视角度地砖的绘制坐标与斜视角度地砖的绘制坐标的变换,公式如下:

     X:2.5D图形中X轴位置=(目标图像Width/2)*(2D图形中X-2D图形中Y)

     Y:2.5D图形中Y轴位置=(目标图像Height/2)*(2D图形中X+2D图形中Y)/2

    当然,这个公式并不是绝对的,尤其是在图像数据有所偏移时。比如斜视角的地砖的宽与高的比例理论上应该是2:1的关系,即如果高度是12的话,那么物体宽度就应该是24,这个在数学上讲和绘制地图上的时候是没有错的。但是问题出现在美工可能做不出来这么一个图(比如我,做了三个演示用图基准线全不一样|||)。

    因为美工在画图的时候,肯定是要找一个基准线(一般是水平方向上的中分线,因为这个方向是高度,而高度的比例是单位1),然后对称的画图的,在开始的时候问题不会出现,但是在画到后面的时候就会发现,无论如何都没有办法把另一个方向上的顶点画出来,总是没有办法在指定的范围内相交。这是因为计算机的绘图是按照像素点一个个绘制出来的,总是没0.5个像素的时候,所以就出现了这个情况。于是,美工一般为了在指定的范围划出来一个菱形往往会画花2个像素,也就是24*12的图像很有可能会被画成22*12……

    此时这是我们就需要增或者减公式中的数值,令基准线和图形的实际保持一致,大家可以自己推导。



    演算后图形表现应如上图所示。

    下面,我给出一个在Java中此公式的实际实现代码。

    Test25D.java

    package org.loon.framework.game.test;

    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Panel;
    import java.awt.Point;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    import org.loon.framework.game.image.Bitmap;

    /**
     * <p>
     * Title: LoonFramework
     * </p>
     * <p>
     * Description:Java2.5D地图构建
     * </p>
     * <p>
     * Copyright: Copyright (c) 2007
     * </p>
     * <p>
     * Company: LoonFramework
     * </p>
     * 
     * 
    @author chenpeng
     * @email:ceponline@yahoo.com.cn
     * 
    @version 0.1
     
    */

    public class Test25D extends Panel {
        
        
    /**
         * 
         
    */

        
    private static final long serialVersionUID = 1L;

        
    final static int frameWidth = 490;

        
    final static int frameHeight = 330;

        Bitmap floor, tile,role;

        Image screen;

        Graphics graphics;

        
    int[][] map = 
                
    11111111 },
                
    10000001 },
                
    10100001 },
                
    10000101 },
                
    10000001 }
                
    11111111 } }
    ;

        
    public Test25D() {
            
            setBackground(Color.WHITE);
            
            floor 
    = new Bitmap("./imagerpg/floor.gif");
            tile 
    = new Bitmap("./imagerpg/tile.gif");
            role 
    = new Bitmap("./imagerpg/obj.gif");
            
    //定位为X=1,Y=2(由0开始)
            role.setDrawXY(12);
            screen 
    = new Bitmap(frameWidth, frameHeight).getImage();
            graphics 
    = screen.getGraphics();

        }


        
    public void update(Graphics g) {
            paint(g);
        }


        
    public void paint(Graphics g) {
            
    int X, Y;
            
    //将图像位置向x点坐标校正180,y点校正50
            int offsetX = 180;
            
    int offsetY = 50;
            
    int floorWidth = floor.getWidth();
            
    int floorHeight = floor.getHeight();
            
    for (int i = 0; i < map.length; i++)
                
    for (int j = 0; j < map[i].length; j++{
                    
    //转换为斜角坐标
                    Point p = reviseXY(floorWidth,floorWidth, j, i, offsetX, offsetY);
                    X 
    = p.x;
                    Y 
    = p.y;
                    
    if (map[i][j] == 0{
                        graphics.drawImage(floor.getImage(), X, Y, X 
    + floorWidth,
                                Y 
    + floorHeight, 00, floorWidth, floorHeight,
                                
    this);
                    }

                }

            
    int blackWidth = tile.getWidth();
            
    int blackHeight = tile.getHeight();
            
    for (int i = 0; i < map.length; i++)
                
    for (int j = 0; j < map[i].length; j++{
                    
    if (map[i][j] != 0{
                        Point p 
    = reviseXY(blackWidth,blackWidth, j, i, offsetX, offsetY);
                        X 
    = p.x;
                        Y 
    = p.y - (blackHeight - floorHeight);
                        graphics.drawImage(tile.getImage(), X, Y, X 
    + blackWidth,
                                Y 
    + blackHeight, 00, blackWidth, blackHeight,
                                
    this);
                    }

                }

            
            
    //绘制移动角色
            int roleWidth = role.getWidth();
            
    int roleHeight = role.getHeight();
            Point p 
    = reviseXY(roleWidth,roleWidth, role.getDrawX(), role.getDrawY(), offsetX, offsetY);
            X 
    = p.x;
            Y 
    = p.y-15;
            graphics.drawImage(role.getImage(), X, Y, X 
    + roleWidth,
                    Y 
    + roleHeight, 00, roleWidth, roleHeight,
                    
    this);
            
    //在伪45度图像构建时,需要处理角色和建筑间的遮挡关系,我在这里只使用了简单的重绘
            
    //即如果构成和角色相遮挡的物体,首先绘制角色,而后用建筑遮挡该角色。
            
    //比如x+1=1即前方有物体存在时,重绘遮挡物以遮挡角色
            if(map[role.getDrawY()][role.getDrawX()+1]==1){
                 p 
    = reviseXY(blackWidth,blackWidth, role.getDrawX()+1, role.getDrawY(), offsetX, offsetY);
                X 
    = p.x;
                Y 
    = p.y - (blackHeight - floorHeight);
                graphics.drawImage(tile.getImage(), X, Y, X 
    + blackWidth,
                        Y 
    + blackHeight, 00, blackWidth, blackHeight,
                        
    this);
            }

       

            g.drawImage(screen, 
    00this);
        }


        
    /**
         * 修正为斜角坐标
         * 
    @param width
         * 
    @param x
         * 
    @param y
         * 
    @param offsetX
         * 
    @param offsetY
         * 
    @return
         
    */

        
    private Point reviseXY(int width, int height,int x, int y, int offsetX, int offsetY) {
            
    int x1 = x * (width / 2);
            
    int y1 = y * (height / 2);
            
    int nx = x1 - y1;
            
    int ny = (x1 + y1)/2;
            
    return new Point(nx + offsetX, ny + offsetY);
        }


        
    public static void main(String[] args) {
            java.awt.EventQueue.invokeLater(
    new Runnable() {
                
    public void run() {
                    Frame frm 
    = new Frame("Java2.5D地图构建");
                    frm.setResizable(
    false);
                    frm.setSize(frameWidth, frameHeight);
                    frm.add(
    new Test25D());
                    frm.addWindowListener(
    new WindowAdapter() {
                        
    public void windowClosing(WindowEvent e) {
                            System.exit(
    0);
                        }

                    }
    );
                    frm.setLocationRelativeTo(
    null);
                    frm.setVisible(
    true);
                }

            }
    );
        }


    }


    效果图如下:



    明天晚上有时间再继续……赶紧睡觉……

    发表于 @ 2008年02月02日 01:02:00|评论(loading...)|编辑

    新一篇: 原创小说连载:恋上Developer(1) | 旧一篇: 印尼前总统苏哈托终于死了!感动啊!特此纪念!

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 鹏凌三千(cping1982)