当前位置: 编程技术>移动开发
本页文章导读:
▪鸟哥,射击游戏技术分享三 鸟哥,射击游戏技术分享3
参见游戏图片和视频
四、背景滚动
首先背景图片做得可以上下连接(上下滚动),就是画一张图片,下面接着画,或者上面接着画,看起来都是无缝的。然后程序上.........
▪ 更新游戏画面时线程的有关问题 更新游戏画面时线程的问题
作者daytodaymehttp://www.iteye.com/topic/435147调用Handler.post(Runnable r)方法,Runnable运行在UI所在线程,所以可以直接调用View.invalidate()引用package com.ray.test; import android.app.........
▪ 一些记号贴(不完整仅进入门) 一些记号贴(不完整仅入入门)
Intent的常见用法原帖http://rayleung.iteye.com/blog/434005利用Bundle实现Android Activity间消息的传递http://www.iteye.com/topic/424491Android Services使用示例http://www.iteye.com/topic/5685.........
[1]鸟哥,射击游戏技术分享三
来源: 互联网 发布时间: 2014-02-18
鸟哥,射击游戏技术分享3
呵呵,大家一起努力才成
这编辑器是规范怪物的路线,几时发射。把这些写到文档,游戏再读取出来,把这些怪生成。这个帖子有介绍的,你再细看看。
是的。多看几次可能更清楚一些,ls的好像在mobile market的技术论坛也有这个ntop id哦?
游戏其实可以归为两个方面:
更新画面,
处理输入。
鸟哥哥,能不能推荐几本书看看啊,感觉这些东西从来都没见过,也没听过,书上好像也没怎么写过。
鸟哥哥,能不能推荐几本书看看啊,感觉这些东西从来都没见过,也没听过,书上好像也没怎么写过。
《手机游戏开发全书》有一些介绍。
动编原理,地编原理,遮掩算法,脚本系统
都有提到。
如果有很多真机,做做移植
遇到问题,就得去修改代码,调优代码,所谓的实战
这些东西学的东西就更多,书基本上也写不出来。
找书之前可以看看这些:
动编,有个叫motionwelder,看看它的demo,猴子吃香蕉的最最有名,除在图片使用上太粗放了,个人认为它的按键处理,游戏架构都是世界级的。
地编,有个叫tiled的开源优秀地编,入门最简单的要数mapwin了。
脚本系统,这个在j2me里,最好别使用人家啥的系统了,最好自己做一个。
鸟哥哥,能不能推荐几本书看看啊,感觉这些东西从来都没见过,也没听过,书上好像也没怎么写过。
《手机游戏开发全书》有一些介绍。
动编原理,地编原理,遮掩算法,脚本系统
都有提到。
如果有很多真机,做做移植
遇到问题,就得去修改代码,调优代码,所谓的实战
这些东西学的东西就更多,书基本上也写不出来。
找书之前可以看看这些:
动编,有个叫motionwelder,看看它的demo,猴子吃香蕉的最最有名,除在图片使用上太粗放了,个人认为它的按键处理,游戏架构都是世界级的。
地编,有个叫tiled的开源优秀地编,入门最简单的要数mapwin了。
脚本系统,这个在j2me里,最好别使用人家啥的系统了,最好自己做一个。
哦,这样我就算入门了,谢谢鸟哥啊,你的那个小鸟真可爱!
参见游戏图片和视频
四、背景滚动
首先背景图片做得可以上下连接(上下滚动),就是画一张图片,下面接着画,或者上面接着画,看起来都是无缝的。然后程序上的处理:计一个变量go值,每桢go += add;add为滚动速度(向上为负值,向下为正值)程序上为向下滚动,这样看起来人就在前进了
go += add; int heights = 0; int drawY = 0; heights = one.getHeight();//图片高度
drawY = (go >> 2) % one.getHeight();//之前是还有云层什么的, //最底下>>2,第二层>>1的,以控制各层不同速度。后来因为内存不够用,砍层了,>>2就一直没变 if(drawY - Datas.height < 0)//Datas.height为屏幕高度,如果发现起始画点在屏幕中,则多画一张 {//达到遮盖目的 g.drawImage(one, 0, drawY, 20);//one是图片Image对象,xy坐标,20是anchor,鸟哥发现有好些人不是用20,用0的 //经过测试发现0与20其实结果是一样的 } g.drawImage(one, 0, drawY - heights, 20);
五、怪物生成
有些游戏根据坐标,有些游戏根据时间,有些写死,有些随机。本游戏根据时间。
为了确保效果,做了个简单的怪物编辑器,由策划自己编辑:
坐标编辑:
两者结合,策划方便地看到怪运动轨迹。第几秒出现什么线路的怪,啥等级的。都有明确显示。
编辑器上一些描述:
public static String[][][] traces = { {//蝙蝠: {//从上向下飞 "飞行速度a1,到达屏幕上方1/4的时候,发射一颗瞄准子弹,子弹速度b1", "飞行速度a2,到达屏幕上方1/4的时候,发射一颗瞄准子弹,子弹速度b2", "飞行速度a1,到达屏幕上方1/4的时候,发射三颗散弹,子弹速度c1", "飞行速度a2,到达屏幕上方1/4的时候,发射三颗散弹,子弹速度c1"}, {//路线2:...}, {//路线3:抛物线(从右到左) .... }, {//路线4:飞向屏幕(120,240)这一点,速度较快 "无子弹", "刚出屏幕的时候发射一颗瞄准弹(瞄准主角),速度要比自身快" } } , {//刺客: ... }, ............ }; public static String[][] tracesDescription = { {//蝙蝠: "从上向下飞", "路线3:抛物线(从左到右)", "路线3:抛物线(从右到左)", "路线4:飞向屏幕(120,240)这一点,速度较快" }, {//刺客: ... }, {//枪手: ........... {//将军: "路线1:从上往下,到屏幕四分之一出停留一段时间,发弹,离开" }, {//巨兽: "路线1:从上往下" } };
看看这些ai描述,大部分是以屏幕或者时间为参考的,这样,移植不同屏幕的机型时就不用修改了。
用netbeans开发,很快拉出来两个界面。
95;311w-W,h+H//95:第几秒出现;3:怪的id;1:怪的等级;1:怪的线路.最后为出现坐标 94;001w>1+W,-H 94;001w>1-W,-H 93;001w>1,-H-H 93;001w>1-W,-H 93;001w>1+W,-H 90;131w+W,H 86;101-W,-H 86;111w+W,-H 86;211-W,H 84;001w>1+W,-H 84;001w>1-W,-H 83;201w>1,-H 80;301W,h+H 80;131w+W,H 80;201w>1-W-W,-H 80;201w>1+W+W,-H 78;001w>1,-H-H 78;001w>1-W,-H 78;001w>1+W,-H 76;211-W,H 75;401w>1-W,-H 75;401w>1+W,-H 74;001w>1+W,-H 74;001w>1-W,-H 74;311w-W,h+H 70;131w+W,H 70;501w>1,-H 68;201w>1,-H 66;101-W,-H 66;111w+W,-H 66;211-W,H 64;001w>1+W,-H 64;001w>1-W,-H 63;301W,h+H 63;001w>1,-H-H 63;001w>1-W,-H 63;001w>1+W,-H 60;131w+W,H 56;121-W,H 54;001w>1+W,-H 54;001w>1-W,-H 53;201w>1,-H 53;311w-W,h+H 50;131w+W,H 50;401w>1-W,-H 50;401w>1+W,-H 48;001w>1,-H-H 48;001w>1-W,-H 48;001w>1+W,-H 46;101-W,-H 46;111w+W,-H 46;301W,h+H 46;121-W,H 44;001w>1+W,-H 44;001w>1-W,-H 40;201w>1-W-W,-H 40;201w>1+W+W,-H 38;201w>1,-H 36;121-W,H 35;501w>1,-H 34;001w>1+W,-H 34;001w>1-W,-H 33;001w>1,-H-H 33;011-W,-H 33;021w+W,-H 32;311w-W,h+H 30;131w+W,H 28;002w>1,-H 26;101-W-W,-H 26;111w+W+W,-H 26;121-W,H 25;401w>1,-H 24;201w>1+W+W,-H 24;201w>1-W-W,-H 23;201w>1,-H 20;131w+W,H 18;002w>1,-H-H 18;021w+W,-H 18;011-W,-H 14;001w>1+W,-H 14;001w>1-W,-H 12;301W,h+H 11;311w-W,h+H 10;131w+W,H 8;321w>1,-H 6;101-W-W,-H 6;111w+W+W,-H 4;111w+W+W,-H 4;101-W-W,-H 3;201w>1,-H-H 3;001w>1-W,-H 3;001w>1+W,-H
w,h为手机屏幕宽高,W,H为怪身体的宽高。>1表示向右移等。游戏会解析这些坐标值,得到具体坐标数据。
它们都是以屏幕,或者自己做参考,这样不同手机屏幕移植一样有好处。
六、切图介绍
为了提高速度,游戏中的画图全部没有用到旋转,翻转。游戏本身决定。切图也没有用动编了。如下图:
美术给出对应的坐标,用drawRegion搞定:
也没什么人气,javaeye里j2me关注度本身就小。技术分享就到这里吧。鸟哥,感谢有关注的网友!
8 楼
鸟哥哥
2010-03-20
呵呵,谢谢nypisces大哥指点!!
9 楼
nypisces
2010-03-20
不管图片存储大小是多大,除bmp外,png,jpg都是经过压缩的
在屏幕上重绘的时候,都是载入内存,无压缩的格式
图片占用的内存,是整个游戏中的大头
开发的时候,应该让策划计算并控制每关的最大内存
计算公式就是 图片面积 x 色深,合理安排出什么大小,出几种怪,在哪些点需要释放资源
这个我觉得对所有手机开发者都需要知道的知识
在屏幕上重绘的时候,都是载入内存,无压缩的格式
图片占用的内存,是整个游戏中的大头
开发的时候,应该让策划计算并控制每关的最大内存
计算公式就是 图片面积 x 色深,合理安排出什么大小,出几种怪,在哪些点需要释放资源
这个我觉得对所有手机开发者都需要知道的知识
10 楼
cabinw
2010-03-23
非常好的教程,希望楼主坚持,其实现在J2ME的开发者一直非常多,只是Javaeye上没有太多关注,不过内容都很精致
11 楼
鸟哥哥
2010-03-23
cabinw 写道
非常好的教程,希望楼主坚持,其实现在J2ME的开发者一直非常多,只是Javaeye上没有太多关注,不过内容都很精致
呵呵,大家一起努力才成
12 楼
luoyahu
2010-03-25
学习了...
13 楼
6leaf
2010-03-25
非常棒!支持!!!
大家一起努力,发扬光大!
大家一起努力,发扬光大!
14 楼
ntop
2010-06-28
鸟大哥能不能说说怪物编辑器是怎么用的啊?初学飞行射击游戏不太懂,还有生成的那个文件在程序中是怎么使用的?
15 楼
鸟哥哥
2010-06-28
ntop 写道
鸟大哥能不能说说怪物编辑器是怎么用的啊?初学飞行射击游戏不太懂,还有生成的那个文件在程序中是怎么使用的?
这编辑器是规范怪物的路线,几时发射。把这些写到文档,游戏再读取出来,把这些怪生成。这个帖子有介绍的,你再细看看。
16 楼
ntop
2010-06-28
鸟大哥真是急人所急啊,又看了一遍懂了些。生成的文件,记录了每个怪出现的时间,等级,路线等等。在主程序中用一个大的数组将这些信息读取出来保存在数组中,然后根据时间来生成对应的怪(和相关的等级,路线等属性)这样理解应该对了吧?
17 楼
鸟哥哥
2010-06-29
ntop 写道
鸟大哥真是急人所急啊,又看了一遍懂了些。生成的文件,记录了每个怪出现的时间,等级,路线等等。在主程序中用一个大的数组将这些信息读取出来保存在数组中,然后根据时间来生成对应的怪(和相关的等级,路线等属性)这样理解应该对了吧?
是的。多看几次可能更清楚一些,ls的好像在mobile market的技术论坛也有这个ntop id哦?
18 楼
ntop
2010-06-29
是的,我只会编写软件。编写游戏一直是我的一个梦想,但是。。。。就是不会编,晕!!!暑假时间想好好学学编一款游戏。
19 楼
鸟哥哥
2010-06-29
ntop 写道
是的,我只会编写软件。编写游戏一直是我的一个梦想,但是。。。。就是不会编,晕!!!暑假时间想好好学学编一款游戏。
游戏其实可以归为两个方面:
更新画面,
处理输入。
20 楼
zovikoo
2010-06-30
其实,很多时候策划给的都是脚本,也就是存储整个游戏元素的各种必要值,比如说地图脚本,或者怪物脚本,第几关第几小节什么时间出什么怪,还有关卡脚本、对白脚本等等,这样开发的话策划想改什么直接改脚本,程序只需要写一个配套的读脚本的方法,然后把各种属性都读出来就可以了。
当然了,脚本的格式你和策划定。
当然了,脚本的格式你和策划定。
21 楼
zovikoo
2010-06-30
<div >鸟哥哥 写道</div>
<div >
<div >ntop 写道</div>
<div >是的,我只会编写软件。编写游戏一直是我的一个梦想,但是。。。。就是不会编,晕!!!暑假时间想好好学学编一款游戏。</div>
<br>游戏其实可以归为两个方面: <br>更新画面, <br>处理输入。 <br>
</div>
<p><br><br>鸟哥很笼统``````` <br></p>
<p> </p>
<pre name="code" >long startTime = 0;
long timeTaken = 0;
public void run()
{
while (isStart)
{
startTime = System.currentTimeMillis();
update(); //操作处理
repaint(); //刷新画面
timeTaken = System.currentTimeMillis() - startTime;
if(timeTaken < 1000 / Constant.FPS)
{
try
{
Thread.sleep(1000 / Constant.FPS - timeTaken);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}</pre>
<p> </p>
<div >
<div >ntop 写道</div>
<div >是的,我只会编写软件。编写游戏一直是我的一个梦想,但是。。。。就是不会编,晕!!!暑假时间想好好学学编一款游戏。</div>
<br>游戏其实可以归为两个方面: <br>更新画面, <br>处理输入。 <br>
</div>
<p><br><br>鸟哥很笼统``````` <br></p>
<p> </p>
<pre name="code" >long startTime = 0;
long timeTaken = 0;
public void run()
{
while (isStart)
{
startTime = System.currentTimeMillis();
update(); //操作处理
repaint(); //刷新画面
timeTaken = System.currentTimeMillis() - startTime;
if(timeTaken < 1000 / Constant.FPS)
{
try
{
Thread.sleep(1000 / Constant.FPS - timeTaken);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}</pre>
<p> </p>
22 楼
hyde2009
2010-07-01
来观摩学习了.
23 楼
ntop
2010-07-03
<div >zovikoo 写道</div>
<div >
<div >鸟哥哥 写道</div>
<div >
<div >ntop 写道</div>
<div >是的,我只会编写软件。编写游戏一直是我的一个梦想,但是。。。。就是不会编,晕!!!暑假时间想好好学学编一款游戏。</div>
<br>游戏其实可以归为两个方面: <br>更新画面, <br>处理输入。 <br>
</div>
<p><br><br>鸟哥很笼统```````</p>
<p> </p>
<pre name="code" >long startTime = 0;
long timeTaken = 0;
public void run()
{
while (isStart)
{
startTime = System.currentTimeMillis();
update(); //操作处理
repaint(); //刷新画面
timeTaken = System.currentTimeMillis() - startTime;
if(timeTaken < 1000 / Constant.FPS)
{
try
{
Thread.sleep(1000 / Constant.FPS - timeTaken);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}</pre>
<pre name="code" >恩,楼主说的是RPG吧,我也很想学习RPG游戏的制作方法,有空的时候楼主也分享下RPG的技术吧!</pre>
<pre name="code" >谢谢啦!!</pre>
<pre name="code" >
</pre>
<p> </p>
</div>
<p> </p>
<div >
<div >鸟哥哥 写道</div>
<div >
<div >ntop 写道</div>
<div >是的,我只会编写软件。编写游戏一直是我的一个梦想,但是。。。。就是不会编,晕!!!暑假时间想好好学学编一款游戏。</div>
<br>游戏其实可以归为两个方面: <br>更新画面, <br>处理输入。 <br>
</div>
<p><br><br>鸟哥很笼统```````</p>
<p> </p>
<pre name="code" >long startTime = 0;
long timeTaken = 0;
public void run()
{
while (isStart)
{
startTime = System.currentTimeMillis();
update(); //操作处理
repaint(); //刷新画面
timeTaken = System.currentTimeMillis() - startTime;
if(timeTaken < 1000 / Constant.FPS)
{
try
{
Thread.sleep(1000 / Constant.FPS - timeTaken);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}</pre>
<pre name="code" >恩,楼主说的是RPG吧,我也很想学习RPG游戏的制作方法,有空的时候楼主也分享下RPG的技术吧!</pre>
<pre name="code" >谢谢啦!!</pre>
<pre name="code" >
</pre>
<p> </p>
</div>
<p> </p>
24 楼
鸟哥哥
2010-07-04
我这边上个月刚完成一个rpg引擎,rpg上的东西很多,要是写blog的话,不知道要写多少。一旦写得不清楚,引起很多人问或者讨论,鸟哥应付不来。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
25 楼
ntop
2010-07-14
鸟哥哥 写道
我这边上个月刚完成一个rpg引擎,rpg上的东西很多,要是写blog的话,不知道要写多少。一旦写得不清楚,引起很多人问或者讨论,鸟哥应付不来。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
鸟哥哥,能不能推荐几本书看看啊,感觉这些东西从来都没见过,也没听过,书上好像也没怎么写过。
26 楼
鸟哥哥
2010-07-14
ntop 写道
鸟哥哥 写道
我这边上个月刚完成一个rpg引擎,rpg上的东西很多,要是写blog的话,不知道要写多少。一旦写得不清楚,引起很多人问或者讨论,鸟哥应付不来。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
鸟哥哥,能不能推荐几本书看看啊,感觉这些东西从来都没见过,也没听过,书上好像也没怎么写过。
《手机游戏开发全书》有一些介绍。
动编原理,地编原理,遮掩算法,脚本系统
都有提到。
如果有很多真机,做做移植
遇到问题,就得去修改代码,调优代码,所谓的实战
这些东西学的东西就更多,书基本上也写不出来。
找书之前可以看看这些:
动编,有个叫motionwelder,看看它的demo,猴子吃香蕉的最最有名,除在图片使用上太粗放了,个人认为它的按键处理,游戏架构都是世界级的。
地编,有个叫tiled的开源优秀地编,入门最简单的要数mapwin了。
脚本系统,这个在j2me里,最好别使用人家啥的系统了,最好自己做一个。
27 楼
ntop
2010-07-17
鸟哥哥 写道
ntop 写道
鸟哥哥 写道
我这边上个月刚完成一个rpg引擎,rpg上的东西很多,要是写blog的话,不知道要写多少。一旦写得不清楚,引起很多人问或者讨论,鸟哥应付不来。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
简单提几个吧:动编原理,地编原理,卡马克算法,遮掩算法,脚本系统。
鸟哥哥,能不能推荐几本书看看啊,感觉这些东西从来都没见过,也没听过,书上好像也没怎么写过。
《手机游戏开发全书》有一些介绍。
动编原理,地编原理,遮掩算法,脚本系统
都有提到。
如果有很多真机,做做移植
遇到问题,就得去修改代码,调优代码,所谓的实战
这些东西学的东西就更多,书基本上也写不出来。
找书之前可以看看这些:
动编,有个叫motionwelder,看看它的demo,猴子吃香蕉的最最有名,除在图片使用上太粗放了,个人认为它的按键处理,游戏架构都是世界级的。
地编,有个叫tiled的开源优秀地编,入门最简单的要数mapwin了。
脚本系统,这个在j2me里,最好别使用人家啥的系统了,最好自己做一个。
哦,这样我就算入门了,谢谢鸟哥啊,你的那个小鸟真可爱!
[2] 更新游戏画面时线程的有关问题
来源: 互联网 发布时间: 2014-02-18
更新游戏画面时线程的问题
作者daytodayme
http://www.iteye.com/topic/435147
调用Handler.post(Runnable r)方法,Runnable运行在UI所在线程,所以可以直接调用View.invalidate()
在新线程里更新UI,可以直接postInvalidate()
作者daytodayme
http://www.iteye.com/topic/435147
调用Handler.post(Runnable r)方法,Runnable运行在UI所在线程,所以可以直接调用View.invalidate()
引用
package com.ray.test;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
public class TestHandler extends Activity {
private MyView myView;
private Handler mHandler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView = new MyView(this);
mHandler = new Handler();
mHandler.post(new Runnable(){
@Override
public void run() {
myView.invalidate();
mHandler.postDelayed(this, 5);
}
});
setContentView(myView);
}
class MyView extends View{
private float x = 0f;
public MyView(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
x+=1;
Paint mPaint = new Paint();
mPaint.setColor(Color.BLUE);
canvas.drawRect(x, 40, x+40, 80, mPaint);
}
}
}
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
public class TestHandler extends Activity {
private MyView myView;
private Handler mHandler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView = new MyView(this);
mHandler = new Handler();
mHandler.post(new Runnable(){
@Override
public void run() {
myView.invalidate();
mHandler.postDelayed(this, 5);
}
});
setContentView(myView);
}
class MyView extends View{
private float x = 0f;
public MyView(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
x+=1;
Paint mPaint = new Paint();
mPaint.setColor(Color.BLUE);
canvas.drawRect(x, 40, x+40, 80, mPaint);
}
}
}
在新线程里更新UI,可以直接postInvalidate()
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); myView = new MyView(this); this.setContentView(this.myView); new Thread(new myThread()).start(); } class myThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { try { myView.postInvalidate(); Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } }
[3] 一些记号贴(不完整仅进入门)
来源: 互联网 发布时间: 2014-02-18
一些记号贴(不完整仅入入门)
Intent的常见用法
原帖
http://rayleung.iteye.com/blog/434005
利用Bundle实现Android Activity间消息的传递
http://www.iteye.com/topic/424491
Android Services使用示例
http://www.iteye.com/topic/568547
android 传感器
http://www.iteye.com/topic/592409
http://code.google.com/p/openintents/wiki/SensorSimulator
协作开发SVN
http://blog.csdn.net/bluesmile979/archive/2009/01/06/3719511.aspx
Intent的常见用法
原帖
http://rayleung.iteye.com/blog/434005
利用Bundle实现Android Activity间消息的传递
http://www.iteye.com/topic/424491
Android Services使用示例
http://www.iteye.com/topic/568547
android 传感器
http://www.iteye.com/topic/592409
http://code.google.com/p/openintents/wiki/SensorSimulator
协作开发SVN
http://blog.csdn.net/bluesmile979/archive/2009/01/06/3719511.aspx
最新技术文章: