佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: sson

手机 Java 游戏开发

[复制链接]
 楼主| 发表于 22-1-2006 02:02 PM | 显示全部楼层

原帖由 Ppsprov 于 20-1-2006 09:38 PM 发表

ENEMY AI 已经搞定了。。。。只是放它们在random location和random move,算是AI了吧???呵呵呵呵。。。

现在面对的问题是collision 的问题。相信J2ME的game 全都是用array map的。现在我想要使我的P ...

对不起,这两天没有上来,看来你已经解决了。
呵呵,可以走动就算是 AI 了。


不过小章鱼不是很明白你要的 collision detect。
你是要 player 物体和 platform 间的碰撞,还是要和 enemies 间的碰撞?
如果是 enemies 的,一般为求速度,我们都会使用圆来计算。
如果是和 platform 间的,那么只要取地图二维树里的资料然后判断就行了。
反正你是 tile based 的。

相信J2ME的game 全都是用array map的
这句小章鱼也不是很理解,
其实任何游戏的架构都是用 array 了,尤其是 2D 游戏
在为优化,有时候才会用叉树吧?不过叉树其实也是 array 对吧?
尤其是你目前是 tile based 的,2D 的 array 当然是少不得。

原帖由 Ppsprov 于 22-1-2006 01:31 AM 发表
顺带一提。。。tilemap collision 问题也解决了。
只要再放一个tilelayer append 在original map 就行了。

你说的 tilelayer 是?是一个 2D array ?
不明白为何需要多余的 2D array
在建立地图时就应该已经有个 2D array 了。
所以和 platform 间的碰撞应该时不需要额外的 2D array 了。


方便为小章鱼讲一讲你的游戏类型和架构吗?
担心小章鱼误会了,谢谢。


天玄路 是的,一般小章鱼都是自己画的(当然都是非常简单的)
其实也不一定要画得华丽吧?
方正做的都是一些小型、休闲的游戏,只要画面舒适不就好了?

