|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解计划 在开辟良多范例的游戏中,舆图体系都必要优秀的计划,直不雅的说,我们必要的舆图体系仅仅是一个2D数组,然后用最快的体例将数组暗射到屏幕上。游戏中的舆图一般不是由程序员用键盘输出到程序里然后再在程序中修正然后再修正的狂乱历程,而是一样平常先由程序员做一个舆图编纂器,在这个舆图编纂器顶用鼠标点点点,再保留的历程,大概是从收集高低载的一些成熟编纂器好比:mappy如许的工具天生舆图,再用剧本言语为mappy写一个应当保留成甚么样格局的程序。一般舆图分为45度角,侧视角和仰望角等等,45度角的也有良多种,这类视角绝对仰望角和侧视叫较庞大,我们次要会商仰望角,实在侧视叫和仰望角次要的区分是图片的体现作风纷歧样,好比雷电如许的空战就是仰望角,mario如许的游戏就是侧视角,能够用不异的舆图编纂器做出来。综上,你要晓得游戏舆图不是程序员用程序写出来的,你喜好写也能够,修正起来较贫苦,也不克不及像资本一样静态办理而是一次性读进到内存里,对照不爽。
在这个文章内里,我们假定我们的2D数组是经由过程,资本读掏出来的,内容以下:
publicstaticbyte[][]B_MAZE_2D_ARRAY={
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{
0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{
0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{
0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{
0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}
,{
0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0}
,{
0,1,0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}
,{
0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0}
,{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0}
,{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0}
,{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
这个舆图中一共0,1两种byte数,0代表一种图块,1代表一种图块,也能够是动绘图块,你绘制的时分区分一下就能够了。由于我们程序内里想把这全部图形绘制出来的话有N多种计划,我给出两个对照公道的计划,固然第二种是对照优化的.我们假定你的配角一向在屏幕中心,当你配角挪动的时分,舆图响应的变更,就是说配角为参照物,舆图动.我们晓得舆图的巨细要凌驾屏幕的,我们必要设定一个坐标体系,我的办法是,以左上角为0,0也就是和我们经常使用的Canvas的坐标体系是不异的,我们的图块巨细为:ELEMENT_WIDTH,ELEMENT_HEIGHT,以是我们全部舆图的面积(相对面积)是ELEMENT_WIDTH*横坐标的块数*ELEMENT_HEIGHT*纵坐标的块数。因而,我们把这么年夜的题丹青在屏幕上时,必要把必要画的坐标面积(也就是屏幕面积)从这个舆图中拿出来,其他中央被切除,这就对照的高效了。
办法一:轮回全部2维数组,不必要的中央不绘制只绘必要的部分:
intkI=0;//暗示
intkJ=0;
//nEleStartedX,nEleStartedY暗示从2DArray哪一个地位入手下手绘制舆图
for(inti=nEleStartedY;i<B_MAZE_2D_ARRAY.length;i++){
kJ=0;
//是不是必要绘制
booleanisDrawed=false;
for(intj=nEleStartedX;j<B_MAZE_2D_ARRAY[i].length;j++){
//绘制必要的面积,N_MAZE_ELEMENT_WIDTH,N_MAZE_ELEMENT_HEIGHT暗示图块宽高
intbX=nMapStartedX+j*N_MAZE_ELEMENT_WIDTH;
intbY=nMapStartedY+i*N_MAZE_ELEMENT_HEIGHT;
//SCREEN_WIDTH,SCREEN_HEIGHT屏幕巨细
if(bX<=SCREEN_WIDTH
&&
bY<=SCREEN_HEIGHT
&&
bX>=-N_MAZE_ELEMENT_WIDTH
&&
bY>=-N_MAZE_ELEMENT_HEIGHT
){
g.drawImage(mapImages[B_MAZE_2D_ARRAY[i][j]],bX,
bY,
Graphics.TOP|Graphics.LEFT);//绘制图块
isDrawed=true;
kJ++;
//N_MAX_MAZE_ITEM_X,N_MAX_MAZE_ITEM_Y屏幕面积内图块的最年夜值
if(kJ>N_MAX_MAZE_ITEM_X+2){
break;
}
}
}
if(isDrawed){
kI++;
}
if(kI>N_MAX_MAZE_ITEM_Y+2){
break;
}
}
办法二:事前找到必要绘制的横坐标纵坐标的图块编号(2DArray的数组下标),轮回屏幕面积巨细的数组:
//必要绘制的2DArray左上角地位,nMapStartedX,nMapStartedY在舆图相对面积上的坐标
intnArrayI=(-N_MAZE_ELEMENT_HEIGHT-nMapStartedY)/
N_MAZE_ELEMENT_HEIGHT;
intnArrayJ=(-N_MAZE_ELEMENT_WIDTH-nMapStartedX)/
N_MAZE_ELEMENT_WIDTH;
for(inti=nArrayI;
i<SCREEN_HEIGHT/N_MAZE_ELEMENT_HEIGHT+2;i++){
for(intj=nArrayJ;
j<SCREEN_WIDTH/N_MAZE_ELEMENT_WIDTH+2;j++){
if(i<0||j<0||i>B_MAZE_2D_ARRAY.length||
j>B_MAZE_2D_ARRAY[0].length){
continue;
}
else{
intbX=nMapStartedX+j*N_MAZE_ELEMENT_WIDTH;
intbY=nMapStartedY+i*N_MAZE_ELEMENT_HEIGHT;
g.drawImage(mapImages[B_MAZE_2D_ARRAY[i][j]],bX,
bY,
Graphics.TOP|Graphics.LEFT);
}
}
}
依据我的测试,办法一的舆图面积越年夜fps失落的越为凶猛,而办法二基础上不会失落fps,激烈保举办法二.
舆图体系做好了以后,你就能够利用舆图做更多的体现力了,只需改动nMapStartedX,nMapStartedY,就能够绘制出舆图上的响应部分,代码的复用效力十分的高。RPG,SLG,PUZZLE等游戏范例都可使用.接待跟我切磋更多的游戏制造手艺,我还将写一个关于动画的相干东东,不外比来没甚么工夫
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。 |
|