2011-06-13 6 views
2

누군가 올바른 방향으로 나를 가리킬 수 있는지 궁금합니다.Java/Android 글 머리 기호 개체 흐름

글 머리 기호와 같은 개체를 정적 위치에서 화면의 모든 영역으로 애니메이션 할 수 있기를 원합니다.

간단한 가로 및 세로 움직임에는 아무런 문제가 없습니다. 나는. x +/- 1 또는 y +/- 1 그러나 글 머리 기호와 같은 객체가 움직일 수있는 경우에는 애니메이션을 매끄럽게 보이게 만드는 방법을 잘 모릅니다. 예를 들어 18, 45 또는 33도 각도에서 y + 1, x + 1, y + 1 .....과 같은 알고리즘을 사용하면 애니메이션이 매우 매끄럽게 진행되지 않습니다.

미리 감사드립니다.

P.s 어쩌면 이미 몇 가지 문서가 있습니까?


업데이트 응답 한 모든 사람에게

감사합니다.

이것은 귀하의 의견을 기반으로 작성한 코드입니다.

package com.bullet; 

//imports go here 

public class canvas extends SurfaceView implements OnTouchListener, SurfaceHolder.Callback{ 

    private Bitmap bullet; 
    private int bulletStartX, bulletStartY; 
    private int bulletX, bulletY; 
    private int bulletEndX = -1; 
    private int bulletEndY = -1; 
    private int incX = 0; 
    private int incY = 0; 

    private SurfaceHolder holder; 
    private Thread t; 


    public canvas(Context context) { 
     super(context); 

     this.setBackgroundColor(Color.WHITE); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
     setOnTouchListener(this); 

     bulletStartX = 0; 
     bulletStartY = 0; 

     bulletX = bulletStartX; 
     bulletY = bulletStartY; 

     bullet = BitmapFactory.decodeResource(getResources(), R.drawable.bullet); 

     holder = getHolder(); 
     holder.addCallback(this); 
    } 

    public void onDraw(Canvas canvas){ 
     if(bulletEndX != -1 && bulletEndY != -1){ 
      Log.e("here", "drawing bullet"); 
      Log.e("here", "x: " + bulletX + ", y: " + bulletY); 
      canvas.drawBitmap(bullet, bulletX, bulletY, null); 
     } 
    } 

