java - 需要 OOP 和继承建议

标签 java android oop inheritance

请注意,下面发布了很多代码,但大部分都是一样的,这就是我正在寻找的建议:)

刚刚掌握 OOP 和继承,我正在制作一个 android pong 克隆,我正试图将我的“paddle”和“bomb”类中的一堆重复代码分离成一个单独的类称为 Sprite 。我不确定的是如何处理当前在我的 bomb 和 paddle 类中的成员变量。我希望两个类中的相同变量用于相同用途,并认为应该将它们移至我的 sprite 类。但是我不确定以后在我更专业的炸弹和桨类中使用它们..我可以让他们受到保护,但这是我感到困惑的地方,因为这会让我处于一种情况,我所有更专业的类都完全共享当然是相同的变量,我绝对不想要,我只是希望他们有这些变量的副本。哦,我不知道,目前我的类(class)很简单,如果你能看一下其中两个,看看有什么相同(主要是 getters 和 setters,一个绘制方法和一个更新方法)并建议我应该如何将代码移动到我的 sprite 类,这将不胜感激!

第一个专业课,炸弹:

package biz.hireholly.pirateponggame;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;

public class Bomb {
    private Bitmap bitmap;  //image
    private int x;  //x coordinate
    private int y;  //y coordinate

    private Speed speed; //the speed with its directions

    public Bomb(Bitmap bmp, int x, int y){
        this.bitmap = bmp;
        this.x = x;
        this.y = y;
        this.speed = new Speed();
    }

    public Bitmap getBitmap(){
        return bitmap;
    }
    public void setBitmap(Bitmap bmp){
        this.bitmap = bmp;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public void setX(int x){
        this.x = x;
    }
    public void setY(int y){
        this.y = y;
    }
    public Speed getSpeed() {
        return speed;
    }
    public void setSpeed(Speed newSpeed) {
        this.speed = newSpeed;
    }

    /**
     * X&Y += current velocity * current direction
     */
    public void update(){
        x+= (speed.getXv() * speed.getxDirection());
        y+= (speed.getYv() * speed.getyDirection());
    }

    /**
     * takes the bitmap it was instantiated with.
     * Draws it to the canvas at the coordinates the bomb is at in that moment.
     * @param canvas
     */
    public void draw(Canvas canvas){

        canvas.drawBitmap(bitmap, x-(bitmap.getWidth() /2), y-(bitmap.getHeight() /2), null );

    }

    public void handleWallCollision(int viewW, int viewH){

        //check collision with right wall if heading right
        if (speed.getxDirection() == Speed.RIGHT //if going right
                && getX() + (bitmap.getWidth() /2) >= viewW){ //and the centre of the bitmap become greater than the view width
            //reverse x direction
            speed.toggleXDirection();
        }
        //check for collision with left wall if heading left
        if (speed.getxDirection() == Speed.LEFT
                && getX() - (bitmap.getWidth() /2) <= 0){
            //reverse x direction
            speed.toggleXDirection();
        }
        //check collision with  bottom wall if heading down
        if (speed.getyDirection() == Speed.DOWN
                && getY() + (bitmap.getHeight() /2) >= viewH){
            //reverse y direction
            speed.toggleYDirection();
        }
        //check collision with top wall if heading up
        if (speed.getyDirection() == Speed.UP
                && getY() - (bitmap.getHeight() /2) <= 0){
            speed.toggleYDirection();
        }
    }
    public void handlePaddleCollision(Paddle pad){
        //THIS WILL NEED TO WORK FOR BOTH PADDLES


        int paddleHalfH = pad.getBitmap().getHeight();
        int paddleHalfW = pad.getBitmap().getWidth();
        //int bombHalfW = bitmap.getWidth();
        int bombHalfH = bitmap.getHeight();

        //first check if the bombs x is within the paddles x
        if( x >= (pad.getX() - paddleHalfW) //x > paddle leftside
            && x <= (pad.getX() + paddleHalfW)) // x < paddle rightside
        {

            if((y+bombHalfH) >= (pad.getY() + paddleHalfH)) //base of bomb is touching top of paddle
            {
                speed.toggleYDirection();
            }

        }



    }

}

然后是我的 Paddle 类,里面有很多相同的东西:

package biz.hireholly.pirateponggame;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;
import android.view.MotionEvent;

public class Paddle {
    private static final String TAG = Paddle.class.getSimpleName();
    private Bitmap bitmap;  //image
    private Speed speed; //the speed with its directions

    private int x;  //x coordinate
    private int y;  //y coordinate
    private boolean touched; 

    public Paddle(Bitmap bmp, int x, int y){
        this.bitmap = bmp;
        this.x = x;
        this.y = y;
        this.speed = new Speed();
    }

    public void update(){
        //x+= (speed.getXv() * speed.getxDirection());
    }

    /**
     * takes the bitmap it was instantiated with.
     * Draws it to the canvas at the coordinates the bomb is at in that moment.
     * @param canvas
     */
    public void draw(Canvas canvas){
        //just to make things easier to read
        int halfX = bitmap.getWidth() /2;
        int halfY = bitmap.getHeight() /2;

            canvas.drawBitmap(bitmap, x-halfX, y-halfY, null );

    }

    /**
     * checks if player is touching paddle
     * @param eventx
     * @param eventy
     */
    public void handleActionDown (int eventx, int eventy){
        int extray = 20; //extra height desired so that paddle can be easily touched

        if(eventx >= (x - bitmap.getWidth()/2) && //touch within paddles width
                eventx <= (x + bitmap.getWidth()/2)){

                if ( eventy >= (y - bitmap.getHeight() + extray ) && //within height
                        eventy <= (y + bitmap.getHeight()) + extray ) {

                        setTouched(true);
                } 
                else { setTouched(false); }
        }
        else { setTouched(false); }

    }

    public void onTouchEvents(MotionEvent e, int viewW){
        //DETECT PRESS
        if (e.getAction() == MotionEvent.ACTION_DOWN){
            // delegating event handling to the paddle
            handleActionDown((int)e.getX(), (int)e.getY());
        }
        //MOVE GESTURES
        if (e.getAction() == MotionEvent.ACTION_MOVE){
            if (isTouched()){
                //paddle is being dragged

                //SETTING NEW POSITION
                setX( (int)e.getX() );

                if (getX() - (bitmap.getWidth() /2) <= 0)
                {//Left wall collision
                    setX ( 0 + (bitmap.getWidth() /2));
                }
                if (getX() + (bitmap.getWidth()/2) >= viewW)
                {//right wall collision
                    setX( viewW - (bitmap.getWidth()/2) );                  
                }

            }
        }
        //PRESS RELEASED
        if (e.getAction() == MotionEvent.ACTION_UP){
            if (isTouched()){
                //no longer being dragged
                setTouched(false);
            }
        }
    }

    public Speed getSpeed() {
        return speed;
    }
    public void setSpeed(Speed newSpeed) {
        this.speed = newSpeed;
    }

    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public Bitmap getBitmap(){
        return bitmap;
    }
    public void setBitmap(Bitmap bmp){
        this.bitmap = bmp;
    }
    public boolean isTouched() {
        return touched;
    }
    public void setTouched(boolean touched) {
        this.touched = touched;
    }
}

所以我认为 Sprite.java 应该看起来像这样..

package biz.hireholly.pirateponggame;

import android.graphics.Bitmap;
import android.graphics.Canvas;

public class Sprite {
    private Bitmap bitmap;  //image
    private int x;  //x coordinate
    private int y;  //y coordinate

    private Speed speed; //the speed with its directions

    public Bitmap getBitmap(){
        return bitmap;
    }
    public void setBitmap(Bitmap bmp){
        this.bitmap = bmp;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public void setX(int x){
        this.x = x;
    }
    public void setY(int y){
        this.y = y;
    }
    public Speed getSpeed() {
        return speed;
    }
    public void setSpeed(Speed newSpeed) {
        this.speed = newSpeed;
    }


    public void update(){
        x+= (speed.getXv() * speed.getxDirection());
        y+= (speed.getYv() * speed.getyDirection());
    }


    public void draw(Canvas canvas){

        canvas.drawBitmap(bitmap, x-(bitmap.getWidth() /2), y-(bitmap.getHeight() /2), null );

    }

}

最佳答案

i'm trying to separate out a bunch of duplicate code found in my "paddle" and "bomb" classes into a separate class called sprite. What i'm not sure about is handling the member variables currently in my bomb and paddle classes. I want the same variables in both classes for the same uses and reckon they should be moved to my sprite class. But then im not sure about using them in my more specialized Bomb and Paddle classes later on.. i could make them protected but this is where i get confused because that would leave me in a situation where all my more specialized classes are sharing EXACTLY the same variables surely, which i definitely dont want, i just want them to have a copy of those variables.. oh i don't know

它们共享相同的变量。

abstract class Sprite  { 
    protected Field a;
    protected Field b;
}

class Bomb extends Sprite { 

}

class Paddle extends Sprite { 

}

在上面的示例中,您创建的每个 Bomb 实例或 Paddle 实例都有自己的 ab。如果您确实希望他们共享一个字段,则需要将其声明为static

关于java - 需要 OOP 和继承建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8509421/

相关文章:

java - 鼠标下像素的透明度 - Java JFrame

java - Httpclient 4.0.3 随机挂起的多个帖子

c++ - 如何在两个类中双重引用子类和父类

java - 在android中将字符串解析为json

java - 测验应用程序,更改错误答案选择的错误和正确答案的按钮颜色,android

android - 如何在 Android 中更改 Activity 的标题?

android - 如何在 sysfs 的文件夹内创建文件夹

oop - 多少个参数是一个合理的数字,大对象与原子参数。面向对象编程

javascript - 在 JavaScript 上使用面向对象

java - 对 SLF4J API 的 Lambda 支持