Android_(游戏)打飞机03:控制玩家飞机

   Android_(游戏)打飞机01:前言  传送门

   Android_(游戏)打飞机02:游戏背景滚动  传送门

  Android_(游戏)打飞机03:控制玩家飞机   传送门

控制玩家飞机效果

package com.example.administrator.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/8/9.
 */

public class dafeijiGameView extends SurfaceView implements
        SurfaceHolder.Callback,Runnable,android.view.View.OnTouchListener{

    private Bitmap my;//自己
    private Bitmap baozha;//爆炸
    private Bitmap bg;//背景
    private Bitmap diren;//敌人
    private Bitmap zidan;//子弹
    private Bitmap erjihuancun;//二级缓存
    private WindowManager windowManager;//获得界面长宽高
    private int display_w;  //界面的宽
    private int display_h;  //界面的高
    private List<GameImage> gameImage = new ArrayList();

    public dafeijiGameView(Context context) {
        super(context);
        getHolder().addCallback(this);
        //事件注册
        this.setOnTouchListener(this);
    }

    private void init(){
        //加载照片
        my= BitmapFactory.decodeResource(getResources(),R.drawable.my);
        baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha);
        bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg);
        diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren);
        zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan);

        erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
        gameImage.add(new BeijingImage(bg));    //先加入背景照片
        gameImage.add(new FeijiImage(my));
    }

    FeijiImage selectfeiji;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //手接近屏幕产生的事件
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            for(GameImage game: gameImage){
                if(game instanceof FeijiImage){

                    FeijiImage feiji = (FeijiImage)game;

                    //判断条件为真时选中飞机
                    if(feiji.getX()<event.getX()&&
                            feiji.getY()<event.getY()&&
                            feiji.getX()+feiji.getWidth()>event.getX() &&
                            feiji.getY()+feiji.getHeigth()>event.getY()){
                        selectfeiji=feiji;

                    }else{
                        selectfeiji=null;
                    }
                    break;
                }
            }
        }else if(event.getAction()==MotionEvent.ACTION_MOVE){
            //移动鼠标
            if( selectfeiji!=null){
                selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2);
                selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2);
            }

        }else if(event.getAction()==MotionEvent.ACTION_UP){
            //松开鼠标
            selectfeiji=null;
        }

        return true;
    }

    private interface GameImage{
        public Bitmap getBitmap();
        public int getX();
        public int getY();
    }

    private class FeijiImage implements GameImage{

        private Bitmap my;
        private int x;
        private int y;
        private int width;
        private int heigth;

        private int getWidth(){
            return width;
        }

        private int getHeigth(){
            return heigth;
        }

        private List<Bitmap> bitmaps = new ArrayList<Bitmap>();

        private  FeijiImage(Bitmap my){
            this.my=my;
            bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight()));
            //得到战机的高和宽
            width=my.getWidth()/4;
            heigth=my.getHeight();
            x=(display_w - my.getWidth()/4)/2;
            y=display_h-my.getHeight()-30;
        }

        private int index=0;
        private int num =0;
        @Override
        public Bitmap getBitmap() {
            Bitmap bitmap = bitmaps.get(index);
            //控制切换四个飞机的频率
           if(num == 10){
               index++;
               if(index == bitmaps.size()){
                   index=0;
               }
               num=0;
           }
            num++;
            return bitmap;
        }

        @Override
        public int getX() {
            return x;
        }

        @Override
        public int getY() {
            return y;
        }

        public void setY(int y){
            this.y=y;
        }

        public void setX(int x){
            this.x=x;
        }

    }

    //负责背景照片的处理
    private class BeijingImage implements GameImage{
        private Bitmap bg;
        private BeijingImage(Bitmap bg){
            this.bg=bg;
            newBitmap = Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
        }

        private Bitmap newBitmap = null;
        private int height = 0;

        public Bitmap getBitmap(){
            Paint p = new Paint();
            Canvas canvas = new Canvas(newBitmap);
            canvas.drawBitmap(bg,
                    new Rect(0,0,bg.getWidth(),bg.getHeight()),
                    new Rect(0,height,display_w,display_h+height),p);

            canvas.drawBitmap(bg,
                    new Rect(0,0,bg.getWidth(),bg.getHeight()),
                    new Rect(0,-display_h+height,display_w,height),p);

            height++;
            if(height==display_h){
                height=0;
            }
            return newBitmap;
        }

        public int getX(){
            return 0;
        }

        public int getY(){
            return 0;
        }
    }

    private boolean state = false;
    private SurfaceHolder holder;

    //绘画中心
    public void run() {
        Paint p1 = new Paint();
        try{
            while(true){
                Canvas newCanvas = new Canvas(erjihuancun);

                for(GameImage image:gameImage){
                    newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                }

                Canvas canvas = holder.lockCanvas();
                canvas.drawBitmap(erjihuancun,0,0,p1);
                holder.unlockCanvasAndPost(canvas);
                Thread.sleep(10);
            }
        }catch(Exception e){
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        state = false;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //得到屏幕的宽和高
        display_w=width;
        display_h=height;
        init();
        this.holder=holder;
        state = true;
        new Thread(this).start();
    }

}

