iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
0
Mobile Development

Android的30天學習歷程系列 第 24

第24篇:遊戲搖桿製作(2)(移動偵測)

  • 分享至 

  • xImage
  •  

前言

我是要做一台車子當方向鍵,但發現button無法同時案複數以上的,所以改以遊戲搖桿的方式製作

操作

第一種:先製造一個背景為透明的圓形圖片,並將圖片放入 drawable

package com.example.testr;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
public class Move {
    public static MainActivity main;
    private float x1,y1;
    private float x2,y2;
    private final float r1,r2;
    public float angle;
    public boolean down=false;
    public boolean in=false;
    public boolean move=false;
    public Bitmap img;
    public static RectF rectf=new RectF();
    public Move(){
        r1 = 480 * 0.5f * transfer.bili;//這個是外圈的半徑大小計算
        r2 = 300 * 0.5f * transfer.bili;//這個是內圈的半徑大小計算
        img= BitmapFactory.decodeResource(main.getResources(),R.drawable.test);
        //BitmapFactory.decodeResource(加載圖的資源文件的對象,加載圖的Id)
        //BitmapFactory.decodeResource(同上,同上,加載的位圖是否需要完整顯示)
        //放入已經製作好的搖桿圖
    }
    
   public void down(float bigx,float bigy){ //摇杆按下后的操作
        if(bigx<r1) x1=r1;
        else x1 = bigx;

        if(transfer.h-bigy<r1) y1=transfer.h-r1;
        else y1 = bigy;
        //這裡是預防案的太接近預設的邊界,
        down=true;
    }
    //按下摇杆后移动的操作
    public void move(float xx,float yy){ 
    //傳值到自製的 class 計算角度
        angle=getAngle(xx,yy);
        //傳值到自製的 class 偵測小圓是否超出大圓的大小
        in=in(xx, yy);
        //傳值到自製的 class 移動時的操作
        move=isMove(xx,yy);
        if (!in) {
            xx= (float) (x1+ Math.sin(angle)*r1*0.7f);
            yy= (float) (y1+ Math.cos(angle)*r1*0.7f);
        }
        x2=xx;
        y2=yy;
    }
    //手指放開後的控制
    public void up(){ 
        down=false;
    }

    public float getAngle(float xx,float yy){ //获取x1y1指向x2y2的角度
        double angle,k;
        if (y1==yy)//斜率不存在的時候
            if (x1 > xx)//判断x1指向x2的方向
                angle=-Math.PI/2;
            else
                angle=Math.PI/2;
        else{
            k=(x1-xx)/(y1-yy); 
            if (y1 > yy) {//判断大圓指向小圓的方向
                angle=Math.atan(k) + Math.PI;
            } else {
                angle=Math.atan(k);
            }
            if(angle>Math.PI)
                angle-=Math.PI*2;
            else if(angle<-Math.PI)
                angle+=Math.PI*2;
        }
        return (float) angle;
    }

    public boolean in(float xx, float yy) {
    //計算按的位置減去原本的中心位置得出離中心有多遠
        double r = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));
        //上面計算的值不超過大圓半徑的70%
        if (r < r1*0.7f)
            return true;
        else return false;
    }
    
    //判斷按下搖桿後 是否移動,如果距離大於r1*0.15視為移動
    public boolean isMove(float xx, float yy) { 
        // MY实际开发中用到,该教程用不到此变量
        double r = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));
        if (r > r1*0.15f)
            return true;
        else return false;
    }
    public void onDraw(Canvas g, Paint p){ 
        if(down) { 
           //大圓的邊界設定
            rectf.left = x1 - r1;
            rectf.top = y1 - r1;
            rectf.right = x1 + r1;
            rectf.bottom = y1 + r1;
            g.drawBitmap(img, null, rectf, p); 
            //小圓的邊界設定
            rectf.left = x2 - r2;
            rectf.top = y2 - r2;
            rectf.right = x2 + r2;
            rectf.bottom = y2 + r2;
            g.drawBitmap(img, null, rectf, p); 
            //g.drawBitmap(圖片bitmap, 繪製圖片的哪一部分, 圖片繪畫的位置, 畫筆Paint); 
        }
    }
}

上一篇
第23篇:遊戲搖桿製作(1)(橫屏限制與螢幕大小讀取)
下一篇
第25篇:遊戲搖桿製作(3)(點擊偵測)
系列文
Android的30天學習歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言