안드로이드 용 타일 기반 게임을 만들고 싶습니다. 지금은 각 타일을 별도의 비트 맵으로 그립니다. 문자열을 읽고 레벨을 그리는 데 어떤 문자가 있는지에 따라 다른 타일을 그려주는 큰 for 루프가 있습니다.성능 저하없이 안드로이드 게임에서 화면에 비트 맵을 많이 그리는 방법
사용자가 스크롤 동작을 사용하여 화면을 스크롤 할 수 있도록 허용했습니다. 그러나 게임은 너무 느립니다. 사용자가 스크롤 한 후 화면을 업데이트하는 데 시간이 오래 걸립니다. 각 타일의 비트 맵을 개별적으로 그려야하기 때문입니다.
레벨을 그리는 더 빠른 방법은 무엇입니까? 모든 타일을 하나의 비트 맵으로 병합 할 수 있다고 생각했습니다. 그러나 나는 이것을 어떻게하는지 모른다. 어떤 아이디어? 당신이 문제를 볼 수 있도록 어쨌든 여기
내 코드입니다 :
package org.example.tutorial2d;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import org.example.tutorial2d.Panel;
public class Tutorial2D extends Activity implements OnGestureListener {
GestureDetector gestureScanner;
Panel main;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
main = new Panel(this);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me)
{
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
main.handleScroll(distanceX,distanceY);
return true;
}
////////////////////
///////////////////
//////////////////
@Override
public boolean onDown(MotionEvent e)
{
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
return true;
}
@Override
public void onLongPress(MotionEvent e){ }
@Override
public void onShowPress(MotionEvent e) { }
@Override
public boolean onSingleTapUp(MotionEvent e)
{
return true;
}
////////////////////
///////////////////
//////////////////
}
그리고 수행하는 클래스를 모든 작업 : 전에 안드로이드를위한 프로그램 적이
package org.example.tutorial2d;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.View;
import org.example.tutorial2d.Point;
public class Panel extends View {
private int scrollX = 0;
private int scrollY = 0;
public Panel(Context context)
{
super(context);
}
@Override
public void onDraw(Canvas canvas)
{
/*Bitmap scratch;
//Drawable scratch;
//scratch = getContext().getResources().getDrawable(
// R.drawable.icon);
canvas.drawColor(Color.BLACK);
//scratch.draw(canvas);
int origin = 0;
scratch = BitmapFactory.decodeResource(getResources(), R.drawable.horizontal5);
canvas.drawBitmap(scratch, origin, origin, null);
int width = scratch.getWidth();
int height = scratch.getHeight();
scratch = BitmapFactory.decodeResource(getResources(), R.drawable.room4entrynesw3x3);
canvas.drawBitmap(scratch, origin + width, origin - 32, null);
*/
String sucide_mission =
" wwwww\n" +
" wfffw\n" +
" wfffw\n" +
" wfffw\n" +
" wwfww\n" +
" wfw\n" +
" wfw\n" +
" wfw\n" +
" wwwwwwwfwwwwwfw\n" +
" wfffffffffffffw\n" +
" wfwwwwwfwwwwwfw\n" +
" wwwww wfw wfw wfw\n" +
"wwwwwwfffwwwwwfwwwwwfwwwwwfw\n" +
"fffffffffffffffffffffffffffw\n" +
"wwwwwwfffwwwwwwwwwwwfwwwwwfw\n" +
" wwfww wfw\n" +
" wfw wfw\n" +
" wfw wfw\n" +
" wfw wfw\n" +
" wfw wfw\n" +
" wwfww wfw\n" +
" wfffwwfw fff\n" +
" wffffffw www\n" +
" wfffwwfw\n" +
" wwwww";
canvas.drawColor(Color.BLACK);
int x = 0, y = 0;
for (int i = 0; i < sucide_mission.length(); i++)
{
Bitmap tileImage;
char tile = sucide_mission.charAt(i);
Log.d("Draw tiles", Character.toString(tile) + " " + x + "," + y);
switch (tile)
{
case 'w':
if (x < tileImage = BitmapFactory.decodeResource(getResources(), R.drawable.walla);
canvas.drawBitmap(tileImage, x - scrollX, y - scrollY, null);
x += 32;
break;
case 'f':
tileImage = BitmapFactory.decodeResource(getResources(), R.drawable.floore);
canvas.drawBitmap(tileImage, x - scrollX, y - scrollY, null);
x += 32;
break;
case ' ':
x += 32;
break;
case '\n':
y += 32;
x = 0;
break;
}
}
//canvas.drawBitmap(adapt, 0, 0, paint);
//canvas.drawBitmap(corner, origin -scrollX , origin -scrollY, paint);
}
public void handleScroll(float distX, float distY)
{
// X-Axis ////////////////////////////////
if(distX > 6.0)
{
if(scrollX < 460)
{
scrollX += 30;
}
}
else if(distX < -6.0)
{
if(scrollX >= 30)
{
scrollX -= 30;
}
}
////////////////////////////////////////////
// Y-AXIS //////////////////////////////////
if(distY > 6.0)
{
if(scrollY < 100)
{
scrollY += 30;
}
}
else if(distY < -6.0)
{
if(scrollY >= 30)
{
scrollY -= 30;
}
}
////////////////////////////////////////////
if((scrollX <= 480) && (scrollY <= 120))
{
//adapt = Bitmap.createBitmap(bmp, scrollX, scrollY, 320, 480);
invalidate();
}
}
}
: 당신이보기를 사용하는, 서피스 뷰 SurfaceView는 거의 확실하게 당신이 원하는 동안. –