android 初始化工具类,Android Canvas前期准备工作之初始化以及音效工具类

之前已经构建好项目,所以今天直接就是开发过程了,这一篇内容和Canavs并没有什么关系,主要是保证项目的合理性,前期模拟一个游戏的流程。

1.创建一个MainActivity,界面主要有一些基本操作

c1480142f536

未标题-1.gif

这里有2个战机提供选择,选中的携带一个动画效果,实现思路。

1.等待布局初始化完成后默认选中第一个战机

c1480142f536

Paste_Image.png

2.打开游戏的时候就有背景音乐播放,这里我们的音乐播放主要实现的类MediaPlayer

创建一个GameMusic的单例模式的类

package com.tangyx.game.util;

import android.content.Context;

import android.content.res.AssetFileDescriptor;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

/**

* Create tangyx 2016/12/20

* 背景音乐

*/

public class GameMusic implements OnCompletionListener{

private static GameMusic INSTANCE;

private Context mContext;

private MediaPlayer mMediaPlayer;

private boolean isResume;

private boolean isPlay;

public static GameMusic getInstance(Context context){

if(INSTANCE==null){

INSTANCE = new GameMusic(context);

}

return INSTANCE;

}

private GameMusic(Context ac) {

this.mContext = ac;

mMediaPlayer = new MediaPlayer();

}

/**

* 准备好播放的音乐资源

* @param musicName

*/

public void prepareMediaPlayer(String musicName){

mMediaPlayer.setOnCompletionListener(this);

AssetFileDescriptor descriptor;

try {

//音乐文件在assets文件夹下

descriptor = mContext.getAssets().openFd("dj/"+musicName);

if(descriptor!=null){

mMediaPlayer.reset();

mMediaPlayer.setDataSource(descriptor.getFileDescriptor(),descriptor.getStartOffset(),descriptor.getDeclaredLength());

mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

descriptor.close();

mMediaPlayer.prepare();

}

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 播放音乐

* @param loop

*/

public void play(boolean loop){

if(mMediaPlayer !=null){

mMediaPlayer.setLooping(loop);

mMediaPlayer.start();

isPlay =true;

}

}

/**

* 停止音乐

*/

public void stop(){

if(mMediaPlayer !=null&& isPlay){

mMediaPlayer.stop();

}

}

/**

* 暂停音乐

*/

public void pause(){

if(mMediaPlayer !=null&& isPlay){

mMediaPlayer.pause();

}

}

/**

* 暂停后继续播放

*/

public void start(){

if(mMediaPlayer !=null){

mMediaPlayer.start();

isPlay =true;

}

}

public void restart(){

mMediaPlayer.seekTo(0);

}

public void onResume(){

if(mMediaPlayer !=null){

if(isResume){

mMediaPlayer.start();

isResume = false;

}

}

}

@Override

public void onCompletion(MediaPlayer mp) {

/**

* 释放资源

*/

mp.release();

}

}

然后在onCreate直接调用即可

GameMusic.getInstance(this).prepareMediaPlayer(getString(R.string.menumusic));

GameMusic.getInstance(this).play(true);

3.点击游戏开始或者其他按钮的时候有一个点击动画以及点击音效

创建一个点击翻转的动画类GameScaleAnimation,动画类的翻转主要实现ScaleAnimation

package com.tangyx.game.util;

import android.view.View;

import android.view.animation.Animation;

import android.view.animation.Animation.AnimationListener;

import android.view.animation.ScaleAnimation;

/**

* 按钮点击反转的动画效果。

*/

public class GameScaleAnimation implements AnimationListener{

public ScaleAnimation scale0;

public ScaleAnimation scale1;

private View iv;

private boolean bol;

private int duration;

public GameScaleAnimation(int duration) {

scale0 = new ScaleAnimation(1, 0, 1, 1, 1, 0.5f, 1, 0);

scale1 = new ScaleAnimation(0, 1, 1, 1, 1, 0.5f,100, 0);

scale0.setDuration(duration);

scale1.setDuration(duration);

scale0.setAnimationListener(this);

scale1.setAnimationListener(this);

this.duration = duration;

}

/**

*

* @param duration 动画执行的时常

* @param isBol 是否执行结束

*/

public GameScaleAnimation(int duration,boolean isBol) {

scale0 = new ScaleAnimation(1, 0, 1, 1, 1, 0.5f, 1, 0);

scale1 = new ScaleAnimation(0, 1, 1, 1, 1, 0.5f,100, 0);

scale0.setDuration(duration);

scale1.setDuration(duration);

scale0.setAnimationListener(this);

scale1.setAnimationListener(this);

this.duration = duration;

this.bol = isBol;

}

public void startAnimation(View civ){

stopAnimation();

iv = civ;

iv.startAnimation(scale0);

}

public void stopAnimation(){

if(iv!=null){

iv.clearAnimation();

}

}

/**

* 动画执行完成

* @param animation

*/

@Override

public void onAnimationEnd(Animation animation) {

if(!bol){

if(animation.hashCode()==scale0.hashCode()){

iv.startAnimation(scale1);

}else{

iv.startAnimation(scale0);

}

}else{

if(animation.hashCode()==scale0.hashCode()){

iv.startAnimation(scale1);

}else{

scale0.setDuration(duration);

scale1.setDuration(duration);

iv.startAnimation(scale0);

iv.clearAnimation();

bol = false;

}

}

}

@Override

public void onAnimationRepeat(Animation animation) {

}

@Override

public void onAnimationStart(Animation animation) {

}

public boolean isBol() {

return bol;

}

public void setBol(boolean bol) {

this.bol = bol;

}

}

然后可以这样使用:

c1480142f536

C2743AB3-8477-41E6-B1C2-173B5FC25BA4.png

4.点击按钮的时候发出的声音,创建一个GameSoundPool类,主要实现GameSoundPool

package com.tangyx.game.util;

import java.util.HashMap;

import java.util.Map;

import android.content.Context;

import android.content.Intent;

import android.media.AudioManager;

import android.media.SoundPool;

/**

* 点击操作的音效

*/

public class GameSoundPool {

public static GameSoundPool INSTANCE;

public final static int LAUNCHER=0;

public final static int PLAYERBULLET=1;

public final static int GAMECLICK=2;

public final static int ENEMYCLEARA=3;

public final static int ENEMYCLEARB=4;

public final static int ENEMYCLEARC=5;

public int mVolume =15;

private SoundPool mSoundPool;

private Context mContext;

private int dex;

private Map mSoundMap;

public static GameSoundPool getInstance(Context context){

if(INSTANCE==null){

INSTANCE = new GameSoundPool(context);

}

return INSTANCE;

}

private GameSoundPool(Context context) {

mSoundPool = new SoundPool(10,AudioManager.STREAM_MUSIC, 100);

mSoundMap = new HashMap<>();

this.mContext = context;

}

/**

* add music

*/

public void addMusic(int id,int resId,int priority){

mSoundMap.put(id, mSoundPool.load(mContext, resId, priority));

}

/**

*

* @param soundId 播发音乐的编号ID map的key

* @param priority 优先级别 多个音乐一起播发的时候

*/

public void play(int soundId,int priority){

mSoundPool.play(mSoundMap.get(soundId), mVolume, mVolume, priority, 0, 1f);

}

public void clear(){

if(mSoundMap.size()>0){

while(dex< mSoundMap.size()){

if(mSoundMap.get(dex)!=null){

mSoundPool.unload(mSoundMap.get(dex));

}

dex++;

}

}

}

}

使用方式:

先加入点击的音效文件

GameSoundPool.getInstance(this).addMusic(GameSoundPool.GAMECLICK, R.raw.click,0);

触发音效

GameSoundPool.getInstance(this).play(GameSoundPool.GAMECLICK,100);

今天这一篇主要就是实现这几个工具类了,其余部分都是很简单的布局,包括一些移动动画都是直接通过API直接实现的。

SceneActivity模拟选择场景

c1480142f536

device-2016-12-20-095921.png

GameMapActivityView模拟选择游戏背景

c1480142f536

device-2016-12-20-100209.png

说了这么多,没有源码那就是耍流氓,最后附上源码

说明:源码是通过git持续更新的,每一个模块或者每一篇文章讲解完成后更新上传,所以学习是一个漫长的过程,如果你喜欢这个过程,那就一起来学习。

上一篇 下一篇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值