Неопределенное количество падающих изображений ... Отображение на SurfaceView ПОМОЩЬ! - PullRequest
2 голосов
/ 27 марта 2011

Я думаю, что попал в блок кодеров.Я пишу игру, в которой несколько изображений будут падать с верхней части экрана, а вы должны ловить их внизу.Количество изображений будет неопределенным, поэтому вы не знаете, сколько их будет в момент запуска.За свою жизнь я не могу понять, как это реализовать.Я понимаю логику, но у меня возникают проблемы с прохождением классов Android.Я пытался создать свой собственный «цветущий» объект, но каждый раз, когда я пытаюсь написать что-либо, имеющее отношение к растровому изображению внутри него, он выходит из себя.Может быть, я просто пишу неправильно, я не знаю.Все это выполняется на SurfaceView.Есть ли у кого-нибудь идеи, как этого добиться?Вот мой код:

    public class BoardView extends SurfaceView implements SurfaceHolder.Callback{
    Context mContext;


    Bitmap box = 
        (BitmapFactory.decodeResource
                (getResources(), R.drawable.box));

    Bitmap blossom = 
        (BitmapFactory.decodeResource
                (getResources(), R.drawable.blossom));

    private BoardThread thread;
    private float box_x = 140;
    private float box_y = 378;
    private float blossom_x = 0;
    private float blossom_y = 0;
    private float boxWidth = box.getWidth();
    private float boxHeight = box.getHeight();
    private float blossomWidth = blossom.getWidth();
    private float blossomHeight = blossom.getHeight();
    private Random generator = new Random();



    boolean mode = false;

    RectF boxRect = new RectF(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
    //ImageView box_view;

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

        //surfaceHolder provides canvas that we draw on
        getHolder().addCallback(this);

        // controls drawings
        thread = new BoardThread(getHolder(),this);

        //draws the blossom at a random starting point
        blossom_x = generator.nextInt(300);


        //box_view = (ImageView)findViewById(R.id.box_view);
         //box_view.setVisibility(ImageView.VISIBLE);
         //TranslateAnimation anim = new TranslateAnimation(0,0,300,0);
         //anim.setDuration(500);
         //box_view.startAnimation(anim);

        //intercepts touch events
        setFocusable(true);

    }


    @Override

    public void onDraw(Canvas canvas){
        canvas.drawColor(Color.WHITE);  


        //draw box and set start location
        canvas.drawBitmap(box, box_x - (boxWidth/2), 
                box_y - (boxHeight/2), null);

            canvas.drawBitmap(blossom, blossom_x,
                blossom_y = blossom_y+3 , null);

        //collision detection, currently not working after 
            //implementing random draw
            if(blossom_y + blossomHeight == box_y)
        {
            canvas.drawBitmap(blossom, 40,100, null);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){

        if(event.getAction() == MotionEvent.ACTION_DOWN){
            if(boxRect.contains(event.getX(),event.getY())){
                mode = true;
            }
        }

        if(event.getAction() == MotionEvent.ACTION_MOVE) {
            if(boxRect.contains(event.getX(),event.getY())){
                mode = true;
            }
            if(mode == true){
                box_x = (int)event.getX();
                boxRect.set(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
            }

        }

        if(event.getAction() == MotionEvent.ACTION_UP){
            mode = false;
        }

        invalidate();

        return true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, 
            int format, int width, int height ){

}

    @Override
    public void surfaceCreated(SurfaceHolder holder){
        thread.startRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder){
        thread.startRunning(false);
        thread.stop();
    }
}

В настоящее время я использую растровое изображение для рисования падающего цветка.Вместо этого я начал создавать класс для объекта flower, который до сих пор выглядит следующим образом:

    public class Blossom{
    private Bitmap blossom;

    public Blossom()
    {
        Bitmap blossom = 
            (BitmapFactory.decodeResource
                    (getResources(), R.drawable.blossom));
    }
    public void setImage(Bitmap bitmap)
    {
        //sets the image for the blossom;
        Bitmap blossom = bitmap;
    }
}

Он продолжает выдавать ошибку, говоря, что getResources не определен для класса Blossom.Когда я пытаюсь написать метод setImage и выполнить настройку Image в классе BoardView, он мне вообще не даст :( Это выглядело примерно так

    public class Blossom{
    private Bitmap blossom;

    public void setImage(Bitmap bitmap)
    {
        //sets the image for the blossom;
        Bitmap blossom = bitmap;
    }
}

Кто-нибудь может увидеть, чтоздесь идет не так?

1 Ответ

1 голос
/ 27 марта 2011

Поскольку ваш класс расширяется SurfaceView, вы должны делать getContext().getResources()

Редактировать - если вы хотите использовать getResources в своем другом классе, то вам также необходимо передать Context. Вместо этого вы можете просто передать свой Bitmap вместо того, чтобы пытаться получить его из этого класса данных.

...