`

Android 游戏教程:让人物动起来-网摘

 
阅读更多

今天我们用zgf框架做一个人物运动的demo,这是个简单的例子代码不多功能简陋,通过这个例子可以学会用zgf框架加载游戏图片和实现逐帧动画,通过这些就可以让一张图片变成一段简单的动画。

一. 准备工作

     首先我们要事先准备好要使用的人物动作图和地形图
 
 
 
这张是动作图,把它分割成16个不同的动作,循环播放同一行的4个不同动作就可以让人物动起来了。
 

二. 动画实现

    按照 简单的android游戏框架——zgf 所述先搭建一个框架,接着编写如下类:
     人物类Person主要代码如下:
  1. private int x;  
  2.     private int y;  
  3.     private int dist;//行走方向  
  4.     private int spd;//行走速度  
  5.     private boolean isMove;  
  6.     private Bitmap img;  
  7.     private int imgXId;//图片的横向切片编号  
  8.     private int imgYId;//图片的纵向切片编号  
  9.     private int actTime;//动画间隔时间  
  10.       
  11.     public Person(Context con,int x,int y) {  
  12.         //人物中心点  
  13.         this.x=x;  
  14.         this.y=y;  
  15.           
  16.         dist=Constants.DOWN;  
  17.         isMove=false;  
  18.         spd=2;  
  19.         img=GraphicUtil.ReadBitMap(con, R.drawable.bb);  
  20.         imgXId=0;  
  21.         imgYId=0;  
  22.     }  
  23.       
  24.     public void draw(Canvas c, Paint p) {  
  25.         //图片的左上角坐标  
  26.         int ix=x-Constants.PERSON_WIDTH/2;  
  27.         int iy=y-Constants.PERSON_HEIGHT/2;  
  28.           
  29.         GraphicUtil.DrawClipById(c, p, Constants.PERSON_WIDTH, Constants.PERSON_HEIGHT,  
  30.                 img, imgXId, imgYId, ix, iy);  
  31.     }  
  32.       
  33.     public void act() {  
  34.         if(isMove) {  
  35.             if(actTime<Constants.ACT_TIME)   
  36.                 actTime++;  
  37.             else if(actTime>=Constants.ACT_TIME)  
  38.                 actTime=0;  
  39.             imgXId=actTime*actTime/Constants.ACT_TIME;  
  40.           
  41.             switch(this.dist) {  
  42.                 case Constants.UP:  
  43.                     y-=spd;  
  44.                     imgYId=3;  
  45.                     break;  
  46.                 case Constants.DOWN:  
  47.                     y+=spd;  
  48.                     imgYId=0;  
  49.                     break;  
  50.                 case Constants.RIGHT:  
  51.                     x+=spd;  
  52.                     imgYId=2;  
  53.                     break;  
  54.                 case Constants.LEFT:  
  55.                     x-=spd;  
  56.                     imgYId=1;  
  57.                     break;  
  58.             }  
  59.               
  60.             //控制行走范围不超出屏幕  
  61.             x=x<0?0:x;  
  62.             x=x>GameAct.GetDispW()?GameAct.GetDispW():x;  
  63.             y=y<0?0:y;  
  64.             y=y>GameAct.GetDispH()?GameAct.GetDispH():y;  
  65.         }  
  66.     }  
  67.       
  68.     public void move(int dist) {  
  69.         this.dist=dist;  
  70.         this.isMove=true;  
  71.     }  
  72.       
  73.     public void stop() {  
  74.         this.isMove=false;  
  75.         actTime=0;  
  76.     }  
 
 
 打开api文档,找到 com.zxx43.commen.graphic.GraphicUtil 可以看到 ReadBitMap(java.lang.String src) 和 ReadBitMap(Context context, int resId) 两个方法,通过这两个方法可以获得bitmap对象,前一个方法是根据文件路径加载图片,后一个方法是根据资源id加载图片。
   DrawClipById(Canvas c, Paint p, int cw, int ch, Bitmap file, int idX, int idY, int x, int y) 方法绘制切片,cw和ch是图片的切片宽度和高度,idX和idY是图像的横向和纵向编号。

    
 接着绘制背景,新建BackMap类,主要代码如下:
 
  1. private Bitmap texture;  
  2.       
  3.     public BackMap(Context con) {  
  4.         texture=GraphicUtil.ReadBitMap(con, R.drawable.texture);  
  5.     }  
  6.       
  7.     public void draw(Canvas c, Paint p) {  
  8.         int imgX=0;  
  9.         int imgY=0;  
  10.         int wc=GameAct.GetDispW()/Constants.TILE_WIDTH;  
  11.         int hc=GameAct.GetDispH()/Constants.TILE_WIDTH;  
  12.         //将图像铺满屏幕  
  13.         for(int i=0;i<wc;i++) {  
  14.             for(int j=0;j<hc;j++) {  
  15.                 int x=i*Constants.TILE_WIDTH;  
  16.                 int y=j*Constants.TILE_WIDTH;  
  17.                 GraphicUtil.DrawClipById(c, p, Constants.TILE_WIDTH, Constants.TILE_WIDTH,   
  18.                         texture, imgX, imgY, x, y);  
  19.             }  
  20.         }  
  21.     }  

 

 然后把它们在一个类里面实例化对象:

  1. BackMap bm;  
  2.     Person per;  
  3.     int time=0;  
  4.       
  5.     public Scene(Context con) {  
  6.         init(con);  
  7.     }  
  8.       
  9.     private void init(Context con) {  
  10.         bm=new BackMap(con);  
  11.         int px=GameAct.GetDispW()-GameAct.GetDispW()/6;  
  12.         int py=GameAct.GetDispH()/6;  
  13.         per=new Person(con,px,py);  
  14.     }  
  15.       
  16.     public void draw(Canvas c,Paint p) {  
  17.         bm.draw(c, p);  
  18.         per.draw(c, p);  
  19.     }  
  20.       
  21.     public void act() {  
  22.         //人物逆时针行走  
  23.         int dist=Constants.NONE;  
  24.         int timer=100;  
  25.         if(time<timer)  
  26.             dist=Constants.LEFT;  
  27.         else if(time<2*timer)  
  28.             dist=Constants.DOWN;  
  29.         else if(time<3*timer)  
  30.             dist=Constants.RIGHT;  
  31.         else if(time<4*timer)  
  32.             dist=Constants.UP;  
  33.         else if(time>=4*timer)  
  34.             time=0;  
  35.         time++;  
  36.               
  37.         per.move(dist);  
  38.         per.act();  
  39.     }  

 

       最后编写Game.java:

  1. private Scene scene;  
  2.       
  3.     public Game(Context con) {  
  4.         super(con);  
  5.         scene=new Scene(con);  
  6.     }  
  7.       
  8.     @Override  
  9.     public void run(Context con, Canvas c, Paint p) {  
  10.         scene.draw(c,p);  
  11.         scene.act();  
  12.     }  

  完成,运行效果如下:

 

 

通过以上代码实现了逐帧动画的播放,很简单是不是?

     现在动画是实现了,但是还不能自己控制,下一篇的内容将会是关于触屏控制和虚拟键盘。
 
分享到:
评论

相关推荐

    Anyway.Tab-2.0.8.zip

    名称:Anyway.Tab -------------------- ...全新的Anyway.Tab保留了Anyway.FM节目更新提示的功能,同时整合了Anyway.Now安妮薇看看的实时链接分享,希望带给大家更加新鲜的与设计行业相关的新闻资讯、网摘推荐等内容~

    Jquery合并单元格--网摘

    在网页开发中,jQuery 是一个非常流行的 JavaScript 库,它简化了 DOM 操作、事件处理以及动画效果。本文将探讨如何使用 jQuery 来合并表格中相同文本的相邻单元格,这是在展示数据时提高可读性和美观度的一种常见...

    LESSY-BLOG(LBS2.0.283汉化修改版)

    2,添加网摘功能(Key365,新浪VIVI,我摘,博采).登陆帐号:admin登陆密码:comeon2005.04.17更新记录:2.0.283- function.asp: 修正一个 bug- ubbcode.asp: 修正若干 bug, 整理输出内容符合 XHTML 标准- lang/blog.asp: ...

    百亿网摘完整无错版

    百亿网摘整站 后台功能 --------------------- 基本信息 管理站点的基本信息 栏目管理 栏目分类 网摘管理 已推荐网摘 推荐网摘 首页生成 重新生成页面 审核网摘 管理网摘 模版管理 模版管理 用户管理 管理员修改 ...

    php网摘程序

    3. **分类管理**:为了更好地组织收藏的网摘,程序通常提供分类功能,让用户可以根据主题或类型对网摘进行归类。 4. **搜索功能**:强大的搜索功能是网摘程序的关键,用户应能快速找到自己收藏的特定内容。这可能...

    Flash游戏开发一些比较好的网摘

    NULL 博文链接:https://ch-kexin.iteye.com/blog/608718

    网摘精灵软件包1.5

    网摘精灵教程:网摘自动提交工具。 尊敬的站长:你好。 我们注意到您的网站放置了很多网摘提交代码。 你希望通过提交网摘来获取流量,对吗? 靠这种原始的手工提交,效率很低,对吗? 如果有一种网摘提交工具...

    Struts1.x系列教程(网摘-全)

    本系列教程是针对初学者的全面指导,旨在帮助学习者快速掌握Struts1.x的核心概念和使用方法。下面我们将深入探讨Struts1.x的关键知识点。 1. **MVC架构**:MVC是一种设计模式,用于分离应用程序的数据、业务逻辑和...

    网站推广方式

    - **内容提交**:将网站优质内容提交至热门网摘系统,如新浪VIVI、天天网摘等。 - **自动提交工具**:考虑使用自动化工具提高提交效率,但需确保内容质量。 以上是基于文件信息整理出的网站推广关键策略。需要注意...

    网摘集合网摘集合网摘集合网摘集合

    网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合...

    天空网摘 V120606.rar

    目标 利用网摘建站,打造最便捷的资讯服务!最适合于做小型SEO网站。 适用范围 新闻娱乐、专业学术、地方门户、行业资讯等相关网站建设。 参考范例:电子书藏家 初始化 注册用户:天空 密码:admin 登录:Login....

    AnyRSS阅读器Ver1.0GB2312版

    RSS(简易信息聚合,也叫Really Simple Syndication、聚合RSS、聚合内容),是一种消息来源格式规范,用以聚合经常发布更新数据的网站,例如博客文章、新闻、音频或视频的网摘。 目前很多网站的RSS源不是太久就是...

    天空网摘 v120606

    网摘建站具有技术自主容易、运营维护简单等性价比的优势,并能高效快捷的整合网络诸如论坛、博客、资讯、图片、视频、下载等各类资源来。当然,网摘应用也具有内容原创性不强,互动交流性不够的特点,这就需要在网站...

    PHP免费网摘程序

    2、修改数据库配置文件,conn.php.修改网摘配置文件 include/setup.php。 3、后台路径admin/default.php 默认帐号密码 是 admin admin . 4、生成所有网摘静态页面程序为data.php。生成所有新网摘的程序为 datanew....

    如何让你的网站获得高质量外链.docx

    ### 如何让你的网站获得高质量外链 #### 一、引言 在互联网时代,网站的可见度和排名直接影响其流量和影响力。其中,获取高质量的外部链接(简称“外链”)是提高网站权威性、PR值以及搜索引擎排名的重要手段之一...

    City Engine入门教程csdn网摘1

    【City Engine入门教程csdn网摘1】是一个指导初学者如何使用CityEngine创建城市模型的教程。CityEngine是一款强大的城市建模软件,主要用于快速生成逼真的3D城市景观。本教程分为三个部分,涵盖从创建新工程、设置...

    加入网摘插件 v1.0 通用版

    首先,让我们详细了解一下什么是网摘。网摘,也称为社会书签,是一种让用户保存、分类、分享和发现网络内容的服务。用户可以将自己喜欢的网页链接保存在网摘站点上,并添加描述和标签,便于自己日后查找,同时也能让...

    天空网摘 v20110624.rar

    程序说明网摘等级:删除 私有 验证 公开 高级 推荐 精华用户等级:删除 锁定 验证 普通 高级 贵宾 操作员 管理员各个等级的用户分别对应拥有各个等级的网摘权限,其中操作员可以添加“图片”类型的网摘,管理员可以...

Global site tag (gtag.js) - Google Analytics