[ 本帖最后由 sson 于 22-1-2006 02:03 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 23-1-2006 01:42 AM | 显示全部楼层
原帖由 sson 于 22-1-2006 02:02 PM 发表


对不起,这两天没有上来,看来你已经解决了。
呵呵,可以走动就算是 AI 了。

不过小章鱼不是很明白你要 ...


小章鱼,你说的叉树是Vector 吗?呵呵呵。。二维树?? 华文的编程术语我并不是很懂哦~~~还有也不是很明白你说的platform...唉!没办法,很久没做programming了。。。。

就如你说的,与enemies 间的碰撞其实很简单。
我的就只是如此:

for(int i=0;i<3;i++){
if(enemy1.isVisible()){
 if(enemy1.collidesWith(player, true)) {
  player.die();
  }
 }
}

但MAP的collision就比较麻烦。。
我map是酱的array:

private static final int[] map1={
{1,2,3,4,5,6};
{1,2,3,4,5,6};
{1,2,3,4,5,6};
...............}

然后用for loop来load 那个map就成了。

我要使player 碰到这个map里的 "1"就会死但是我做不到(小弟不才,没能力)。不可以用collidesWith API 吖?因为在gamecanvas里头我append的是整个
map 的tilelayer.如果用collidesWith 那么player 一碰到map就会死了? !:

private Tiledlayer background;
private LayerManager stages;

stages.append(background);

if(player.collidesWith(background, true)) {
  player.die();
}

这个行不通吖~~~~哎~~~一碰到map就会死。。怎么能使player 碰到这个map里的 "1"就会死??

所以,我就用这个方法,就是做多个array map 叫 barrier:

private static final int[] map1={
{0,2,3,4,5,6};
{0,2,3,4,5,6};
{0,2,3,4,5,6};
...............}

private static final int[] barrier1={
{1,0,0,0,0,0};
{1,0,0,0,0,0};
{1,0,0,0,0,0};
...............}

然后呢,就在gamecanvas里再append...

private Tiledlayer background;
private Tiledlayer barrier;
private LayerManager stages;

stages.append(barrier);
stages.append(background);


if(player.collidesWith(barrier, true)) {
  player.die();
}

呵呵呵,这方法是参考书"偷"来的。。。。还行得通。。。不过很麻烦。。。

小章鱼,我知道你是高手。可以提供我更好的方法吗??


我的游戏类型是scrolling vertical view 的shooting game. 只是一个player 在2D平面地图上行走,然后敌人不停的出来吧了。要消灭敌人,就射死它咯。。。还有的是2D平面地图有陷阱或洞,一碰到就会死。。。当然,碰到敌人也会死咯。。。。虽然我做的game很烂下,不过使我学到很多东西哦~~~

[ 本帖最后由 Ppsprov 于 23-1-2006 01:46 AM 编辑 ]
回复

使用道具 举报

发表于 23-1-2006 09:49 PM | 显示全部楼层
原帖由 Ppsprov 于 23-1-2006 01:42 AM 发表
...
private static final int[] map1={
{1,2,3,4,5,6};
{1,2,3,4,5,6};
{1,2,3,4,5,6};
...............}

然后用for loop来load 那个map就成了。
...


其實你可以把 player 的 x, y 換算成 map 上的位置, 然或簡察 map1[x][y],
如果是大的 object ( 2 x 2 )則可以 map1[x][y], map1[x+1][y], map1[x][y+1], map1[x+1][y+1]

不需要去 loop 整個 map. 就好像 rpg 簡查地圖 / 城市的牆壁.
回复

使用道具 举报

 楼主| 发表于 23-1-2006 10:58 PM | 显示全部楼层

Ppsprov 对不起,小章鱼也只不过玩了几天罢了,对 J2ME 的了解实在是有限,
高手就担当不起了。

叉树是一种架构,可以用来计算多边形的碰撞。
二维树(打错了,是二维矩阵/二维列 2D array)
platform 就是指你的地图,像墙壁什么的。

一般在 2D 游戏很少会用多边形来验算碰撞啦,因为不需要那么精准(看不出来)。

你的问题 flashang 已经回答了。
其实这就是 tile based 架构的优势和特点。
可以快速的判断和地图的碰撞或接触。

tile based 就如它的名字,就是把整个场景分割成规矩的小方块,
而代价就是记忆空间(你的 map1 就是了)。

进一步运用,可以把场上的物件(玩家、敌人、子弹等)也放入这个 2D array 中,
酱子就可以减少碰撞测试的次数,因为只要测试在相同格子的物件的碰撞就行了。
当然这个方法用于大场景 + 多物件的游戏会比较有效果。
在小场景和少物件的,直接用 array 就可以了(像你目前的方式),反正不会差很远,有时候还更好。

不要说自己的游戏烂,再烂也是你的心血。
回复

使用道具 举报

发表于 24-1-2006 01:10 AM | 显示全部楼层
原帖由 flashang 于 23-1-2006 09:49 PM 发表


其實你可以把 player 的 x, y 換算成 map 上的位置, 然或簡察 map1[x][y],
如果是大的 object ( 2 x 2 )則可以 map1[x][y], map1[x+1][y], map1[x][y+1], map1[x+1][y+1]

不需要去 loop 整個 map. 就好像 ...


谢谢你哦~~~想试下用你的方法。。2D array好像满有趣的。。。。不过好像没看过人用在j2me games....
回复

使用道具 举报

发表于 24-1-2006 01:12 AM | 显示全部楼层
原帖由 sson 于 23-1-2006 10:58 PM 发表

Ppsprov 对不起,小章鱼也只不过玩了几天罢了,对 J2ME 的了解实在是有限,
高手就担当不 ...



我想我还是stick 在 array 算了。。。不过看到flashang 说的
2d array的方法想试下。。不知道行吗。。。。。我的编程技术实在有限。。。。

小章鱼,你做的map 是用我的方法吗???
回复

使用道具 举报

Follow Us
 楼主| 发表于 24-1-2006 04:00 PM | 显示全部楼层

Ppsprov 实际上小章鱼不能算是完成一个游戏,
毕竟只摸索了几天罢了。整体来讲,完成的只是一个小小的测试程式。
所以并没有做任何的地图。

不过依你的代码看来,你的 map1 就是一个 2D array 了呀。

不能说没有人用 2D array 在 J2ME 游戏中,实际上 2D array 在游戏开发经常用到。
简单的“贪吃蛇”游戏很多都是用 2D array 来实现的。
原理上来讲,只要是方格子的东西就可以用 2D array 来实现。
不过由于为了方便演算,一般我们会反过来
map[y][x] 而不是 map[x][y]
回复

使用道具 举报

发表于 24-1-2006 07:44 PM | 显示全部楼层
原帖由 sson 于 24-1-2006 04:00 PM 发表

原理上来讲,只要是方格子的东西就可以用 2D array 来实现。
不过由于为了方便演算,一般我们会反过来
map[y][x] 而不是 map[x][y]  


喔 ! map[x][y] 是我以前用自己 load map 的方法, 如果你是用 text file, 每一行加入 array 則要用 map[y][x].

另外, map 也可以減少對非方格物體的判斷, 例如 ;

* 1 = 牆, 0 = 空位, 2-n = enemy 2 -- n
* 5 = 四格的大 '動物'
* 同一格不會有兩個 '動物'

1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 5 5 0 0 1
1 0 2 0 0 0 5 5 0 0 1
1 0 0 0 3 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1

當 map[y][x] 有 2 的數字時, 檢查 Enemy 2 & player

而對於超小的物體, 或者可重疊的物體 ( laser, 子彈, 飛彈, power, ... )
則可以用回 for( i=0; i < array.size; i++ ) 之類的判斷
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 25-1-2006 02:51 PM | 显示全部楼层

flashang 也不是说 如果用 text file 导入就会变成 map[y][x],
经过简单的处理还是可以变成 map[x][y] 的。
使用 map[y][x] 主要是考虑方便演算、刷新和遮挡问题。

至于你的例子,原理看来是可行,
不过在实际上就似乎有问题了,只能算一个基础概念吧。

问题原因主要是在游戏物件的设计上,想来要设计刚好 2x2 大的物件是很难的,一般一定是小于的。
例如 1.75x1,加上物件的移动,覆盖的最大可能面积是 3x2 ,但物件的面积却不是
这情况下如此的判断肯定是不成的。
回复

使用道具 举报

发表于 25-1-2006 10:54 PM | 显示全部楼层
原帖由 sson 于 25-1-2006 02:51 PM 发表
问题原因主要是在游戏物件的设计上,想来要设计刚好 2x2 大的物件是很难的,一般一定是小于的。
例如 1.75x1,加上物件的移动,覆盖的最大可能面积是 3x2 ,但物件的面积却不是
这情况下如此的判断肯定是不成的。


我是說當簡查到 map[y][x] 發現有 '東西' 在 map[y][x] 上才
檢查 Enemy n & player

並不是指物體一定要那樣的 size.

這只是方便簡查地圖上的某一些位置是不是已經被 '東西' 占用去了.
在移動的物體, 通常會用比自己更大的位置, 1 格的物體在移動時會用到兩格.
1x2 會用到 2x2 或 1x3
2x2 會用到 2x3 或 3x2

這個方法我是用在 minesweeper, tetris, pacman 及 一些 text mode 的小遊戲中.

如果是多個 '動物' 在地圖上行走, 這個方法會比 for( i=0; i<max; i++ ) 有效得多

[ 本帖最后由 flashang 于 25-1-2006 11:12 PM 编辑 ]
回复

使用道具 举报

发表于 25-1-2006 10:59 PM | 显示全部楼层
原帖由 sson 于 25-1-2006 02:51 PM 发表

flashang 也不是说 如果用 text file 导入就会变成 map[y][x],
经过简单的处理还是可以变 ...


我是使用自己的 map editor, 所以對我來講 map[x][y] 比較容易.
而用 text file 和 map[y][x] 是懶惰 code, 用 map[y*width + x] 而且用 notepad 就可以改地圖了.

[ 本帖最后由 flashang 于 25-1-2006 11:08 PM 编辑 ]
回复

使用道具 举报

发表于 6-2-2006 03:06 PM | 显示全部楼层
各位高手,我的single player的game 已经算是完成了。
但现在要用蓝牙做multiplayer 的game.
在网上找到的不外是那些蓝牙service discovery 和如何用不同的protocol 开关connection...

我想要找的是一些关于如何用蓝牙做multiplayer game concept 和tutorial。。。。但找不到(source code 更不用讲)。。

不知大家可以帮帮忙给些意见我吗???
回复

使用道具 举报

 楼主| 发表于 8-2-2006 08:25 PM | 显示全部楼层

原帖由 flashang 于 25-1-2006 10:59 PM 发表
我是使用自己的 map editor, 所以對我來講 map[x][y] 比較容易.
而用 text file 和 map[y][x] 是懶惰 code, 用 map[y*width + x] 而且用 notepad 就可以改地圖了.

嗯,看来你还是无法理解小章鱼说的。
用 map[x][y] 或 map[y][x] 跟用怎样的 map editor/reader 都无所谓。
主要是在执行时的更新和演算所需要,当然小章鱼也有碰过用 map[x][y] 的例子,不过似乎很少。
混合用的例子也是有的。

决定用 map[x][y] 或 map[y][x] 主要是因为电脑的 axis-x 和 axis-y 和游戏表现方式关系,
而由于游戏一般都会有覆盖因素,而覆盖一般都是靠近的在上,所以一般会是 map[y][x] 较方便。

::注::
编程时的架构和外部档案的架构是没有关联的,
导入时一定会需要对其进行重编辑的,以符合整个游戏引擎的架构。


Ppsprov 对不起,小章鱼停止研究手机 Java 游戏了。
不过无论用什么方式,非同机的多人游戏概念应该都是一样的:
建立一个 server 或由其中一个 client 充当 server
client 连接到 server
场景的东西由 server 演算后发布给所有连线的 client
client 接收到后更新。
client 的动作各自发送给 server,由 server 演算后再发布给所有连线的 client

简单的流程大致是酱。
回复

使用道具 举报

发表于 16-2-2006 10:40 PM | 显示全部楼层
哇!看到你们个个都快完成,而我还在徘徊阶段,想起来真惭愧。其实有太大多的问题想向你们请教。
我已经绘制了一副背景图画,原本是想要把尺寸设为1029*340,但file size实在太大了,之后用Image Optimizer压缩为514*170,那就变成我的图片只适合于屏幕较小的手机,而不适合屏幕较大的手机,是不?
其实这有没办法解决?
用TileStudio来输出图片的数据,那数据为何而用?
TileStudio/Mappy是不是可以用来绘制地图?如果可以,该怎么输出成png file ?
回复

使用道具 举报

发表于 20-2-2006 04:54 PM | 显示全部楼层
原帖由 天玄路 于 16-2-2006 10:40 PM 发表
哇!看到你们个个都快完成,而我还在徘徊阶段,想起来真惭愧。其实有太大多的问题想向你们请教。
我已经绘制了一副背景图画,原本是想要把尺寸设为1029*340,但file size实在太大了,之后用Image Optimizer压缩为 ...



天玄路,TILE其实不用整个画完。其实是用for loop 来load 出来的。。。因为mobile phone 的memory 有限,实在是不可以support 到那么大的PNG。

我没用TileStudio。只是用MAPPY。MAPPY 没有preload map,而TileStudio有。。。。

我还未完成。。。。现在实在太STRESS了。因为我做的是multiplayer,但我在做multiplayer 之前做了个 single player的。现在因为太single player oriented所以。。。。唉。。。要改很多。。。。

bluetooth connection 应该是没问题了。。。。但实在不知道怎样去send message 来update 那些game action 和 canvas...

请问谁有JAVA GAME multiplayer source code 的参考???或URL。。?
回复

使用道具 举报

 楼主| 发表于 21-2-2006 02:28 PM | 显示全部楼层

Ppsprov 小章鱼没有 multiplayer 的参考。
实际上小章鱼也没有做过 multiplayer 的游戏,只做过 UI 的 ChatRoom(VB6),
不过概念应该是一样的。

写了一篇对话,希望可以帮你了解。不一定是正确的,欢迎讨论。

Client : Hello?
Server : Hello. I speak English.
Client : I speak English, too.
Server : What do you want?
Client : I want to sign in
Server : Name and password please.
Client : YourName, ****
Server : Sign in successful. Welcome YourName, please go to lobby.

Client(YourName) : Please send me the online list.
Server : Nobody is online.
Client(YourName) : Thanks.

Client : Hello?
Server : Hello. I speak English.
Client : I speak English, too.
Server : What do you want?
Client : I want to sign in
Server : Name and password please.
Client : MyName, ****
Server : Sign in successful. Welcome MyName, please go to lobby.

Server : YourName, MyName have signed in.
Client(YourName) : Ok.

Client(MyName) : Please send me the online list.
Server : Here's the online list;  YourName.
Client(MyName) : Thanks.

Clients : Please start the game.
Server : Preparing game data; Starting data transmission, sending packets.
Clients : Packets received in good condition.

Client(MyName) : Move me to x#, y#
Server : YourName, MyName moving to x#, y#
Client(YourName) : Ok.

Client(YourName) : Shot!
Server : MyName, YourName shoting at x#, y# with direction#
Server : MyName, you death.
Server : YourName, MyName death.

Server : MyName, YourName game is over, return to lobby.
Client(MyName) : Goodbye.
Server : Goodbye.
Server : YourName, MyName is signed off.
Client(YourName) : Ok.
回复

使用道具 举报


ADVERTISEMENT

发表于 21-2-2006 09:35 PM | 显示全部楼层
原帖由 sson 于 21-2-2006 02:28 PM 发表

Ppsprov 小章鱼没有 multiplayer 的参考。
实际上小章鱼也没有做过 multiplayer 的游戏, ...



谢谢你哦小章鱼。。。
我现在的问题是。。。。
我需要知道如何写些code来update 那些用蓝牙得来的资料。
好象:

如果server 得到了client的data,知道是要来move client  player的。。。应该要如何呢。。?
用switch..?if..?
但是用switch 和if的话,要怎样才使game知道是用来做什么的。。?
回复

使用道具 举报

发表于 22-2-2006 09:04 PM | 显示全部楼层
就来死了。。。。有人可以帮帮我吗???
回复

使用道具 举报

 楼主| 发表于 23-2-2006 12:28 PM | 显示全部楼层

由上面提供的对话演变。
假设:
A. 你的地图不大于 255x255
B. 你提供玩家的互动方式不超过 255 种(如移动)
C. 物品不超过 255 种(如恢复药)
D. 在线玩家不可超过 255 个
E. 目前有 2 人在线, ID 分别为 1, 20

(此为简单的概念,详细的还需要增强)
玩家(ID:1) 移动到 10, 150
对 server 讯息 byte(1) + byte(1) + byte(10) + byte(150) //4 个字节

4 个字节分别为
msg[0] = 互动方式(游戏内定)
msg[1] = 那个玩家
msg[2] = axis x
msg[3] = axis y

玩家(ID:20) 使用物品 100
对 server 讯息 byte(2) + byte(20) + byte(100) //3 个字节

4 个字节分别为
msg[0] = 互动方式(游戏内定)
msg[1] = 那个玩家
msg[2] = 使用物品代号(游戏内定)

server 分析为

  1. onGetMSG{
  2.   switch(msg[0]){
  3.     case 1:
  4.       // move player[msg[1]] to msg[2],msg[3]
  5.       // broadcast 给其他玩家
  6.     case 2:
  7.       // apply itemEffect[msg[2]] to msg[1]
  8.       // 如果允许其他玩家可以看到使用物品的模样,就 broadcast
  9.   }
  10. }
复制代码


同样的,玩家方面,当接收到 server 的讯息时就加以分析。
当然不要忘记,无论 client/server 都需要做 package 的处理,如等待和结合等。
除非你可以确定 client/server 所发的讯息都可以由 1 个 package 就结束。
回复

使用道具 举报

发表于 23-3-2006 11:00 AM | 显示全部楼层
为什么我加入 pause method in game后,the speed of all sprite会加快?

后来我insert gameOver=false at start method 后,speed become normal but only can pause the game, can't resume the game.
为什么会这样的??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 5-3-2025 12:21 PM , Processed in 0.493007 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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