2

I think I have hit a coders block here. I am writing a game where multiples images will fall from the top of the screen and you have to catch them at the bottom. There will be an indeterminate number of images, so you don't know how many there will be upon start time. For the life of me I CANNOT figure out the way to implement this. I understand the logic, but am having trouble trucking through Android's classes. I tried to create my own "blossom" object, but every time I try to write anything having to do with a bitmap inside of it, it freaks out. Maybe I'm just writing the class wrong, I don't know. All of this is being performed on a SurfaceView. Is there anybody who has any ideas on how to accomplish this? Here is my code thus far:

    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();
    }
}

I am currently using a bitmap to draw the falling flower. I started making a class for the flower object instead, which so far looks like this

    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;
    }
}

It keeps giving me an error saying getResources is undefined for the Blossom class. When I try to write a method called setImage, and do the setting of the Image in the BoardView class, it won't let me at all :( It looked something like this

    public class Blossom{
    private Bitmap blossom;

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

Can anybody see what is going wrong here?

MByD
  • 135,866
  • 28
  • 264
  • 277
Hani Honey
  • 2,101
  • 11
  • 48
  • 76
  • did you mean to have both a local variable Bitmap blossom and a field Bitmap blossom in your Blossom class? – katsharp Mar 27 '11 at 18:19

1 Answers1

1

Since your class extends SurfaceView, you should be doing getContext().getResources()

Edit - if you want to use getResources in your other class, then you need to pass in a Context as well. You might instead just pass in your Bitmap instead of trying to fetch it from that data class.

Matthew
  • 44,826
  • 10
  • 98
  • 87