    public void updateBullet(){ 

     Log.e("here", "inc bullet"); 

     bulletX += incX; 
     bulletY += incY; 

     if(bulletX > bulletEndX){ 
      bulletEndX = -1; 
     } 

     if(bulletY > bulletEndY){ 
      bulletEndY = -1; 
     } 

    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     int[] coordinates = {(int) event.getX(), (int) event.getY()}; 
     int motion = event.getAction(); 


     switch(motion){ 
      case MotionEvent.ACTION_DOWN: 

       break; 
      case MotionEvent.ACTION_MOVE: 

       break; 
      case MotionEvent.ACTION_UP: 
       bulletX = bulletStartX; 
       bulletY = bulletStartY; 
       bulletEndX = (int) event.getX(); 
       bulletEndY = (int) event.getY(); 
       incX = (int) bulletEndX/50; 
       incY = (int) bulletEndY/50; 
       Log.e("here", "touch up"); 
       break; 
     } 


     return true; 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     t = new GameThread(this, holder); 
     t.start(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    //Thread class 
    class GameThread extends Thread{ 
     private canvas canvas; 
     private SurfaceHolder holder; 
     private boolean run = false; 
     long delay = 70; 

     public GameThread(canvas canvas, SurfaceHolder holder){ 
      this.holder = holder; 
      this.canvas = canvas; 
      startThread(true); 
     } 

     public boolean isRunning(){ 
      return this.run; 
     } 

     private void startThread(boolean run){ 
      this.run = run; 
     } 

     public void stopThread(){ 
      this.run = false; 
     } 

     @Override 
     public void run(){ 
      while(run){ 
        Canvas c = null; 
        try { 
          //lock canvas so nothing else can use it 
          c = holder.lockCanvas(null); 
          synchronized (holder) { 
           //clear the screen with the black painter. 
           //This is where we draw the game engine. 
           //Log.e("drawthread", "running"); 
           if(bulletEndX != -1 && bulletEndY != -1){ 
            updateBullet(); 
            canvas.postInvalidate(); 
           } 
           canvas.onDraw(c); 

           //Log.e("drawthread", "ran"); 
           try { 
            sleep(32); 
            //Log.e("slept", "sleeping"); 
           } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
         } 
        } finally { 
         // do this in a finally so that if an exception is thrown 
         // during the above, we don't leave the Surface in an 
         // inconsistent state 
         if (c != null) { 
          holder.unlockCanvasAndPost(c); 
         } 
        } 
      } 
     } 
    } 
} 

그림은 꽤 잘 작동하지만 두 가지 문제점이 있습니다.

1 도면이 자바의 예처럼 뭔가에 비해 ... 매우 느리고 불안해입니다

2 클릭이 인해 다음 Y = 0 가까이있는 위치에있는 경우 http://www.youtube.com/watch?v=-g5CyPQlIo4

ENDY/FRAME의 값이 1보다 작 으면 반올림이 0으로되고 총알이 Y에서의 증가가 아니라 화면 상단을 가로 질러 이동 함을 의미합니다.

@ SyntaxT3rr0r 귀하의 권리는 prob입니다. 그것에 대해 갈 수있는 가장 좋은 방법입니다. 그러나 이와 같은 것을 구현하는 데 필요한 모든 문서를 알고 있습니까? 다시

+1

화면 좌표! = 세계 좌표. 게임은 일반적으로 임의의 좌표계를 사용하고 객체를 화면 좌표로 변환하여 화면에 적용합니다 (예 : 온라인 * 스타 크래프트 2 * 대 1280x960 또는 1600x1200의 상대와 비교할 수 있습니다 * 상대방의 yota를 바꿉니다. 왜냐하면 당신은 여전히 ​​동일한 임의의 게임 좌표계로 게임하고 있기 때문입니다. 총알 위치를 화면 좌표보다 큰 좌표계로 계산하십시오. 그것은 초보자를위한 것일 뿐이므로 답변이 아닙니다. – SyntaxT3rr0r

+0

updated 내 게시물 – Stevanicus

답변

1

내가이는 현재 양식의에 대답 할 수 있다고 생각하지 않습니다. 먼저 애니메이션을 어떻게 만드나요? 그래픽 API를 사용하고 있습니까? GL? AndEngine?

그래픽 API가있는 경우 적절한 각도로 캔버스를 회전하고 글 머리 기호를 y 축 위로 이동합니다.

GL의 경우 똑같은 작업을 수행 할 수 있습니다.

를 들어 엔진, 나의 이해는 당신이 애니메이션에 고유의 구현 세부 사항에 대해 물어와 달리, 프레임 당 총알을 이동하는 방법에 대해 많은 X & Y 픽셀을 결정하는 방법을 요구하고 있다는 것입니다 tutorials.

+0

내 게시물 업데이트 – Stevanicus

2

참조 Android에서

짧은 대답 : 총알의 예와 P 을 : 수학으로 공격

- 당신은 애니메이션을 절단 할 수 있습니다 ", 100 개 프레임으로 애니메이션을 나누는 우리만큼 빠르게 재생할 수 있습니다. "또는"약 2 초 후에 애니메이션을 재생하십시오. 가능한 한 2 초 이내에 많은 프레임을 부셔 라. " 저는 전자를 설명 할 것입니다. 왜냐하면 그것은 여러분이하려고하는 것처럼 들리기 때문입니다.

시작 X & Y 및 끝 X로 시작하십시오. & Y : 0,0에서 200,400으로 이동하려는 것으로 가정하고 약 100 프레임의 애니메이션에서 수행하려고합니다.

X 축을 따라 이동 한 총 거리를 프레임 수로 나눕니다. Y 축을 따라 총 거리를 동일하게하십시오. 이제 각 프레임 당 x & y를 이동할 거리가 있습니다. 이 예에서는 총알이 가로로 200 픽셀 (100 픽셀) 당 2 픽셀, 세로로 4 픽셀 (400 픽셀/100 프레임) 이동하려고합니다. 따라서 모든 프레임에 x + = 2, y + = 4를 추가하십시오.

+0

내 게시물 업데이트 – Stevanicus

관련 문제