继续前两天的博客内容,接着写Java中的ACT游戏实现,本来记得手里有C++版马里奥的角色和地图的,突然找不到丢那里了,凑活ps个GBA火影的图代替下……
运行效果如下:
此次重点演示了角色和地图的绘制……其实看过我以前写JAVA的RPG开发blog文章的早知道怎么弄的了……所以此次只帖代码……
Role.java:
packageorg.test.mario;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Point;
importorg.loon.framework.game.image.Bitmap;
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:角色描述及绘制用类
*</p>
*<p>
*Copyright:Copyright(c)2008
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
publicclassRole...{
privatedouble_x;
privatedouble_y;
privatedouble_vx;
privatedouble_vy;
privatebooleanisFlat;
privateint_dir;
privateint_count;
finalstaticprivateImagerole=newBitmap("./role.gif").getImage();
privateMap_map;
finalstaticpublicintWIDTH=40;
finalstaticpublicintHEIGHT=40;
finalstaticprivateintSPEED=6;
finalstaticprivateintJUMP_SPEED=16;
finalstaticprivateintRIGHT=0;
finalstaticprivateintLEFT=1;
publicRole(double_x,double_y,Map_map)...{
this._x=_x;
this._y=_y;
this._map=_map;
_vx=0;
_vy=0;
isFlat=false;
_dir=RIGHT;
_count=0;
AnimationThreadthread=newAnimationThread();
thread.start();
}
publicvoidstop()...{
_vx=0;
}
publicvoidleft()...{
_vx=-SPEED;
_dir=LEFT;
}
publicvoidright()...{
_vx=SPEED;
_dir=RIGHT;
}
publicvoidjump()...{
if(isFlat)...{
_vy=-JUMP_SPEED;
isFlat=false;
}
}
publicvoidupdate()...{
//0.6为允许跳跃的高度限制,反值效果
_vy+=0.6;
doublenewX=_x+_vx;
Pointtile=_map.getTileHit(this,newX,_y);
if(tile==null)...{
_x=newX;
}else...{
if(_vx>0)...{
_x=Map.tilesToPixels(tile.x)-WIDTH;
}elseif(_vx<0)...{
_x=Map.tilesToPixels(tile.x+1);
}
_vx=0;
}
doublenewY=_y+_vy;
tile=_map.getTileHit(this,_x,newY);
if(tile==null)...{
_y=newY;
isFlat=false;
}else...{
if(_vy>0)...{
_y=Map.tilesToPixels(tile.y)-HEIGHT;
_vy=0;
isFlat=true;
}elseif(_vy<0)...{
_y=Map.tilesToPixels(tile.y+1);
_vy=0;
}
}
}
publicvoiddraw(Graphicsg,intoffsetX,intoffsetY)...{
g.drawImage(role,(int)_x+offsetX,(int)_y+offsetY,(int)_x
+offsetX+WIDTH,(int)_y+offsetY+HEIGHT,_count*WIDTH,
_dir*HEIGHT,_count*WIDTH+WIDTH,_dir*HEIGHT+HEIGHT,
null);
}
publicdoublegetX()...{
return_x;
}
publicdoublegetY()...{
return_y;
}
privateclassAnimationThreadextendsThread...{
publicvoidrun()...{
while(true)...{
if(_count==0)...{
_count=1;
}elseif(_count==1)...{
_count=0;
}
try...{
Thread.sleep(300);
}catch(InterruptedExceptione)...{
e.printStackTrace();
}
}
}
}
}
Map.java:
packageorg.test.mario;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Point;
importorg.loon.framework.game.image.Bitmap;
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:地图绘制及描述用类
*</p>
*<p>
*Copyright:Copyright(c)2008
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
publicclassMap...{
//在以前的blog文章中我介绍过,游戏开发中通常以数组描述地图
//此处1描绘为一个障碍物,0描绘为一个可通行空间
finalstaticpublicintTILE_SIZE=32;
finalstaticpublicintROW=20;
finalstaticpublicintCOL=30;
finalstaticpublicintWIDTH=TILE_SIZE*COL;
finalstaticpublicintHEIGHT=TILE_SIZE*ROW;
finalstaticpublicdoubleGRAVITY=0.6;
//地图描述
finalstaticprivateint[][]map=...{
...{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2},
...{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,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,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,1},
...{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
2,2,2,2,2,2,2,1},
...{1,1,1,1,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,1},
...{1,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,1},
...{1,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,1},
...{1,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,1},
...{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,
0,0,0,0,0,0,0,1},
...{1,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,1},
...{1,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,1},
...{1,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,1},
...{1,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,1},
...{1,2,2,2,2,2,0,0,0,0,0,0,0,0,2,2,2,2,2,1,0,0,
0,0,0,0,0,0,2,1},
...{1,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,1},
...{1,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,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,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,1},
...{1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,1}};
finalstaticprivateImagetile=newBitmap("./tile_0.gif").getImage();
finalstaticprivateImagetile2=newBitmap("./tile_1.gif").getImage();
/***//**
*构造函数
*
*/
publicMap()...{
}
publicvoiddraw(Graphicsg,intoffsetX,intoffsetY)...{
intfirstTileX=pixelsToTiles(-offsetX);
intlastTileX=firstTileX+pixelsToTiles(Main._WIDTH)+1;
lastTileX=Math.min(lastTileX,COL);
intfirstTileY=pixelsToTiles(-offsetY);
intlastTileY=firstTileY+pixelsToTiles(Main._HEIGHT)+1;
lastTileY=Math.min(lastTileY,ROW);
for(inti=firstTileY;i<lastTileY;i++)...{
for(intj=firstTileX;j<lastTileX;j++)...{
//转换map标识
switch(map[i][j])...{
case1://绘制砖地
g.drawImage(tile,tilesToPixels(j)+offsetX,
tilesToPixels(i)+offsetY,null);
break;
case2:
g.drawImage(tile2,tilesToPixels(j)+offsetX,
tilesToPixels(i)+offsetY,null);
break;
}
}
}
}
/***//**
*换算角色与地板的撞击,并返回Point用以描述新的x,y
*
*@paramplayer
*@paramnewX
*@paramnewY
*@return
*/
publicPointgetTileHit(Roleplayer,doublenewX,doublenewY)...{
newX=Math.ceil(newX);
newY=Math.ceil(newY);
doublefromX=Math.min(player.getX(),newX);
doublefromY=Math.min(player.getY(),newY);
doubletoX=Math.max(player.getX(),newX);
doubletoY=Math.max(player.getY(),newY);
intfromTileX=pixelsToTiles(fromX);
intfromTileY=pixelsToTiles(fromY);
inttoTileX=pixelsToTiles(toX+Role.WIDTH-1);
inttoTileY=pixelsToTiles(toY+Role.HEIGHT-1);
for(intx=fromTileX;x<=toTileX;x++)...{
for(inty=fromTileY;y<=toTileY;y++)...{
if(x<0||x>=COL)...{
returnnewPoint(x,y);
}
if(y<0||y>=ROW)...{
returnnewPoint(x,y);
}
if(map[y][x]==1||map[y][x]==2)...{
returnnewPoint(x,y);
}
}
}
returnnull;
}
/***//**
*将Tiles转为Pixels
*
*@parampixels
*@return
*/
publicstaticintpixelsToTiles(doublepixels)...{
return(int)Math.floor(pixels/TILE_SIZE);
}
/***//**
*将Pixels转为Tiles
*
*@parampixels
*@return
*/
publicstaticinttilesToPixels(inttiles)...{
returntiles*TILE_SIZE;
}
}
Main.java
packageorg.test.mario;
importjava.awt.Color;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Panel;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importorg.loon.framework.game.image.Bitmap;
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2008
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
publicclassMainextendsPanelimplementsRunnable,KeyListener...{
/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;
publicstaticfinalint_WIDTH=640;
publicstaticfinalint_HEIGHT=480;
privateMap_map;
privateRole_role;
privateThread_sleep;
privateImage_screen=null;
privateGraphics_graphics=null;
//方向控制,由于是自然落体所以没有down
privatebooleanLEFT;
privatebooleanRIGHT;
privatebooleanUP;
publicMain()...{
setSize(_WIDTH,_HEIGHT);
setFocusable(true);
_screen=newBitmap(_WIDTH,_HEIGHT).getImage();
_graphics=_screen.getGraphics();
_map=newMap();
_role=newRole(190,40,_map);
//监听窗体
addKeyListener(this);
//启动线程
_sleep=newThread(this);
_sleep.start();
}
/***//**
*运行
*/
publicvoidrun()...{
while(true)...{
//改变方向
if(LEFT)...{
_role.left();
}elseif(RIGHT)...{
_role.right();
}else...{
_role.stop();
}
if(UP)...{
_role.jump();
}
_role.update();
repaint();
try...{
Thread.sleep(20);
}catch(InterruptedExceptione)...{
e.printStackTrace();
}
}
}
publicvoidupdate(Graphicsg)...{
paint(g);
}
publicvoidpaint(Graphicsg)...{
_graphics.setColor(Color.BLACK);
_graphics.fillRect(0,0,_WIDTH,_HEIGHT);
intoffsetX=_WIDTH/2-(int)_role.getX();
offsetX=Math.min(offsetX,0);
offsetX=Math.max(offsetX,_WIDTH-Map.WIDTH);
intoffsetY=_HEIGHT/2-(int)_role.getY();
offsetY=Math.min(offsetY,0);
offsetY=Math.max(offsetY,_HEIGHT-Map.HEIGHT);
_map.draw(_graphics,offsetX,offsetY);
_role.draw(_graphics,offsetX,offsetY);
g.drawImage(_screen,0,0,null);
}
publicvoidkeyPressed(KeyEvente)...{
intkey=e.getKeyCode();
if(key==KeyEvent.VK_LEFT)...{
LEFT=true;
}
if(key==KeyEvent.VK_RIGHT)...{
RIGHT=true;
}
if(key==KeyEvent.VK_UP)...{
UP=true;
}
}
publicvoidkeyReleased(KeyEvente)...{
intkey=e.getKeyCode();
if(key==KeyEvent.VK_LEFT)...{
LEFT=false;
}
if(key==KeyEvent.VK_RIGHT)...{
RIGHT=false;
}
if(key==KeyEvent.VK_UP)...{
UP=false;
}
}
publicvoidkeyTyped(KeyEvente)...{
}
publicstaticvoidmain(String[]args)...{
Frameframe=newFrame();
frame.setTitle("Java来做马里奥(2)—木叶传承");
frame.setSize(_WIDTH,_HEIGHT+20);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.add(newMain());
frame.setVisible(true);
frame.addWindowListener(newWindowAdapter()...{
publicvoidwindowClosing(WindowEvente)...{
System.exit(0);
}
});
}
}
以上……
突然觉得这样做也挺有意思的,准备让木叶丸踩三代玩,啊哈哈哈……(众人曰:神经病)||||
分享到:
相关推荐
《Java编程超级马里奥全代码》是一款基于Java开发的游戏项目,它允许用户自定义游戏体验,具有高度的可玩性和可扩展性。这个项目在Java编程领域内,特别是游戏开发方面,提供了一次深入学习的机会,对于想要提升Java...
1. **面向对象编程**:Java是一种面向对象的语言,游戏中的角色(如马里奥、敌人、砖块等)都可以被设计为独立的类,每个类都有其特定的属性和行为。例如,马里奥类可能包含位置、速度、生命值等属性,以及跳跃、...
总的来说,这个基于Java的超级马里奥源代码是一个全面的编程教程,涵盖了GUI设计、游戏逻辑、资源管理、多线程和碰撞检测等多个方面,是深入理解和学习Java编程以及游戏开发的宝贵素材。通过分析和修改这个源代码,...
总的来说,"Java_Supermario.rar"提供的超级马里奥源码是一个很好的学习案例,无论是对Java新手还是有一定经验的开发者,都能从中获益。通过深入阅读和修改源码,你可以逐步理解并掌握游戏开发的各个环节,从而提升...
1. **图形渲染**:游戏的视觉效果是通过Java的AWT或Swing库来实现的。这些库提供了图形用户界面(GUI)的组件,如窗口、按钮、图像等,用于构建游戏画面。开发者可能使用Graphics类进行绘制,包括马里奥角色、砖块、...
总的来说,【Java版超级马里奥】展示了Java在游戏开发领域的应用,涵盖了GUI设计、事件处理、多线程、图形绘制以及音频播放等多个方面的技术。通过这样的项目,开发者不仅可以锻炼编程技能,也能理解游戏开发的基本...
1. **Java编程语言**:Java是一种跨平台的面向对象的编程语言,它以其“一次编写,到处运行”的特性而闻名。在这个项目中,Java被用来编写游戏的所有逻辑,包括角色移动、碰撞检测、动画等。 2. **图形用户界面...
【标题】"马里奥java实现文件"是一个项目,它使用Java编程语言重新创建了经典游戏马里奥的某些功能。这个项目展示了如何利用Java的强大功能来开发游戏,特别是那些基于2D图形的游戏。 【描述】"用java写的工程文件...
1. **面向对象编程**:在Java中,游戏对象如马里奥、敌人、障碍物等,都可被抽象为类。每个类都有其特定的行为(如移动、跳跃)和属性(如位置、状态)。这些类通过接口、继承等方式相互关联,形成一个完整的类体系...
【Java山寨超级马里奥】是一款使用Java编程语言开发的小游戏,...总的来说,"Java山寨超级马里奥"项目是一个涵盖多方面Java技术的综合实践,对于想要提升Java编程和游戏开发能力的人来说,是一个极好的学习和挑战机会。
资源名称:JAVA游戏开发之超级马里奥 教程内容:1、超级马里奥01_游戏演示以及知识准备2、超级马里奥02_游戏中各个类的关系设计3、超级马里奥03_第一部分_开发窗体类与静态类4、超级马里奥03_第二部分_开发窗体类与...
【Java超级马里奥游戏】是一款使用Java编程语言开发的复古风格的游戏,它复刻了经典游戏《超级马里奥》的玩法和元素。通过Java技术实现,这个游戏展现了Java在图形用户界面(GUI)和游戏开发方面的应用能力。以下是...
1. **Java基础知识**:马里奥游戏的实现基于Java编程语言,因此,掌握Java的基本语法、类和对象、继承、多态等概念是必不可少的。源代码中会体现面向对象的设计思想,比如通过类来模拟马里奥、砖块、金币等游戏元素...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。...基于Java开发的超级马里奥小游戏源码.zip
1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。 2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等...
【标题】"JAVA小游戏 超级马里奥"揭示了这个项目是使用Java编程语言开发的一款游戏,它致敬了经典的游戏《超级马里奥》。这款游戏可能包含了马里奥的经典元素,如跳跃、吃蘑菇变大、踩踏敌人以及收集金币等。在Java...
总的来说,“马里奥java代码”项目涵盖了Java编程的多个方面,不仅锻炼了开发者的基本编程技能,还涉及到游戏开发的多个关键技术点,是一个很好的学习和实践项目。通过这个项目,开发者可以深入理解Java语言的特性,...
超级马里奥的代码将展示如何用Java来构建复杂的游戏结构。 2. **游戏框架**:游戏通常基于某种框架或库进行开发,以便简化图形渲染、音频处理和事件管理。了解Java中的游戏框架,如LibGDX或Slick2D,有助于理解代码...
1. **Java编程基础**:马里奥毕业设计的基础是Java编程语言,它是一种广泛使用的面向对象的编程语言,具有跨平台性,适合开发桌面应用、移动应用甚至服务器端应用。设计中涉及的Java技术可能包括类与对象、继承、...