找回密码
 注册
搜索
查看: 2199|回复: 18

[讨论] 游戏开发经典方法探讨

[复制链接]
发表于 2009-9-12 13:11:24 | 显示全部楼层 |阅读模式
贪吃蛇, 打开了手机游戏的先河。 是NOKIA公司在发展手机游戏上的一次成功尝试。让手机游戏玩家们爱不释手,引起了手机游戏的开发风暴,各个手机厂商纷纷加入这个阵营。手机游戏开发从此拉开了序幕。Android, Ophone OS作为手机开发的后起之秀, 肯定不会错过这份蛋糕的分享。它不仅解决了以住手机游戏的不足(屏幕分辨率小, 内存少)的毛病。而且还在手机游戏软件开发上提供更全, 更新的API ,更大的内存, 而且还可以用JAVA的泛形, 提高他的开发速度。 现在我们就以ANDROID SDK 里面自带的贪吃蛇作为例子, 去看看这个贪吃蛇是怎么去开发。
   开发过手机游戏的人就知道手机开发的三要素: 画布(用来绘画游戏的画面)键盘事件,实时刷新。 我们知道一般的游戏画面都是由地图, 精灵(由游戏的主角,怪物组成), 那我们现在就看看贪吃蛇是怎样他的地图的:
一、实现游戏的界面 :
1、  先声明用来存放绘画图像的X,Y轴的位置的数组:
private int[][] mTileGrid;//
/***************
Tileindex 图片的索引
X轴的位置:
Y轴的位置:
    **************/
2、 编写存放图片索引用图片的X,Y轴位置;
public void setTile(int tileindex, int x, int y) {
        mTileGrid[x][y] = tileindex;
}

3、调用以上的方法以循环的方式位置数组赋值以及图片的索引,
private void updateWalls() {

        for (int x = 0; x < mXTileCount; x++) {
            setTile(GREEN_STAR, x, 0);//设置顶部的界线的位置
            setTile(GREEN_STAR, x, mYTileCount - 1);// 设置底部界线的
        }
        for (int y = 1; y < mYTileCount - 1; y++) {
            setTile(GREEN_STAR, 0, y);/设置左边的界线的位置

            setTile(GREEN_STAR, mXTileCount - 1, y);/设置右边的界线的位置

        }
}
4、重写VIEW 类里面的方法。 把界线画出。
public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int x = 0; x < mXTileCount; x += 1) {
            for (int y = 0; y < mYTileCount; y += 1) {
                if (mTileGrid[x][y] > 0) {
                    canvas.drawBitmap(mTileArray[mTileGrid[x][y]],
                                    mXOffset + x * mTileSize,
                                    mYOffset + y * mTileSize,
                                    mPaint);
                }
            }
   
                  



同上可见: 地图其实就是由图片数组拼直面成的。 面图片又是通过他的图片索引找到,并在mTileGrid[x][y],获取他们的位置索引来确定图片的位置。 这样在一个手机的页面就形成了,简单吧。
苹果的位置就是更简单了,他是随机生成的, 而且必须在现在蛇的位置相对远距离:
看看他的代码:
private void addRandomApple() {
        Coordinate newCoord = null;
        boolean found = false;
        while (!found) {        //
            // Choose a new location for our apple
// 随机生成新的X,Y位置
            int newX = 1 + RNG.nextInt(mXTileCount - 2);
            int newY = 1 + RNG.nextInt(mYTileCount - 2);
            newCoord = new Coordinate(newX, newY);

                     boolean collision = false;
            int snakelength = mSnakeTrail.size();
            for (int index = 0; index < snakelength; index++) {
//      检查一下是存放的位置是否合理流
                if (mSnakeTrail.get(index).equals(newCoord)) {
                    collision = true;
                }
            }
        
            found = !collision;
        }
        if (newCoord == null) {
            Log.e(TAG, "Somehow ended up with a null newCoord!");
        }
        mAppleList.add(newCoord);// 添加到新苹果的列表中,
    }
实现键盘事件:
          键盘主要起操作作用, 在任何的手机游戏中键盘都是起重要的用,要本游戏中, 他就是起控制蛇的行走方向: 现在我们分析他的代码:
        if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
            if (mDirection != NORTH) {
                mNextDirection = SOUTH;
            }
            return (true);
        }

        if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
            if (mDirection != EAST) {
                mNextDirection = WEST;
            }
            return (true);
        }

        if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
            if (mDirection != WEST) {
                mNextDirection = EAST;
            }
            return (true);
        }
