2011-03-26 7 views
0

배경으로 다른보기의 생성자 안에 bmp와 함께 약간의 스프라이트를 만들고 있습니다. 그러나 스프라이트를 클릭하면 onClickListener가 있는데, 클릭하는 뷰가 백그라운드 뷰입니다.onClick hierachy

일부 코드 :

내 생성자 :

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

    moles = new ArrayList<MoleSprite>(); 
    setFocusable(true); 
    setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Log.i(tag, "Click en GameView"); 

     } 
    }); 

    gameLoopThread = new GameLoopThread(this); 

    int id = 0; 
    for(int x = 0; x<3; x++){ 
     for(int y = 0; y<4 ; y++){ 

      MoleSprite mole = new MoleSprite(this, x*WIDTH/3, HEIGHT/6+y*HEIGHT/6, FRONT); 
      mole.setId(id); 
      id++; 
      moles.add(mole); 
     } 
    } 

    holder = getHolder(); 
    holder.addCallback(new Callback() { 

     @Override 
     public void surfaceDestroyed(SurfaceHolder arg0) { 
      boolean retry=true; 
      gameLoopThread.setRunning(false); 
      while(retry){ 
       try{ 
        gameLoopThread.join(); 
        retry=false; 

       }catch(InterruptedException i){ 

       } 
      } 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder arg0) { 
      gameLoopThread.setRunning(true); 

      gameLoopThread.start(); 

     } 

     @Override 
     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, 
       int arg3) { 
      // TODO Auto-generated method stub 

     } 
    }); 

} 

Sprite의 생성자 :

public MoleSprite(ToposGameView gameView, int x, int y, int direction) { 
    super(gameView.getContext()); //TODO 
    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bad1); 
    this.width = bmp.getWidth()/BMP_COLUMNS;  
    this.height = bmp.getHeight()/BMP_ROWS; 

    this.x=x; 
    this.y= y; 

    this.setClickable(true); 
    this.setFocusable(true); 
    this.setFocusableInTouchMode(true); 
    setOnClickListener(this); 
    setOnTouchListener(this); 
    //I don't know what else to do! 
    } 

그것은 내 첫 번째 질문은 더 많은 정보를 원하시면 저에게 문의하시기 바랍니다.

EDIT1가 :

public class MoleSprite extends View implements OnClickListener, OnTouchListener{ 

public class ToposGameView extends SurfaceView{ 
+0

MoleSprite의 기본 클래스는 무엇입니까? onClick에 대해 묻고 있는데, 이는 일반적으로 View 계층 구조를 가리 킵니다.하지만 뷰 계층 구조 외부의 렌더링을 나타내는 SurfaceViews를 사용하고 있습니다. 여기에는 몇 가지 연결이 끊어져 있지만 식별 하기엔 너무 적은 정보가 있습니다. – Anm

+0

아이디어는 다시 그리기가 필요한 게임을 수행하는 것이지만 onClick으로 막혔습니다. 기본 클래스로 편집합니다. – Rafaesp

답변

0

귀하의 혼합 표면보기 도면과 도면. 서페이스는 빠른 비동기 다시 그리기 (예 : 게임)에 적합하지만 View 컨테이너가 아닙니다. 즉, 이벤트 및 레이아웃에 필요한 addView 메소드가 SurfaceView에 없습니다.

이와 같이, SurfaceView에서 onClick 처리를 구현하고 스프라이트가 클릭되는 감지 (예 : 스프라이트의 x/y/너비/높이 경계 상자 내에서의 클릭 이벤트)를 수동으로 구현해야합니다.

또한 MoleSprite가 이런 식으로 사용되면 View를 확장하는 것은 의미가 없습니다. 테두리 상자와 그리기 콜백을 지원하는 스프라이트 기본 클래스를 만들고 싶습니다. OnClick (..) 인터페이스를 Spirte 기본 클래스에 추가 할 수도 있지만, 게임을 개발할 때 목록 반복을 최적화하기 위해 드로어 블/이동 가능/클릭 가능 항목에 대한 별도의 목록을 유지하고자 할 것입니다.

행운을 빈다.

+0

감사합니다! 나는 탐지를 구현할 것이다. Sprite 기본 클래스에 대해 좀 더 설명해 주시겠습니까? – Rafaesp

+0

현재 뷰 클래스를 수퍼 클래스로 사용하여 경계 사각형과 그리기 콜백을 관리하지만 언급 한 것처럼 뷰로 사용하지는 않습니다. 마치 바위를 보는 것, 힘에 영향을 줄만큼 질량이있는 움직이는 물체를 보는 것과 같아서 망치라고 부릅니다. 그것은 효과적 일 수 있지만 효율적인 해머가 아니거나 손잡이 나 못 풀러와 같은 망치에 기인 한 다른 속성을 가지고 있습니다. getX(), getY(), getWidth(), getHeight() 및 onDraw() 메서드 (필요한 경우)를 통해 정확히 원하는대로 수행 할 수있는 메서드를 사용하여 Spirte라는 기본 클래스를 만들 수 있습니다. – Anm

0

GameLoopThread가 무엇을하는지 모르지만 표면의 onDraw 메서드 및 updatePhysics 메서드를 호출해야합니다.

업데이트 물리는 스프라이트를 반복하고 현재 게임 시간과 같은 정보를 제공하므로 적절한 거리를 이동하거나 애니메이션 프레임을 변경할 수 있습니다.

나는 이런 식으로 뭔가를 사용 스프라이트 기본 클래스에 대한

(하지만 내 애니메이션, 가속도 및 기타 물건 처리) :

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // this setup will move the sprite on the screen 
    switch(event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     if(sprite.isTouched(event.getX(), event.getY()) { 
      // do your stuff 
     } 
     break; 
    case MotionEvent.ACTION_MOVE: 
     // handle the moving pointer 
     sprite.setCoords(event.getX(), event.getY()); 
     break; 
    case MotionEvent.ACTION_UP: 
     // handle the exiting pointer 
     sprite.setCoords(event.getX(), event.getY()); 
     break; 
    } 
} 
:

public class Sprite { 
    private Rect mScreenRect; 
    public Sprite() { 
     // init some stuff here, if you need it 
     // especially, somewhere in your init functions 
     // set your bounding rect 
     this.mScreenRect = Rect(xl, yt, xr, yb); 
    } 
    setStuff(int thing) { 
     // like setX(), setY() 
    } 

    // here is the good stuff 
    public boolean isTouched(int x, int y) { 
     if(mScreenRect.contains(x, y)) 
      return true; 
     else 
      return false; 
    } 
    // also include a function to draw the graphic 
    public void drawGraphic(Canvas canvas) { 
     canvas.drawBitmap(mBitmap, mScreenRect.left, mScreenRect.top, null); 
    } 
} 

그런 다음, 표면보기에 당신은을 사용할 필요를

다시 표면보기 :

다루 다른 게시물이 있습니다
@Override 
public void onDraw(Canvas canvas) { 
    sprite.drawGraphic(canvas) 
} 

더 자세한 방법으로, 그러나 이것은 당신을 시작할 것입니다.

+0

답변 해 주셔서 감사합니다. 그러나 이것은 아주 오래된 질문이며 이미 받아 들여졌습니다. 어쨌든 고마워! – Rafaesp