Search code examples
androidandroid-studiotouchpong

Getting the touchdown to move a Rect object


I am trying to get this paddle_user to move vertically on when the screen is touched. But the paddle isn't moving. I've double checked the onTouch Code but i'm still no closer to finding out what I am doing wrong.

    package com.nblsoft.pong;

import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;



public class PongLogic extends View implements View.OnTouchListener  {

    //set screen constrains in dip
    Configuration configuration = this.getResources().getConfiguration();
    int dpHeight = configuration.screenHeightDp; //The current height of the available screen space, in dp units, corresponding to screen height resource qualifier.
    int dpWidth = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.

        //int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.


        //DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
        //float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
        //float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

    private int dptopixel(int DESIRED_DP_VALUE){

        final float scale = getResources().getDisplayMetrics().density;

        return (int)((DESIRED_DP_VALUE) * scale + 0.5f);
    }

    private int pixeltodp(int DESIRED_PIXEL_VALUE){

        final float scale = getResources().getDisplayMetrics().density;

        return (int) ((DESIRED_PIXEL_VALUE) - 0.5f / scale);
    }

    //set paddle size, speed, position vector

    int paddle_pos_x  = 4 * (dptopixel(dpWidth)/100);           //3 for 320x480, 10 for 1080x1920 etc.
    int paddle_width  =     (dptopixel(dpWidth)/10);            //
    int paddle_pos_y  =     (dptopixel(dpHeight)/10);           //48 for 320x480, 190 for 1080x1920 etc.
    int paddle_height =     (dptopixel(dpHeight)/100) + 3;      //the paddle is 100% of the total height of phone.

    int user_paddle_pos_x = 4 * (dptopixel(dpWidth)/100) ;
    int user_paddle_pos_y = dptopixel(dpHeight) - ((dptopixel(dpHeight)/10) + (dptopixel(dpHeight)/100) + 3)  ;

    //User Paddle
    public Rect paddle_user = new Rect(user_paddle_pos_x,
                                user_paddle_pos_y,
                                user_paddle_pos_x + paddle_width,
                                user_paddle_pos_y + paddle_height);

    //AI paddle
    Rect paddle_AI = new Rect(paddle_pos_x,
                              paddle_pos_y,
                              paddle_pos_x + paddle_width,
                              paddle_pos_y + paddle_height);


    //set ball position vector, Velocity vector, acceleration

    //Override onDraw method
    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);

        Paint mytext  = new Paint();
        mytext.setColor(Color.WHITE);

        // Draw Middle point
        canvas.drawRect(0, ((dptopixel(dpHeight)) / 2), (dptopixel(dpWidth)), (((dptopixel(dpHeight)) / 2) + 2), mytext);

        canvas.drawRect(paddle_user,mytext);
        canvas.drawRect(paddle_AI, mytext);


    //Practise Methods
        //canvas.drawText(Integer.toString(dptopixel(dpHeight)),300,300,mytext);
        //canvas.drawText(Integer.toString(dptopixel(dpWidth)), 400, 400, mytext);

        //canvas.drawText(Integer.toString(dpHeight),500,500,mytext);
        //canvas.drawText(Integer.toString(dpWidth),600,600,mytext);

        //canvas.drawText("Fuck", 700, 700, mytext);
        //canvas.drawRect(0,0,dptopixel(dpWidth),dptopixel(dpHeight),mytext);
    }

    //Override Touch method

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                paddle_user.offsetTo(10,0);
        }

        return true; //Event Handled
    }



    public PongLogic(Context context) {
        super(context);
        setBackgroundColor(Color.BLACK);            //to set background
        this.setFocusableInTouchMode(true);             //to enable touch mode
        this.setOnTouchListener(this);

    }



}

Solution

  • You have to implement the OnTouchListener interface and do this.setOnTouchListener(this).

    Edit:

    public class CustomClass extends View implements View.OnTouchListener{}
    

    then in your constructor you add this.setOnTouchListener(this);

    Edit2:

    Ok so I forgot to tell you but when you does some modification for exemple with you rect you have to call the draw method and to do that properly you call invalidate. So in your ontouch method add invalidate().

    here is the code that I did if you wan to check (I just cut your code to have a easier exemple):

    public class PongLogic extends View implements View.OnTouchListener {
    
    
    
    //set ball position vector, Velocity vector, acceleration
       Rect paddle_user = new Rect(0, 100, 100, 200);
    
    public PongLogic(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setOnTouchListener(this);
        setBackgroundColor(Color.BLACK);            //to set background
        this.setFocusableInTouchMode(true);
    }
    
    //Override onDraw method
    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
    
        Paint mytext  = new Paint();
        mytext.setColor(Color.WHITE);
        mytext.setStyle(Paint.Style.STROKE);
        mytext.setStrokeWidth(2);
    
        canvas.drawRect(paddle_user, mytext);
    
    }
    
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        paddle_user.offsetTo(0,0);
        invalidate();
        return false;
    }
    }
    

    So what you missed was basically the invalidate() method. So what you did in the begging was not wrong with the first OnTouch method but better to do with the interface if you make a custom view.