dafeijiGameView.java

package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉标题
       // requestWindowFeature(Window.FEATURE_NO_TITLE);
          dafeijiGameView view =  new dafeijiGameView(this);

        setContentView(view);
    }

}

MainActivity.java

实现过程

  飞机类

    private class FeijiImage implements GameImage{

        private Bitmap my;
        private int x;
        private int y;
        private int width;
        private int heigth;

        private int getWidth(){
            return width;
        }

        private int getHeigth(){
            return heigth;
        }

        private List<Bitmap> bitmaps = new ArrayList<Bitmap>();

        private  FeijiImage(Bitmap my){
            this.my=my;
            bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight()));
            //得到战机的高和宽
            width=my.getWidth()/4;
            heigth=my.getHeight();
            x=(display_w - my.getWidth()/4)/2;
            y=display_h-my.getHeight()-30;
        }

        private int index=0;
        private int num =0;
        @Override
        public Bitmap getBitmap() {
            Bitmap bitmap = bitmaps.get(index);
            //控制切换四个飞机的频率
           if(num == 10){
               index++;
               if(index == bitmaps.size()){
                   index=0;
               }
               num=0;
           }
            num++;
            return bitmap;
        }

        @Override
        public int getX() {
            return x;
        }

        @Override
        public int getY() {
            return y;
        }

        public void setY(int y){
            this.y=y;
        }

        public void setX(int x){
            this.x=x;
        }

    }

FeijiImage.class

  

  绘制飞机动画

private List<Bitmap> bitmaps = new ArrayList<Bitmap>();

  将四张图片加入链表中

   private  FeijiImage(Bitmap my){
            this.my=my;
            bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight()));
            bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight()));
            //得到战机的高和宽
            width=my.getWidth()/4;
            heigth=my.getHeight();
            x=(display_w - my.getWidth()/4)/2;
            y=display_h-my.getHeight()-30;
        }

public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
  从原始位图剪切图像,这是一种高级的方式。可以用Matrix(矩阵)来实现旋转等高级方式截图
  

    参数说明:  传送门
    Bitmap source:要从中截图的原始位图
    int x:起始x坐标
    int y:起始y坐标
    int width:要截的图的宽度
    int height:要截的图的宽度
    Bitmap.Config  config:一个枚举类型的配置,可以定义截到的新位图的质量

  返回值:返回一个剪切好的Bitmap

 

 

  绘制飞机飞行动画(不断切换四张图片,看起来像飞机飞)

public Bitmap getBitmap() {
            Bitmap bitmap = bitmaps.get(index);
            //控制切换四个飞机的频率
           if(num == 10){
               index++;
               if(index == bitmaps.size()){
                   index=0;
               }
               num=0;
           }
            num++;
            return bitmap;
        }

  为了不冲突背景移动和飞机飞行速度,飞机图片切换慢背景图片移动的十倍

  在游戏事件中注册飞机跟随自己手指移动事件

    public dafeijiGameView(Context context) {
        super(context);
        getHolder().addCallback(this);
        //事件注册
        this.setOnTouchListener(this);
    }

  实现飞机跟随自己手指移动

 FeijiImage selectfeiji;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //手接近屏幕产生的事件
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            for(GameImage game: gameImage){
                if(game instanceof FeijiImage){

                    FeijiImage feiji = (FeijiImage)game;

                    //判断条件为真时选中飞机
                    if(feiji.getX()<event.getX()&&
                            feiji.getY()<event.getY()&&
                            feiji.getX()+feiji.getWidth()>event.getX() &&
                            feiji.getY()+feiji.getHeigth()>event.getY()){
                        selectfeiji=feiji;

                    }else{
                        selectfeiji=null;
                    }
                    break;
                }
            }
        }else if(event.getAction()==MotionEvent.ACTION_MOVE){
            //移动鼠标
            if( selectfeiji!=null){
                selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2);
                selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2);
            }

        }else if(event.getAction()==MotionEvent.ACTION_UP){
            //松开鼠标
            selectfeiji=null;
        }

        return true;
    }

原文地址:https://www.cnblogs.com/1138720556Gary/p/9454360.html

时间: 2024-08-03 23:19:28

Android_(游戏)打飞机03:控制玩家飞机的相关文章

Android_(游戏)打飞机05:处理子弹,击中敌机,添加计分板

