首页 > 学院 > 开发设计 > 正文

游戏框架之心得体会(2)

2019-11-18 16:17:40
字体:
来源:转载
供稿:网友

        游戏框架之心得体会(2)
       上次写到的合金代表框架,所有的框架内容都集中在1个类中。
也就是说大众的游戏(商业)的大都是这样的写法,为了节省空间!
        今天要介绍的另一个框架体系是以Funmobile公司的代码为代表的,各个功能版块分别个为一个类,另外强烈推荐
       这种代码的另一个优点是混合了高级UI和低级UI,个人认为游戏对菜单界面的美观程度要求不大。而且这种写发很利于
应用代码的书写!

 MSN alfylove@hotmail.com


下面还是老习惯 先看我截取的代码

游戏都是那几个部分

        开始游戏
        关于
        游戏帮助
        最高分
        游戏设置
        游戏菜单

//主菜单 以下所有类都满足默认构造函数和按键控制
public class NokiaUI_menu extends List
    implements CommandListener{
  NokiaUI_menu(RollerMIDlet pMidlet, RollerLogic pLogic)
    {
        super("Menu", 3); }
  public void commandAction (Command pCommand, Displayable pDisplay)
    {}                           }
   
 //最高分  
public class NokiaUI_hiscore extends Form
    implements CommandListener{}
 //游戏帮助
  public class NokiaUI_help extends Form
    implements CommandListener {}
 //游戏关于
     public class NokiaUI_about extends Form
    implements CommandListener{}
 //游戏设置
 public class NokiaUI_setting extends Form
    implements CommandListener{}
  //游戏暂停 实际是游戏中菜单
 public class NokiaUI_pause extends List
    implements CommandListener{}
   
   
  RollerMIDlet.java 
 
  /*在生命控制程序中所有的类都在此集合,实例化。
  这种方法相当便利了各个类的调用*/
 
 
public class RollerMIDlet extends MIDlet

 
 
public RollerMIDlet()
    {
        mLogic = new RollerLogic(this);
        mNokia = new NokiaUI_menu(this, mLogic);
        mSetting = new NokiaUI_setting(this, mLogic);
        mHiScore = new NokiaUI_hiscore(this, mLogic);
        mHelp = new NokiaUI_help(this);
        mAbout = new NokiaUI_about(this);
        mPause = new NokiaUI_pause(this, mLogic);
    }


    PRotected void startApp()
        throws MIDletStateChangeException
    {
        if(mLogic != null)
        {
            Display.getDisplay(this).setCurrent(mLogic);
            mLogic.start();
        }
    }

    protected void pauseApp()
    {
        if(mLogic != null)
            mLogic.stop();
    }

    protected void destroyApp(boolean p0)
    {
        if(mLogic != null)
            mLogic.stop();
    }

    void StartGame()
    {
        if(mLogic != null)
            mLogic.NewGame();
    }

    void QuitGame()
    {
        destroyApp(false);
        notifyDestroyed();
    }

//转控分支 

   public void ToNokiaUI()
    {
        if(mNokia != null)
            Display.getDisplay(this).setCurrent(mNokia);
    }

    public void ToNokiaUI_Setting()
    {
        if(mSetting != null)
            Display.getDisplay(this).setCurrent(mSetting);
    }

    public void ToNokiaUI_HiScore()
    {
        mHiScore = null;
        mHiScore = new NokiaUI_hiscore(this, mLogic);
        if(mHiScore != null)
            Display.getDisplay(this).setCurrent(mHiScore);
    }

    public void ToNokiaUI_Help()
    {
        if(mHelp != null)
            Display.getDisplay(this).setCurrent(mHelp);
    }

    public void ToNokiaUI_About()
    {
        if(mAbout != null)
            Display.getDisplay(this).setCurrent(mAbout);
    }


    public void ToNokiaUI_Pause()
    {
        if(mPause != null)
            Display.getDisplay(this).setCurrent(mPause);
    }

    public void ReturnUI()
    {
        if(mLogic != null)
            Display.getDisplay(this).setCurrent(mLogic);
    }

    private RollerLogic mLogic;
    private NokiaUI_menu mNokia;
    private NokiaUI_setting mSetting;
    private NokiaUI_hiscore mHiScore;
    private NokiaUI_help mHelp;
    private NokiaUI_about mAbout;
    private NokiaUI_pause mPause;
}

