郑州游戏学院—陈跃峰老师的博客

人生难得几回博,来,让我们博一把

陈跃峰ID:Mailbomb
689509次访问,排名45好友104人,关注者241
努力学习,努力工作
Mailbomb的文章
原创 275 篇
翻译 12 篇
转载 11 篇
评论 1167 篇
陈跃峰的公告
陈跃峰 个人简历
cqucyf@gmail.com

本BLOG中文章,未经允许严禁用于商业目的!

本人编写的J2ME基础入门书籍: 《新编J2ME就业培训教程》,购买
dearbook
华储网
当当网
Chinapub
最近评论
so_fast:不错。说的很好。顶一个
muyuqian:问题描述:每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?说明:每种鸡的数量都可以为零。

用你提供的两种方法,反而求不出数量为零的组合.
我稍微改变了一下,似乎可以.
for(int i = 0;i <= 33;i++){//母鸡数量
……
#:很好的教导文章,谢谢
hepenghit:不错,辛苦了,顶了
想认识您的人:有时间可以和您聊聊吗 我的联系电话 13643827325 QQ125475945 您要有时间请加我下或者给我邮箱发个信息 www.hanjianhai1981@163.com
文章分类
收藏
    相册
    J2ME技术
    J2ME开发网
    无线空间
    Java网站
    Eclipse官方网站
    Sun中国
    Sun官方网站
    常用网站
    Chinabyte
    Google搜索引擎
    华军软件园
    新浪新闻
    网上书店
    ITbook
    互动出版网
    当当书店
    第二书店
    我工作过的地方
    上海托普信息技术学院
    游戏学院南京校区
    游戏学院郑州校区
    电脑报
    友情链接
    acqy的专栏
    eiyaa的专栏
    上海求职客栈
    刀剑啸的专栏
    刘军的BLOG
    王新钢的BLOG
    贝壳鱼(k7sem)专栏
    骄傲的猫
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 使用J2ME技术开发RPG游戏(一)——程序框架收藏

    新一篇: MIDP3.0(JSR271)早期规范文件发布

    使用J2ME技术开发RPG游戏(一)——程序框架

    作者:陈跃峰

    出自:http://blog.csdn.net/mailbomb

           RPG(角色扮演游戏)是手机游戏中的一类主要类型,也是相对来说比较麻烦的一类游戏,下面通过一系列的文章来介绍如何使用J2ME技术来开发RPG游戏。

           首先让我们来看一下游戏的骨架——程序框架的实现。程序框架主要包含三个方面:绘制结构、事件处理结构以及线程结构。在整个框架中,采用当前游戏编程中的通用的状态控制机制,为每个界面,如菜单、帮助、游戏对话、商店界面设置一个唯一的状态值,使用该状态值控制界面的绘制、事件的处理以及线程处理。

           在程序的实现上为了通用,以MIDP1.0为基础来进行制作,这个要比使用MIDP2.0Game API实现起来要复杂一些。

           在类结构的划分上,为了节约减小jar文件大小,把这个程序代码划分为两个类,一个MIDlet类,一个界面类,所有逻辑代码以及线程实现均放置在界面类中。

           下面是MIDlet类的代码,主要实现显示界面、处理手机来电、释放资源以及退出功能,线程启动放在界面类中实现。源代码如下:

    package myrpg;

     

    import javax.microedition.midlet.*;

    import javax.microedition.lcdui.*;

     

    /**

     * RPG结构的MIDlet

     * 包含如下功能:

     *    1、显示界面

     *    2、手机来电处理

     *    3、释放资源

     *    4、退出方法

     */

    public class MyRPGMIDlet extends MIDlet {

        /**MyRPGMIDlet对象,用于实现退出功能*/

        static MyRPGMIDlet instance;

        /**界面类对象*/

        MyRPGCanvas mainScreen = new MyRPGCanvas();

        public MyRPGMIDlet() {

            //初始化

            instance = this;

            //显示界面

            Display.getDisplay(this).setCurrent(mainScreen);

        }

     

        public void startApp() {

            //开始或继续游戏

            if (mainScreen != null) {

                mainScreen.startGame();

            }

        }

     

        public void pauseApp() {

            //暂停游戏

            if (mainScreen != null) {

                mainScreen.pauseGame();

            }

        }

     

        public void destroyApp(boolean unconditional) {

            //释放资源

            if (mainScreen != null) {

                mainScreen.destroyGame();

                mainScreen = null;

            }

        }

     

        /**

         * 退出方法

         */

        public static void quitApp() {

            instance.destroyApp(true);

            instance.notifyDestroyed();

            instance = null;

        }

    }

           游戏逻辑和界面绘制以及控制都放在一个类MyRPGCanvas中,这样实现没有使用面向对象容易修改和扩展,但是通过结构化代码,还是可以保证较高的可读性以及维护性。在MyRPGCanvas中,通过状态变量status控制界面的绘制以及线程逻辑,为了清晰,把每个处理逻辑都封装成一个方法,如果方法比较复杂还可以继续拆分为多个方法。

           关于绘制部分,如果每个界面都具有一张不透明的背景图片的话,可以省略清屏功能,这样可以提高程序的执行效率。

           关于线程部分主要实现了暂停控制,通过isPaused变量来控制逻辑是否执行,从而实现暂停功能,并实现精确的延时。

           关于资源加载和销毁,如果机器的内存不是很紧张的话,可以一次加载,如果内存比较紧张的话,需要编写专门的代码控制资源的加载和销毁。

           具体的实现代码如下:

    package myrpg;

    import javax.microedition.lcdui.*;

    /**

     * 游戏界面,包含所有游戏界面、逻辑以及事件处理

     */

    public class MyRPGCanvas extends Canvas implements Runnable {

        /**游戏是否处于运行状态,true代表处于运行状态*/

        private boolean isRunning = true;

        /**游戏是否处于暂停状态,true代表处于暂停状态*/

        private boolean isPaused = false;

     

        /**屏幕宽度*/

        private int width;

        /**屏幕高度*/

        private int height;

     

        /**时间间隔*/

        private final int INTERVAL_TIME = 100;

     

        /**游戏状态,使用该变量标示游戏的界面和逻辑*/

        private int status;

     

        //各个界面状态常量

        /**Logo界面状态*/

        private final int LOGO_STATUS = 0;

        /**菜单界面状态*/

        private final int MENU_STATUS = 1;

        /**帮助界面状态*/

        private final int HELP_STATUS = 2;

        /**关于界面状态*/

        private final int ABOUT_STATUS = 3;

        //游戏中各个状态常量

        /**地图1状态*/

        private final int GAME_MAP1_STATUS = 4;

        /**武器店1状态*/

        private final int GAME_WEAPONSHOP1_STATUS = 5;

        /**对话1状态*/

        private final int GAME_DIALOG1_STATUS = 6;

     

        public MyRPGCanvas() {

            //初始化

            init();

            //启动线程

            Thread thread = new Thread(this);

            thread.start();

        }

     

        /**

         * 初始化游戏

         * 导入资源和初始化游戏状态

         */

        private final void init() {

            //获得屏幕尺寸

            width = this.getWidth();

            height = this.getHeight();

            //初始化游戏状态,默认显示LOGO界面

            status = LOGO_STATUS;

            //导入图片和其他资源

     

        }

     

        protected void paint(Graphics g) {

            //清屏

            clearScreen(g);

            //绘制

            switch (status) {

            case LOGO_STATUS:

                paintLogo(g);

                break;

            case MENU_STATUS:

                paintMenu(g);

                break;

            case HELP_STATUS:

                paintHelp(g);

                break;

            case ABOUT_STATUS:

                paintAbout(g);

                break;

            case GAME_MAP1_STATUS:

                paintGame_Map1(g);

                break;

            case GAME_WEAPONSHOP1_STATUS:

                paintGame_WeaponShop1(g);

                break;

            case GAME_DIALOG1_STATUS:

                paintDialog1(g);

                break;

            }

        }

     

        /**

         * 绘制LOGO界面

         * @param g Graphics 画笔

         */

        private final void paintLogo(Graphics g) {

     

        }

     

        /**

         * 绘制菜单界面

         * @param g Graphics 画笔

         */

        private final void paintMenu(Graphics g) {

     

        }

     

        /**

         * 绘制帮助界面

         * @param g Graphics 画笔

         */

        private final void paintHelp(Graphics g) {

     

        }

     

        /**

         * 绘制关于界面

         * @param g Graphics 画笔

         */

        private final void paintAbout(Graphics g) {

     

        }

     

        /**

         * 绘制游戏地图1界面

         * @param g Graphics 画笔

         */

        private final void paintGame_Map1(Graphics g) {

     

        }

     

        /**

         * 绘制游戏武器店1界面

         * @param g Graphics 画笔

         */

        private final void paintGame_WeaponShop1(Graphics g) {

     

        }

     

        /**

         * 绘制游戏对话1界面

         * @param g Graphics 画笔

         */

        private final void paintDialog1(Graphics g) {

     

        }

     

        /**

         * 清屏

         * @param g Graphics 画笔

         */

        private final void clearScreen(Graphics g) {

            g.setColor(0xffffff);

            g.fillRect(0, 0, width, height);

        }

     

        /**

         * 开始和继续游戏

         */

        public void startGame() {

            isPaused = false;

        }

     

        /**

         * 暂停游戏

         */

        public void pauseGame() {

            isPaused = true;

        }

     

        /**

         * 释放资源

         * 包括图片、声音等资源

         */

        public void destroyGame() {

     

        }

        /**

         * logo界面线程逻辑

         */

        private final void doLogo() {

     

        }

        /**

         * 帮助界面线程逻辑

         */

        private final void doHelp() {

     

        }

        /**

         * 关于界面线程逻辑

         */

        private final void doAbout() {

     

        }

        /**

         * 菜单界面线程逻辑

         */

        private final void doMenu() {

     

        }

        /**

         * 游戏地图1界面线程逻辑

         */

        private final void doGame_Map1() {

     

        }

        /**

         * 游戏武器店1界面线程逻辑

         */

        private final void doGame_WeaponShop1() {

     

        }

        /**

         * 游戏对话1界面线程逻辑

         */

        private final void doDialog1() {

     

        }

     

        public void run() {

            try {

                while (isRunning) {

                    //精确延时

                    long start = System.currentTimeMillis();

     

                    //逻辑处理

                    if (!isPaused) {

                        switch (status) {

                        case LOGO_STATUS:

                            doLogo();

                            break;

                        case MENU_STATUS:

                            doMenu();

                            break;

                        case HELP_STATUS:

                            doHelp();

                            break;

                        case ABOUT_STATUS:

                            doAbout();

                            break;

                        case GAME_MAP1_STATUS:

                            doGame_Map1();

                            break;

                        case GAME_WEAPONSHOP1_STATUS:

                            doGame_WeaponShop1();

                            break;

                        case GAME_DIALOG1_STATUS:

                            doDialog1();

                            break;

                        }

     

                    }

                    //重绘

                    repaint();

                    serviceRepaints();

                    long end = System.currentTimeMillis();

                    //延时

                    if ((end - start) < INTERVAL_TIME) {

                        Thread.sleep(INTERVAL_TIME - (end - start));

                    }

                }

            } catch (Exception e) {}

        }

    }

           这些只是一个简单的框架,包含了有些开发中的常见功能的实现,但是尚不包含按键处理方面的代码,如果大家有什么建议和意见也可以积极提出。 

    发表于 @ 2007年01月16日 16:05:00|评论(loading...)|编辑

    旧一篇: 看了《一个想踏入游戏行业的人的独白》突然想说点什么(转)

    评论

    #zdsdiablo 发表于2007-04-29 14:43:23  IP: 210.22.82.*
    收了,留着以后看。
    #zw_errrun 发表于2007-04-29 16:29:14  IP: 218.249.163.*
    文章到目前为止还没有涉及到RPG的东西:-)
    #huyongzs 发表于2007-05-02 20:54:41  IP: 222.134.105.*
    好,不错的东西!
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 陈跃峰