(游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹,击中敌机,添加计分板 传送门 处理子弹,击中敌机,添加计分板效果 package com.example.administrator.myapplication; import android.content.Context; import android.graphics.Bitmap; impo

[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)

一.通过点击按钮事件,实现四大界面之间的跳转: (一)跳转的思路: 1.打开软件,只显示登录界面(隐藏游戏界面.暂停界面.玩家死亡界面) 2.点击微信登录(QQ登录)跳转到游戏界面,隐藏登录界面 3.点击暂停,弹出具有透明度的暂停界面 4.点击暂停界面的开始按钮,隐藏暂停界面,调用开始方法(点击登录跳转的方法): 5.点击暂停界面的退出游戏,只显示登录界面,隐藏其他界面: 6.游戏结束界面,该界面的跳转目前还不能通过游戏实现,可以先建设(根据上一讲的游戏界面图片制作). 7.点击游戏结束界面的开

Android_(游戏)打飞机02:游戏背景滚动

Android_(游戏)打飞机01:前言 传送门 Android_(游戏)打飞机02:游戏背景滚动 传送门 游戏背景滚动效果 package com.example.administrator.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; imp

[知了堂学习笔记]_JS小游戏之打飞机(3)-飞机之间的互相撞击,boss的出现,以及控制boss死亡

我的小飞机和敌军小飞机撞击的效果的实现: 1 /** 2 * 定义我的飞机与敌机碰撞的方法: 3 */ 4 function destoryMyPlane(){ 5 for(var i=0;i<enemyArray.length;i++){//外部先循环遍历一次敌机数组: 6 var enemyTop1=parseInt(enemyArray[i].enemyPlaneNode.style.top); 7 var enemyLeft1=parseInt(enemyArray[i].enemyPl

【Unity3D游戏开发】—— 太空大战打飞机游戏详解

大家好我是Kaven,今天给大家带来的是一个Unity3D的打飞机的小项目.俗话说"眼看千变,不如手过一边",学了差不多两星期Unity3D了,是时候找个小项目练练手了.于是就翻出了cocos2d-x的一个例子,模仿着写了一个飞机大战的游戏,虽然有一些功能没有实现,但总体上是完成了.闲话少说,下面开始吧. 由于这个用的是Unity3d自带的原生的2D插件native 2d,所以创建项目时左下角选择2d. 这个小游戏我分了三个场景,菜单场景,游戏场景,结束场景.由于菜单场景与结束场景都比

第三十九天 一乐在其中—Android的小游戏打飞机(三)飞机打子弹

8月7日,小雨."乳鸦啼散玉屏空,一枕新凉一扇风.睡起秋色无觅处,满阶梧桐月明中." 上篇已经让飞机随手指自由移动,本篇加载子弹和音效及背景音乐. 本篇要用到的几个函数讲解: 一.cocos2d的音效.背景音乐函数如下: 1.SoundEngine.sharedEngine().playSound(Context ctxt, int resId, boolean loop) 用于播放背景音乐. 2.SoundEngine.sharedEngine().playEffect(Contex

用Quick3.3简单开发微信打飞机03 添加爆炸动画和子弹与敌机的碰撞

这个就作为最后一篇吧,当然,可以扩展的方面还有很多,比如分数的记录,结算界面还有一些小道具等,就不添加了.这只是当作一个简单的入门,而在这个入门中确实学到了不少东西.而那些没添加的东西呢,其实,就没那么重要了.没有太难的知识点.所以,就没必要纠结太长时间了. 碰撞检测: 碰撞检测重新写了一个计时器,这个计时器是每帧调用的,也就是每秒调用60次.但是,没有用updata. 检测碰撞的函数如下: function GameScene:checkCollision() --这个方法处理碰撞检测,子弹和

台湾游戏制作人分享:让玩家提升游戏耐玩度的8个小技巧

转自:http://www.gameres.com/667210.html RPG 游戏有方法可以设计得更耐玩,因为制作一款稍具规模的游戏,少则数月.动辄数年,若一款游戏能玩得更久,既对制作游戏的人划算,也对买游戏的人划算了. 但我并不是鼓励一味拖台钱,而是觉得可以‘适度’延长,就像马卡龙虽然精致但一口就没了,不足以满足玩家的话也挺可惜的. 例如这款十多年前的打雪仗小游戏,虽然有趣但只有寥寥数关 既没有 Boss.也没有高分榜什么的,根本玩不过瘾哪! 以下就来分享一些我所知道的小技巧吧! 延长游

拇指接龙游戏升级记录03(升级MainScene.cpp)

MainScene是拇指接龙游戏的主游戏场景文件,拥有近5000行代码. 说实在的,实现自cocos2d-x 2.x版本向当下最新的3.8.1版本的升级过程,其中涉及的技术不是一下能够说明的.有些是形式上的简单修改,更多的则是性能上的提升相应的修改. 简单总结一下主场景文件MainScene的升级工作.主要集中在如下几个方面: 1.扑克拖动相关事件的升级修改: 这一点在网络上已经有不少细致的资料,在此不赘述,请参考后面的引文. 如今的手指移动事件操作起来要比2.x时期简化多了. 2. CCArr