RollerLogic.java


//中控部分
//游戏的驱动所在,线程控制生命循环。


public class RollerLogic extends FullCanvas
    implements Runnable
{

    RollerLogic(RollerMIDlet pMidlet)
    {
        lThread = null;
        maxsprite = 5;
        sprite = new Image[maxsprite];
        lMidlet = pMidlet;
        lWidth = getWidth();
        lHeight = getHeight();
        lCanvas = new RollerCanvas(this);
        Stage = 0;
        m_bSoundOn = true;
        m_bVibrationOn = true;
    }

    public synchronized void start()
    {
        if(lThread == null)
        {
            lThread = new Thread(this);
            lThread.start();
        }
    }

    public synchronized void stop()
    {
        lThread = null;
    }

    public void run()
    {
        Thread pThreadTemp = Thread.currentThread();
        do
        {
            if(pThreadTemp != lThread)
                break;
            long lTimeStart = System.currentTimeMillis();
            System.out.println("run");
            repaint(0, 0, lWidth, lHeight);
            serviceRepaints();
            long lTimeTaken = System.currentTimeMillis() - lTimeStart;
            if(lTimeTaken < (long)60)
                try
                {
                    synchronized(this)
                    {
                        Thread.sleep((long)60 - lTimeTaken);
                    }
                }
                catch(InterruptedException e)
                {
                    System.out.println("error=".concat(String.valueOf(String.valueOf(e))));
                }
        } while(true);
    }


    public void paint(Graphics g)
    {
        lCanvas.paint(g);
        System.out.println("paint");
    }

    public void keyPressed(int iKeyCode)
    {
        int _tmp = Stage;
        lCanvas.keyPressed(iKeyCode);
    }

    public void keyReleased(int iKeyCode)
    {
        lCanvas.keyReleased(iKeyCode);
    }

    static int rand_no(int iRange)
    {
        int r = rand.nextInt() % iRange;
        if(r < 0)
            r = -r;
        return r;
    }

    public void NewGame()
    {
        start();
        lCanvas.InitStage(1);
    }

    public void UI_Newgame()
    {
        NewGame();
    }

    public void UI_Title()
    {
        start();
        lCanvas.reset();
    }

    public void UI_Game()
    {
        start();
    }

    public void menu()
    {
        lMidlet.ToNokiaUI();
        stop();
    }

    public void pause_menu()
    {
        lMidlet.ToNokiaUI_Pause();
        stop();
    }

    public int getCanvas()
    {
        return lCanvas.showtitle;
    }

    public void ExitGame()
    {
        lMidlet.QuitGame();
    }

    private void Execute()
    {
        int _tmp = Stage;
    }

    public static int Stage;
    public static final int Stage_Loading = 0;
    public static final int Stage_Logo = 10;
    public static final int Stage_Play = 50;
    private static final int up = -1;
    private static final int down = -2;
    private static final int left = -3;
    private static final int right = -4;
    private static final int center = -5;
    private static final int left_key = -6;
    private static final int right_key = -7;
    private static final int num_up = 50;
    private static final int num_down = 56;
    private static final int num_left = 52;
    private static final int num_right = 54;
    private static final Random rand = new Random(System.currentTimeMillis());
    private Thread lThread;
    private RollerMIDlet lMidlet;
    private RollerCanvas lCanvas;
    private GameRecord lRecord;
    public GameEffect m_pEffect;
    private static final int NO_SAVEDATA = 4;
    private static final int LENGTH_SAVEDATA = 40;
    public static int lWidth;
    public static int lHeight;
    private static String RecordValue;
    public boolean m_bSoundOn;
    public boolean m_bVibrationOn;
    public int m_iTopScore;
    int showsplash;
    int maxsprite;
    Image sprite[];


}

从截取代码来看 ,这个游戏的框架更为清晰,更便于修改。

       总结就是
      
各个单元分别是1个单独的类!

每个类都拥有自己的初始化内容和按键控制

由一个主类控制(RollerLogic),此类也是游戏循环的动力。

显示部分交给Midlet(RollerMIDlet)。

 

这种方法可以方便的把低级UI和高级UI结合使用,虽然用不到1张图中,但交替使用效果也不错。
唯一的不足是类太多,占用了不必要的空间。

(出处:http://www.VeVb.com)



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表