不确定数量的下落图像...在 SurfaceView 上显示帮助!

发布于 2024-10-27 11:16:34 字数 4292 浏览 6 评论 0原文

我想我已经遇到了编码员的障碍。我正在编写一个游戏,多个图像将从屏幕顶部掉落,你必须在底部抓住它们。图像数量不确定,因此您不知道开始时会有多少张图像。对于我的一生,我无法找出实现这一点的方法。我理解这个逻辑,但是在处理 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();
    }
}

我目前正在使用位图来绘制飘落的花朵。我开始为花对象创建一个类,到目前为止它看起来像这样

    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 的方法,并在 BoardView 类中设置 Image 时,它​​根本不允许我:( 它看起来像这样

    public class Blossom{
    private Bitmap blossom;

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

有人能看出这里出了什么问题吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

她如夕阳 2024-11-03 11:16:34

由于您的类扩展了 SurfaceView,因此您应该执行 getContext().getResources()

Edit - 如果您想使用 getResources< /code> 在您的其他类中,那么您还需要传入 Context 。您可能只是传入您的位图,而不是尝试从该数据类中获取它。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文