지금 테스트용으로 (단말기 디자이어) (2.2 API8버전)
82x82짜리 16장 png를 순서대로 돌리는데,
같은 그림을 몇개씩 더 돌리면 프레임이 낮아지고
21개정도를 동시에 돌리니
20프레임이 조금안나오네요
원래그런것인가요?
아니면 그림을 그리는데 더 효율적인방법이나
프레임을 높일 수 있는 방법이 있을까요?
+또 그림을 뒤집어 출력하는 방법이 있을까요? 오른쪽으로가는그림을 뒤집어 왼쪽으로 가는그림을 만들 수있게요.
밑은 소스입니다.
public class DrawView extends SurfaceView implements Callback
{
//선언 부
Paint paint = new Paint();
Canvas mCanvas = null;
SurfaceHolder mHolder = getHolder();
private Bitmap mImgBack0;
private Drawable ch_main[][] = new Drawable[4][16]; //캐릭터 [현재 행동] [프레임 수]
// ch_main[0] = new Drawable[6];
// ch_main[1] = new Drawable[16];
int frame=0;
//클래스 선언
Variable variable = new Variable(); //전역 변수
FrameProcess frameProcess = new FrameProcess(); //프레임 계산 클래스
public DrawView(Context context)
{
super(context);
init(context);
}
public DrawView(Context context, AttributeSet attrs)
{
super(context, attrs);
init(context);
}
public DrawView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init(context);
}
//초기화
private void init(Context context)
{
mHolder.addCallback(this);
Resources res = context.getResources();
//그림 리소스 갖기
//메인 캐릭터
//idle
ch_main[0][0] = context.getResources().getDrawable(R.drawable.ch_idle_0);
......
ch_main[0][5] = context.getResources().getDrawable(R.drawable.ch_idle_5);
//run
ch_main[1][0] = context.getResources().getDrawable(R.drawable.ch_run_0);
......
ch_main[1][15] = context.getResources().getDrawable(R.drawable.ch_run_15);
//프레임 출력 용
variable.frame = 0;
variable.second = 0;
variable.presecond = 0;
//캐릭터
//캐릭터 정보
variable.ch_action = 1; //현재 행동 (state : 0-idle, 1-run, 2-jump)
variable.ch_position[0] = 100; //포지션 X
variable.ch_position[1] = 400; //포지션 Y
//캐릭터 애니메이션 용
variable.ch_frame_limit[0] = 6; //애니메이션 수 [캐릭터]
variable.ch_frame_limit[1] = 16;
//캐릭터 애니메이션 딜레이
variable.ch_delay[0] = 10;
variable.ch_delay[1] = 2;
variable.ch_delay[2] = 0;
variable.ch_delay[3] = 0;
variable.ch_delay_frame = 0;
//그림 파일 정보
for(int roll=0; roll<2; roll++)
{
//그림 사이즈 [행동][X]
variable.ch_size[roll][0] = ch_main[roll][0].getIntrinsicWidth();
//그림 사이즈 [행동][Y]
variable.ch_size[roll][1] = ch_main[roll][0].getIntrinsicHeight();
//중심 (그림 사이즈의 반) [행동][X]
variable.ch_center[roll][0] = variable.ch_size[roll][0]/2;
//중심 (그림 사이즈의 반) [행동][Y]
variable.ch_center[roll][1] = variable.ch_size[roll][1]/2;
}
}
public void update()
{
// variable.ch_position[0]++;
//프레임 값 얻는 함수 호출 frame : 프레임값이 저장될 변수
frame = frameProcess.FramePrint(variable, frame);
//이동 테스트
// variable.ch_position[0]+=1;
frameProcess.FrameRate(variable);
//그리기 함수 호출
invalidate();
}
@Override
public void draw(Canvas canvas)
{
// TODO Auto-generated method stub
super.draw(canvas);
Rect main_position; //캐릭터를 그리기 위한 사각형 선언
//그림의 X중심, Y맨 아래가 기준점이다.
main_position = new Rect(variable.ch_position[0] - variable.ch_center[variable.ch_action][0], // X
variable.ch_position[1] - variable.ch_size[variable.ch_action][1], // Y
variable.ch_position[0] + variable.ch_center[variable.ch_action][0], // SizeX
variable.ch_position[1]);// SizeY
ch_main[variable.ch_action][variable.ch_frame].setBounds(main_position);
ch_main[variable.ch_action][variable.ch_frame].draw(canvas);
//여러 장의 그림을 동시에 출력해보기 테스트
for(int roll1=0; roll1<3; roll1++)
{
for(int roll=0; roll<7; roll++)
{
main_position = new Rect(variable.ch_position[0] - variable.ch_center[variable.ch_action][0]+ (roll*100), // X
variable.ch_position[1] - variable.ch_size[variable.ch_action][1]- (roll1*120), // Y
variable.ch_position[0] + variable.ch_center[variable.ch_action][0]+ (roll*100), // SizeX
variable.ch_position[1]- (roll1*120));// SizeY
ch_main[variable.ch_action][variable.ch_frame].setBounds(main_position);
ch_main[variable.ch_action][variable.ch_frame].draw(canvas);
}
}
canvas.drawText("Frame : "+frame, 10, 10, paint);
//갱신 함수 호출
update();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// TODO Auto-generated method stub
try
{
mCanvas = mHolder.lockCanvas(null);
draw(mCanvas);
}
finally
{
if(mCanvas != null)
{
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// TODO Auto-generated method stub
}
}