Windows Phone XNAでアニメーション - ぐるぐる

この投稿では、Windows PhoneでGameなどの高機能なグラフィックスを必要とするアプリケーション開発に最適な、XNA Frameworkを使って、テクスチャイメージを一定の速さで変形させる方法を解説します。

ここでは図のテクスチャを一定速度で回転させるアニメーションをベースに説明を行います。

この画像は、PowerPoint 2010で、フリーハンドでぐるぐるを描いて、図としてPNGで保存したものです。背景が透明なので他の描画に重ねることができます。好きな画像を用意してください。

次に、Windows Phone SDKをインストールしたVisual Studioを起動して、XNA Game Studio 4.0のWindows Phone ゲーム(4.0)という名前のテンプレートで新しくプロジェクトを作成します。名前を仮にWPGuruGuruとしておきます。

作っておいた図を、新しく作成されたプロジェクトのフォルダーWPGuruGuruContentにコピーします。

そして、WPGuruGuruのソリューションエクスプローラーで、新しく作成されたソリューションの2つのプロジェクトのうち、お尻にContentがついたプロジェクト(ここではWPGuruGuruContent)をマウスで右クリックし、”追加”→”既存の項目”を選択して、この画像ファイルをこのプロジェクトに追加します。画像ファイル名は、GuruGuru.pngとしておきますね。

WPGuruGuruプロジェクトのGame1.csのGame1クラスのメンバー変数として、

private Texture2D guruguruTexture;    // 画像を保持する為のメンバー変数
private float angle;                                // 画像を描画する時の角度
private float deltaAngle;                        // 画像角度を更新する際の単位角度

を追加します。

そして、Game1クラスのLoadContentメソッドに、以下のコードを加えます。

guruguruTexture = Content.Load<Texture2D>("GuruGuru");

XNAの場合、(デフォルトで)毎秒30回、描画内容の更新(Updateメソッド)、描画(Drawメソッド)がコールされます。Updateメソッドで、angleにdeltaAngleを足して、360度を超えたら、360度の剰余を代入して、angleを順次更新していきます。そして、Drawメソッドで、そのangleの角度でテクスチャ画像を描画すれば、ぐるぐる回っているアニメーションの出来上がりです。なので、Initializeメソッドでangleを0、deltaAngleを10で、初期化しておいて、

Updateメソッドで、

angle += deltaAngle;
if (angle >= 360) angle %=360;

と描いておき、Drawメソッドで、

Vector2 origin = new Vector(guruguruTexture.Width / 2, guruguruTexture.Height / 2);
spriteBatch.Draw(guruguruTexture, Position, null, Color.White, angle, origin, 1f, SpriteEffects.None, 0f);

とすると、更新された角度でぐるぐるが描画されます。spriteBatchのDrawメソッドの引数のうち、このポストに絡むものを説明すると、

1番目: アニメーションしたいテクスチャ画像
2番目: 描画する場所(適当に描画する場所を決めておく)
5番目: テクスチャ画像を描画する角度
6番目: 回転中心。ここではテクスチャ画像の真ん中を指定
7番目: 描画する際の拡大縮小率。1にすると同じサイズで描画

です。もし、テクスチャをブルブルさせたければ、Positionにぶるぶるを与えた様な変動をUpdateメソッドで代入すればよいし、大きくしたり小さくしたりしたい場合には、7番目の引数をUpdateで適宜設定してやれば、OKです。

例えばゲームを開発する場合など、複数の場所に対してこのぐるぐるアニメーションを適用したい場合もあるでしょう。ですから実用を考えて、以下のようなクラスを作ると便利。

using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.Graphics;

class RotateAnimation
    {
        Texture2D spriteStrip;
        float scale;
        Color color;
        public bool Active;
        public Vector2 Position;
        public float deltaRotateAngle;
        private Vector2 origin;
        private int frameCount;

private int currentFrame;

public void Initialize(Texture2D texture, Vector2 position,
            float deltaRotateAngle,
            int frameCount,
            Color color, float scale)
        {
            this.color = color;
            this.scale = scale;
            this.Position = position;
            this.deltaRotateAngle = deltaRotateAngle;
            this.frameCount = frameCount;

spriteStrip = texture;
            elapsedTime = 0;

Active = true;

origin.X = spriteStrip.Width / 2;
            origin.Y = spriteStrip.Height / 2;

currentFrame = 0;
        }

private float rotateAngle = 0;

public void Update(TimeSpan elapsedGameTime)
        {
            rotateAngle += deltaRotateAngle * (float)elapsedGameTime.TotalSeconds;
            if (rotateAngle > System.Math.PI * 2)
            {
                rotateAngle -= (float)(System.Math.PI * 2);
            }
            if (frameCount > 0)
            {
                currentFrame++;
                if (currentFrame >= frameCount)
                {
                    Active = false;
                }
            }
        }

public void Draw(SpriteBatch spriteBatch)
        {
            if (Active)
            {
                spriteBatch.Draw(spriteStrip, Position, null, Color.White, rotateAngle,
                    origin, scale, SpriteEffects.None, 0f);
            }
        }
    }

このクラスは、Initializeメソッドの引数でframeCountを0にすると、ずっと回転し、1以上にすると、Updateがその指定回数だけコールされると、Activeがfalseに設定し、規定回数分アニメーションを実行したことがわかるようになっています。

Game1クラスのメンバーに、このクラス用のコンテナを宣言し、

private List<RotateAnimation> rotateAnimations = new List<RotateAnimation>();

Game1のUpdateメソッドの中で、このリストに登録されたぐるぐるアニメのUpdateメソッドをコールし、このぐるぐるアニメーションが必要と条件判断がなされたところで、リストに追加するという処理を加えます。

