surfaceView開發遊戲初涉一

在使用surfaceView開發一個小遊戲的過程當中,遇到的一些問題記錄:java

1、使用android

    類A繼承自surfaceView,在構造函數中使用getHolder()獲得SurfaceHolder對象,SurfaceHolder能夠獲得Canvas對象,有了Canvas對象就能夠作畫圖相關的操做了。
git

   

SurfaceHolder holder = getHolder();
Canvas canvas = holder.lock();
if(canvas == null){
    return;
}
canvas.save();
    //畫圖相關操做
canvas.restore();
holder.unlockCanvasAndPost(canvas);

    以上就是surfaceView的通用使用方式了,能夠在線程中使用(這是與View的最大區別)。github

    以上代碼有幾個注意點json

        一、必須判斷canvas爲空,若是使用線程循環操做時,在應用切換到後臺,或退出應用時,canvas獲得的對象是爲空的。canvas

        二、必須爲canvas繪製背景圖,若是沒有背景圖,繪製的圖像在執行幾回循環後,就會出現重影(在這個地方被坑了半天j_0008.gif)。
微信

2、開發遊戲的時候參考了http://tanqisen.github.io/blog/2013/09/13/develop-android-wechat-flight-game-step-by-step-1/   這篇文章,博主寫的遊戲是一個小的框架,很到的體現了面向對象的思想。在這篇文章中博主的資源文件(.plist)是從微信上扣出來的。也沒有對旋轉的圖片進行處理。這裏補上個人一些處理經驗。框架

        一、plist圖像文件的生成和json字符串的生成。
ide

                生成以上文件使用了一個破解版的工具TexturePacker。在處理這個問題時一個有遊戲開發經驗的同事給了我很大的幫助。很是感謝他。函數

        二、對於在plist中被旋轉圖片的處理。

                前提是使用TexturePacker生成的json格式的文件。將http://tanqisen.github.io/blog/2013/09/13/develop-android-wechat-flight-game-step-by-step-1/的代碼下載下來後,找到GameContext中的displayArt()方法。

                

canvas.save();
		Sprite s = spriteManager.getSprite(a.sprite);
		Rect spriteFrame = a.spriteFrame();
		Rect colorRect = s.spriteColorRect;
		int left = 0,top = 0,right = 0,bottom = 0;
		if(s.isRotated()){
			int height = bmp.getWidth();
			Frame frame = s.getFrame();
			left = frame.getY()+spriteFrame.left;
			top = height-(frame.getX()+frame.getH())+spriteFrame.top;
			right = left + frame.getW();
			bottom = top + frame.getH();
			
			Matrix matrix = new Matrix();
			int px = 0,py = 0;
			px = spriteFrame.left;
			py = spriteFrame.top+height;
			matrix.setTranslate(px, py);
			matrix.postRotate(-90,px, py);
			canvas.clipRect(left, top, right, bottom);
			canvas.drawBitmap(bmp,matrix,paint);
		}else{
			left   = spriteFrame.left;
			top    = spriteFrame.top;
			right  = left + colorRect.width();
			bottom = top + colorRect.height();
			canvas.clipRect(left<viewRect.left?viewRect.left:left, top<viewRect.top?viewRect.top:top, 
					right>viewRect.right?viewRect.right:right, bottom>viewRect.bottom?viewRect.bottom:bottom);
			canvas.drawBitmap(bmp, left - colorRect.left, top - colorRect.top, paint);
		}
		canvas.restore();

這是對被旋轉順時針旋轉90度的處理方法。

        結語:

                感謝Cooper的文章分享,在進入陌生的開發領域時有一位有經驗的朋友幫助是很重要的。

相關文章
相關標籤/搜索