zoukankan      html  css  js  c++  java
  • Android开发学习——游戏开发小demo

    public class MainActivity extends Activity {
    
        private GameUI gameUI;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            gameUI = new GameUI(getApplicationContext());
            setContentView(gameUI);
        }
        
        //处理屏幕的点击事件
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // TODO Auto-generated method stub
            gameUI.handleTouch(event);
            return super.onTouchEvent(event);
        }
    
        
    }
    public class GameUI extends SurfaceView implements SurfaceHolder.Callback{
        boolean flag ;
        private RenderThread thread;
        private SurfaceHolder h;
    //-----三个对象------------------
        private Man man;
        private List<face> falist;
        private MyButton btn;
    
        public GameUI(Context context) {
            super(context);
    
            h = getHolder();
            h.addCallback(this);
        }
        
        public  class RenderThread extends Thread{
            public void run(){
                while(flag){
                    try{
                    drawUI();
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
            
    //------------------------------------------------------------------------
            
            
           //绘制界面
            private void drawUI() {
                // TODO Auto-generated method stub
                Canvas lockCanvas = h.lockCanvas();
    //--------------------绘制了一个矩形---------------------------------------            
                Paint paint = new Paint();
                paint.setColor(Color.GRAY);
    //----------绘制屏幕大小的矩形,把之前绘制的全部盖在下边---------------------
                lockCanvas.drawRect(0, 0,getWidth(),getHeight(),paint);
    //------------------------------------------------------------    -----------        
                man.drawSelf(lockCanvas);//把男孩绘制到屏幕上
    //            if(fa != null){
    //                fa.drawSelf(lockCanvas);//把笑脸绘制在界面上    
    //                fa.move();
    //            }
                for(face fa : falist){
                    fa.drawSelf(lockCanvas);//把笑脸绘制在界面上    
                    fa.move();
                    if(fa.position.x<0||fa.position.x>getWidth()||fa.position.y<0||fa.position.y>getHeight()){
                        falist.remove(fa);
                    }
                }
                
                btn.drawSelf(lockCanvas);//把按钮绘制在界面上
                
                
                h.unlockCanvasAndPost(lockCanvas);
            }
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder h) {
            
            Bitmap manbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.avatar_boy);
            man = new Man(manbitmap, new Point(0,0));//创建了 小人,还没有绘制到界面上
            falist = new CopyOnWriteArrayList<face>();//可以在集合遍历的过程中增加或者删除元素。堆内存的开销大,对数组进行了一次复制!
            
    //------------现在不在这个位置位置绘制笑脸,在小人的最上绘制------
    //        Bitmap facebitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rating_small);
    //        fa = new face(facebitmap,new Point(0,0));//创建了笑脸
    //-----------------按钮---------------------------------------------------------        
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_default);
            Bitmap pressbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bottom_press);
            btn = new MyButton(bitmap, new Point(100,getHeight()-100),pressbitmap);//创建了一个button,还没有绘制到屏幕上
            btn.setClicklistener(new MyButton.OnClickListener() {
                
                @Override
                public void click() {
                    // TODO Auto-generated method stub
                    man.move(Man.DOWN);
                }
            });
            
            thread = new RenderThread();
            flag = true;
            thread.start();
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            //一般停止线程,都是控制线程的循环
            flag = false;
        }    
        
        public void handleTouch(MotionEvent e){
            switch(e.getAction()){
            //case MotionEvent.ACTION_MOVE:
            
            //当按下的时候,绘制笑脸
            case MotionEvent.ACTION_DOWN:
                //拿到按下的xy坐标
                int x = (int) e.getRawX();
                int y = (int) e.getRawY();
                if(btn.isclick(new Point(x,y))){
                    //man.move(Man.DOWN);        
                    btn.click();
                }else{//按下的时候不显示笑脸
                    face f = man.createface(getContext(),new Point(x,y));
                    falist.add(f);
                }           
                break;
            case MotionEvent.ACTION_UP:
                btn.setIsClick(false);//当手指弹起的时候,让按钮点击的状态改为false
                break;            
            default:
                break;        
            }
        }
    }
    //精灵,所有显示界面的一个基类。
    public abstract class Sprite {
        private Bitmap defaultBitmap;//默认显示的图片
        protected Point position;//位置
        
        //放置 图片和位置 为空
        public Sprite(Bitmap defaultBitmap, Point position) {
            super();
            this.defaultBitmap = defaultBitmap;
            this.position = position;
        }
    
    
        //绘制自身 就是把图片绘制到位置上
        public void drawSelf(Canvas c){
            c.drawBitmap(defaultBitmap, position.x,position.y, null);
        }
    
    }
    public class Man extends Sprite {
    
        public static final int DOWN=0;
        public Man(Bitmap defaultBitmap, Point position) {
            super(defaultBitmap, position);
            // TODO Auto-generated constructor stub
        }
        
        //特性方法,创建笑脸
        public face createface(Context c,Point touchpoint){
            
            Bitmap facebitmap = BitmapFactory.decodeResource(c.getResources(), R.drawable.rating_small);
            face fa = new face(facebitmap,new Point(position.x+50,position.y+50),touchpoint);//创建了笑脸,在小人的坐标上刚好到嘴的地方绘制笑脸。
            
            
            return fa;
            
        }
        
        public void move(int d){
            if(d == DOWN){
                this.position.y += 6;
            }
        }
    
    }
    public class face extends Sprite {
    
        //移动的距离是一个固定的值
        int speed = 6;
        private int tx;
        private int ty;
        public face(Bitmap defaultBitmap, Point position,Point touch) {
            super(defaultBitmap, position);
            // TODO Auto-generated constructor stub
            int x = touch.x - position.x;
            int y = touch.y - position.y;
            int d = (int) Math.sqrt(x*x+y*y);
            tx = speed*x/d;
            ty = speed*y/d;
            
            
            
        }
        
        //笑脸移动的方法
        public void move(){
            this.position.x += tx;
            this.position.y += ty;
        }
    
    }
    public class MyButton extends Sprite {
    
        private OnClickListener clicklistener;
        public interface OnClickListener{
            void click();
        }
        
        public void setClicklistener(OnClickListener clicklistener) {
            this.clicklistener = clicklistener;
        }
        
        //当按钮被点击的时  调用此方法
        public void click(){
            if(clicklistener!=null){
                clicklistener.click();
            }
        }
    
        private boolean isclick;//按下的状态
        private Bitmap pressBit;
        public MyButton(Bitmap defaultBitmap, Point position,Bitmap pressBit) {
            super(defaultBitmap, position);
            // TODO Auto-generated constructor stub
            this.pressBit = pressBit;
        }
        
        
        
        
        public void setIsClick(boolean isClick){
            this.isclick = isClick;
        }
    
        public void drawSelf(Canvas c){
            if(isclick){
                //绘制一个按下的图片
                c.drawBitmap(pressBit, position.x,position.y, null);
            }else{
                super.drawSelf(c);//绘制默认的图片
            }
        }
        
        //判断 手指按下的点  是否 在 当前按钮的  图片之中
        public boolean isclick(Point touchpoint){
            //创建了一个矩形,当前按钮的矩形
            Rect rect = new Rect(position.x,position.y,position.x+pressBit.getWidth(),position.y+pressBit.getHeight());    
            //如果包含,就为点击
            isclick = rect.contains(touchpoint.x,touchpoint.y );
            return isclick;        
        }
    
    }

  • 相关阅读:
    typedef void (*funcptr)(void) typedef void (*PFV)(); typedef int32_t (*PFI)();
    STM32 STM32F4 寄存器怎么配置不上, 无法往寄存器写入数据
    GPIO
    JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)
    jquery自带的排序方法(js也是)
    GET和POST是HTTP请求的两种基本方法,区别是什么!?
    springboot特性
    restful风格接口类型和优点
    提升必看!!!
    分组函数 partition by 的详解,与order by 区别
  • 原文地址:https://www.cnblogs.com/mengxiao/p/6612714.html
Copyright © 2011-2022 走看看