foreach (var guruguruA in guruguruAnimation)
{
    guruguruA.Update();
}


// 以下適切な場所で、
RotateAnimation guruguru = new RotateAnimation();
guruguru.Initialize(guruguruTexture, position, 20, 100, Color.White, 1.0f);
guruguruAnimations.Add(guruguru);

とし、Game1クラスのDrawの中で、

for (int i = guruguruAnimations.Count ; i >= 0 ; i--)
{
    if (guruguruAnimations[i].Active)
    {
        guruguruAnimations[i].Draw(spriteBatch);
    }
    else
    {
        guruguruAnimations.RemoveAt(i);
    }
}

と書けば、Activeなぐるぐるのみ描画して、既に規定回数描画したものは、リストから削除される訳です。
ゲーム等の色づけでのワンポイントアクセントとしてお使いください。

转载于:https://www.cnblogs.com/iphone6/archive/2011/11/17/2252098.html

Windows Phone XNAでアニメーション - ぐるぐる相关推荐

  1. Windows Phone 7 XNA开发之关于图形的配置

    相对于以前的XNA开发,在Windows Phone 7的XNA项目中关于图形的开发有了一些新的变化需要我们关注,否则会出现一些不必要的麻烦. 我们知道XNA游戏开发可以针对不同的平台进行,比如说Wi ...

  2. 马宁的Windows Phone 7开发教程(3)——XNA下使用MessageBox和软键盘

    作者:马宁 相信未来一段的业余时间,我都要和XNA为伍了.本来想向3D开发的纵深发展,但是遇到了一个实际的问题,就是如何在XNA下显示MessageBox和Software Input Panel.干 ...

  3. 分享Silverlight/WPF/Windows Phone一周学习导读(1月17日-1月23日)

    上周微软Silverlight团队发布"微软发布Silverlight Native Extensions 1.0 - 扩展OOB应用功能",对于Silverlight开发人员而言 ...

  4. 分享Silverlight/WPF/Windows Phone一周学习导读(1月9日-1月16日)

    分享Silverlight/WPF/Windows Phone上周学习导读. 本周Silverlight学习资源更新: Prism 4学习笔记之Module Jason Li WPF/Silverli ...

  5. 本文将引导你使用XNA Game Studio Express一步一步地创建一个简单的游戏

    本文将引导你使用XNA Game Studio Express一步一步地创建一个简单的游戏 第1步: 安装软件 第2步: 创建新项目 第3步: 查看代码 第4步: 加入一个精灵 第5步: 使精灵可以移 ...

  6. 入门版XNA开发套件供玩家开发X360游戏

    美国微软于8月13日发表针对业余创作者所设计的游戏开发套件"XNA Game Studio Express",提供没有专门开发器材的一般PC Windows XP使用者开发跨Xbo ...

  7. XNA Game的基础

    Windows Game XNA基础: 添加Camera: 点击鼠标右键,新建项,选择GameComponent,重命名为Camera.cs. 在Camera类中添加两个类级变量(自动实现属性)来表示 ...

  8. XNA游戏:重力感应

    Windows Phone XNA游戏提供的重力传感器可以利用量测重力的原理判手机移动的方向,允许使用者利用摇动或甩动手机的方式控制游戏的执行,其原理和汽车的安全气囊相同,在侦测到汽车快速减速的时候立 ...

  9. 整理Windows Phone 7教程(很全面)

    前言 离Windows Phone 7正式发布已过去几个月了,但国内关于Windows Phone 7的中文书籍资料太少了,大多数是英文资料,一本真正的中文开发教程书都没有, 要啃英文资料对大部分的开 ...

最新文章

  1. 行人被遮挡问题怎么破?百度提出PGFA新方法,发布Occluded-DukeMTMC大型数据集 | ICCV 2019...
  2. C# Task 循环任务_理解C#中的ValueTask
  3. 【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
  4. Linux 解决ssh连接慢的问题
  5. php mysql备份还原类_PHP实现MYSQL备份还原
  6. 非线性动力学_非线性动力学特辑 低维到高维的联通者
  7. ECMAscript6(ES6)新特性语法总结(一)
  8. 实现拷贝函数(strcpy)
  9. C++编程技术之 异常处理(上)
  10. CDH中impala 的查询返回部分结果。 已超出 199 流查询的时间序列流限制。
  11. 51Nod-1002 数塔取数问题【DP】
  12. [原创] 若水新闻安卓客户端开发教程笔记
  13. 如何使用String获取字符串中某一个字符后面的所有字符?
  14. 如何安全的使用密码登录账号(在不知道密码的情况下)
  15. 高中计算机网络技术应用教案,高中信息技术选修3《网络技术应用》教案.doc
  16. redis雪崩 击穿 穿透
  17. 行业解读 | 什么是人工智能语音技术?一篇文章让你读懂它
  18. POI导出Excel时 设置单元格类型为 数值类型 或者文本类型
  19. Android 中轴时光轴
  20. 公链Sui Layer1网络

热门文章

  1. linux java运行环境_linux(centos)中java运行环境_jdk安装与配置 | OPS技术联盟
  2. 小数点后最多几位_一个“90后”女生的月账单,花得最多的果然是这个
  3. vscode git使用_vscode中使用git
  4. -bash: locate: command not found
  5. ActiveMQ 认证
  6. Android开发笔记(一百六十四)仿京东首页的下拉刷新
  7. arc科学计算机在线应用使用,ArcMap字段计算器(Field Calculator)的妙用
  8. ActiveMQ, RabbitMQ和ZeroMQ 选型关注点
  9. UIKit 框架之UIControl
  10. Shadow Map阴影贴图技术之探 【转】