以上的代码大家一看就明白, 就是通过判断那个键按下, 然后再给要走的方向(mDirection)赋值。
以下的代码就是通
    switch (mDirection) {
        case EAST: {
            newHead = new Coordinate(head.x + 1, head.y);
            break;
        }
        case WEST: {
            newHead = new Coordinate(head.x - 1, head.y);
            break;
        }
        case NORTH: {
            newHead = new Coordinate(head.x, head.y - 1);
            break;
        }
        case SOUTH: {
            newHead = new Coordinate(head.x, head.y + 1);
            break;
        }
        
从以上的键盘代码我们可以看得出,程序中是通过触发来改变坐标(+1,-1)的方式来改蛇头的方向, 可见坐标在游戏编程中的作用, 这个也是根据手机的屏幕是点阵的方式来显示, 所以坐标就是一个定位器。 在这里大家可能还有一个疑问。 就是就这个蛇什么能够以“7”字形来移动行走, 其实我们稍微仔细观察一下就知道了,在这里面, 他们也是通过坐标的传递来实现的, 只要把头部的坐标点依次赋给下一个点, 后面的每一个点都走过了头部所走过的点,而蛇的头部就是负责去获取坐标,整个蛇的行走起来就很自然和连贯。  坐标的方向变换又是通过判断那个方向按键的按下来改变的, 这样一来, 键盘的作用就发挥出来了。
蛇吃苹果又是怎样去实现?上面我所说到的坐标就起了作用。在蛇所经过的每一个坐标, 他们都要在苹果所在的(ArrayList<Coordinate> mAppleList = new ArrayList<Coordinate>())坐标集里面集依次判断,若是坐标相同,那个这个苹果就被蛇吃了 。
刷新:
      在J2ME中,刷新都是在canvas中通过调用线程结合repaint()来刷新, 他们使线程不断去循环,去调用canvas, 笔者在android 入门时也曾经想用J2ME的模式用在android 中,结果报异常了, 为什么呢? 很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同: Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。所以在以前JAVA 里面能使用的模式, 可能在android 里面用不起来 。在自带的例子里面他是通过消息的机制来刷新的。而在android的消定义比较广泛, 比如,手机的暂停, 启动, 来电话、短信,键盘按下,弹起都是一个消息。总的来说, 事件就是消息;只要继承Handler类就可以对消息进行控制,或者处理, 根据具体情况进行具体处理:
class RefreshHandler extends Handler {
//响应消息。
        public void handleMessage(Message msg) {
            SnakeView.this.update();// 重要页面
            SnakeView.this.invalidate();刷新页面
        }
// 向外提供人工的调用消息的接口,
        public void sleep(long delayMillis) {
                this.removeMessages(0);//注消消息
// 添加消息,
            sendMessageDelayed(obtainMessage(0), delayMillis);
            
        }
刷新就是这样简单的实现了。 所开发出的游戏也是挺简单。

        最近我关注到,中国移动推出了Ophone手机,Ophone 手机兼容Android的所有应用,你开发的Android软件和游戏,很容易的就可以移植到Ophone手机上来。目前中国移动用户已经超过6.8亿,中国移动如果在这6.8个亿的市场里,推广Ophone手机,赚钱的机会可想而知。
        现在,国内手机上网的用户突破8000万,2007年,中国手机游戏市场运营收入达到1。5亿元,成为继互联网企业之后又一就业热点,2008年手机网游仍将高速增长。随着3G的发展,到2009年底手机游戏市场规模可以达到16亿元,而以往的手机游戏市场都被一些有经济实力的游戏公司或者SP来运营, 对于我们技术人员只能是望洋兴叹了。Android 和Ophone OS在开发游戏方面更加简单便捷。 而中国移动推出mmarket手机软件商店 平台,提供了一个全新的模式,未来很有可能代替SP的地位,不管你是个人和还是公司,人人都可以参与的。
Android官网:http://www.android.com。开发经验交流内容不少。
Ophone官网:http://www.ophonesdn.com 。上面的开发指导内容不错。网站上好像正在举行发帖赢Ophone手机活动。有机会体验一下Ophone手机也不错。
发表于 2009-9-15 16:59:48 | 显示全部楼层
不错不错,收藏下[em05]
点评回复

使用道具 举报

发表于 2009-9-16 17:52:10 | 显示全部楼层
挺好,是的,地图在手机游戏里面的确是很重要, 上面所说的只一部分, 还是一个是图层跟方格收了
点评回复

使用道具 举报

发表于 2009-9-17 12:20:59 | 显示全部楼层
不错啊。收藏。
点评回复

使用道具 举报

发表于 2009-9-20 12:06:04 | 显示全部楼层
上面只讲了ANDROID 的消息机制, 不知道他的线程是什么调用
点评回复

使用道具 举报

发表于 2009-9-23 14:40:20 | 显示全部楼层
[em01][em01][em01][em01][em01][em01][em01][em01]
点评回复

使用道具 举报

发表于 2009-9-24 21:41:07 | 显示全部楼层
上面报说的这里在ophone的技术开发网http://www.ophonesdn.com/  里面都有详细介绍, 多在上面走走就就行了
点评回复

使用道具 举报

发表于 2009-9-26 16:06:33 | 显示全部楼层
跟移动签约每月按时发工资???[em04]
点评回复

使用道具 举报

发表于 2009-9-30 12:23:45 | 显示全部楼层
不知道,没签约。我想先指着老板给我涨工资呢。[em05]
点评回复

使用道具 举报

发表于 2009-9-30 15:09:34 | 显示全部楼层
这个收藏先[em02]
点评回复

使用道具 举报

发表于 2009-10-6 17:41:40 | 显示全部楼层
AD被ophone兼容?那么说,代码简单的变形一下就能用了??感觉他们网站还是有点技术含量。起码提供的技术文档,按着方法试了试。http://www.ophonesdn.com/forum/forum.do。OPhone开发文档都很全面,对我刚接触这个平台的时候,所碰到的问题,在线专业工程师都能够给我解答。
这游戏必须是最经典的。在我的手机里生存了很多年。[em12][em13][em14]
点评回复

使用道具 举报

发表于 2009-10-8 11:54:54 | 显示全部楼层
曾经手机必备的游戏。就是没玩通关过。[em14][em14]
点评回复

使用道具 举报

发表于 2009-10-12 12:10:29 | 显示全部楼层
研发个3D版的贪吃蛇不赖。
点评回复

使用道具 举报

发表于 2009-10-13 13:25:09 | 显示全部楼层
3D,做你大头梦去吧。IPHONE不见得能跑起来。
点评回复

使用道具 举报

发表于 2009-10-16 14:51:38 | 显示全部楼层
就算跑起来了,iphone的蓄电量实在是不怎么强。你也玩不了多久,
点评回复

使用道具 举报

发表于 2009-10-19 17:23:53 | 显示全部楼层
个人认为,PC转移动还是很有可实行的。Android和ophoneOS都是基于程序员较为熟悉的linux平台开发的。所以我觉得移植到AD还是OS,都是具有可实行的。[em04]
点评回复

使用道具 举报

发表于 2009-10-22 14:58:41 | 显示全部楼层
移动市场开发越来越成混沌成型。国内ophoneOS 国外ANDROID,让我们更加关注移动市场。手游一定会火。
点评回复

使用道具 举报

发表于 2009-10-24 22:05:44 | 显示全部楼层
辛苦。还不错,这个对于新手具有一定的帮主,移动市场的趋势流行化,让我们更加关注移植方面的技术问题。[em04]
点评回复

使用道具 举报

发表于 2009-10-25 09:33:02 | 显示全部楼层
新手[em02]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-23 08:32 , Processed in 0.050504 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表