別のクラスからSurfaceViewにアクセスするにはどうすればよいですか?

IRGeekSauce

ゲームのスクリーンショット

船が左右に動いて弾丸を発射できる、非常にシンプルなシューティングゲームを作ろうとしています。私はここまで到達し、オブジェクトとタイプの配置を台無しにした可能性があることに気づきました。船とボタンは現在、RelativeLayout内のImageViewです。星の背景は私のSurfaceView内の唯一のものです。これは実際には「背景」ではなく、ランダムに生成されて移動しているように見えるビットマップです。

弾丸と敵というオブジェクトをさらにいくつか作成する必要があります。主な問題は、弾丸が船の座標にアクセスして、船から発射されたように見えるようにする必要があることです。

私はこれについて間違ったことをしましたか?代わりに、ボタンをビットマップとしてSurfaceViewに描画する必要がありますか?これを行うための最良の方法を知りたいのですが。

現在の状態では、船はシームレスに左から右に移動し、ボタンは色を切り替えて音を鳴らします。

これが私の2つのクラスです:

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import java.util.Random;

public class MainActivity extends Activity {

    GameView gameView;
    FrameLayout game;
    RelativeLayout widgets;
    ImageButton leftButton;
    ImageButton rightButton;
    ImageButton leftFireButton;
    ImageButton rightFireButton;
    ImageView ship;
    float shipX;
    MediaPlayer mp;
    static final int leftButtonID = 1;
    static final int rightButtonID = 2;
    static final int leftFireButtonID = 3;
    static final int rightFireButtonID = 4;
    static final int laserId = 5;
    SoundPool soundPool;
    int soundID;
    //Bitmap laser;
    //ImageView laser;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ship = new ImageView(this);
        gameView = new GameView(this);
        game = new FrameLayout(this);
        widgets = new RelativeLayout(this);
        leftButton = new ImageButton(this);
        rightButton = new ImageButton(this);
        leftFireButton = new ImageButton(this);
        rightFireButton = new ImageButton(this);
        //laser = BitmapFactory.decodeResource(getResources(), R.drawable.laser_beam);
        //laser = new ImageView(this);


        leftButton.setId(leftButtonID);
        rightButton.setId(rightButtonID);
        leftFireButton.setId(leftFireButtonID);
        rightFireButton.setId(rightFireButtonID);
        //laser.setId(laserId);


        //ship = BitmapFactory.decodeResource(getResources(),R.drawable.spaceship_1_80x70); //should this be an image or bitmap?
        //laser.setImageResource(R.drawable.laser_beam); Should be a bitmap instead?
        leftButton.setImageResource(R.drawable.left_arrow);
        rightButton.setImageResource(R.drawable.right_arrow);
        leftFireButton.setImageResource(R.drawable.red_button);
        rightFireButton.setImageResource(R.drawable.red_button);
        ship.setImageResource(R.drawable.spaceship_1_80x70);


        //add views to screen
        game.addView(gameView);
        game.addView(widgets);
        widgets.addView(leftButton);
        widgets.addView(rightButton);
        widgets.addView(leftFireButton);
        widgets.addView(rightFireButton);
        widgets.addView(ship);
        leftButton.setBackgroundColor(Color.TRANSPARENT);
        rightButton.setBackgroundColor(Color.TRANSPARENT);
        leftFireButton.setBackgroundColor(Color.TRANSPARENT);
        rightFireButton.setBackgroundColor(Color.TRANSPARENT);


        mp = MediaPlayer.create(this, R.raw.bass_loop);
        mp.setLooping(true);
        mp.start();
        loadSounds(this);


       leftButton.setOnTouchListener(new View.OnTouchListener() {
           private Handler handler;

           @Override
           public boolean onTouch(View view, MotionEvent motionEvent) {
               switch(motionEvent.getAction()) {
                   case MotionEvent.ACTION_DOWN:
                       if(handler != null) return true;
                       handler = new Handler();
                       handler.postDelayed(action,50);
                       break;
                       case MotionEvent.ACTION_UP:
                           if(handler == null) return true;
                           handler.removeCallbacks(action);
                           handler = null;
                           break;
               }
               return true;
           }
           Runnable action = new Runnable() {
               @Override public void run() {
                   shipX = ship.getX() - 25;
                   ship.setX(shipX);
                   handler.postDelayed(this,50);
               }
           };
       });
        rightButton.setOnTouchListener(new View.OnTouchListener() {
            private Handler handler;

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch(motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        if(handler != null) return true;
                        handler = new Handler();
                        handler.postDelayed(action,50);
                        break;
                    case MotionEvent.ACTION_UP:
                        if(handler == null) return true;
                        handler.removeCallbacks(action);
                        handler = null;
                        break;
                }
                return true;
            }
            Runnable action = new Runnable() {
                @Override public void run() {
                    shipX = ship.getX() + 25;
                    ship.setX(shipX);
                    handler.postDelayed(this,50);
                }
            };
        });

        leftFireButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch(motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:

                        //TODO FIRE BULLET....

                        leftFireButton.setBackgroundResource(R.drawable.red_button_pressed);
                        soundPool.play(soundID,1.0f,0.5f,1,0,1.0f);
                        return true;
                    case MotionEvent.ACTION_UP:
                        leftFireButton.setBackgroundResource(R.drawable.red_button);
                        //widgets.removeView(laser);
                        return true;
                }

                return false;
            }
        });
        rightFireButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch(motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:

                        //TODO FIRE BULLET

                        rightFireButton.setBackgroundResource(R.drawable.red_button_pressed);
                        soundPool.play(soundID,1.0f,0.5f,1,0,1.0f);
                        return true;
                    case MotionEvent.ACTION_UP:
                        rightFireButton.setBackgroundResource(R.drawable.red_button);
                        //widgets.removeView(laser);

                        return true;
                }

                return false;
            }
        });

        //Setup ship
        RelativeLayout.LayoutParams shipParams = new RelativeLayout.LayoutParams(250, 250);

        //Setup a 200 x 200 ImageView for Left Button
        RelativeLayout.LayoutParams leftBtn = new RelativeLayout.LayoutParams(200,200);

        //Setup a 200 x 200 ImageView for Right Button
        RelativeLayout.LayoutParams rightBtn = new RelativeLayout.LayoutParams(200,200);

        //Setup a 200 x 200 ImageView for Left Fire Button
        RelativeLayout.LayoutParams leftFireBtn = new RelativeLayout.LayoutParams(200,200);

        //Setup a 200 x 200 ImageView for Right Fire Button
        RelativeLayout.LayoutParams rightFireBtn = new RelativeLayout.LayoutParams(200,200);

        //Add rules to align the left button programmatically
        leftBtn.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        leftBtn.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

        //Add rules to align the right button programmatically
        rightBtn.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        rightBtn.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

        //Add rules to align left and right fire buttons
        leftFireBtn.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        rightFireBtn.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        leftFireBtn.addRule(RelativeLayout.ABOVE,leftButton.getId());
        rightFireBtn.addRule(RelativeLayout.ABOVE, rightButton.getId());
        //leftFireBtn.topMargin = 850;
        //rightFireBtn.topMargin = 850;

        shipParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        shipParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        //shipParams.bottomMargin = 100;

        //Now set the params
        leftButton.setLayoutParams(leftBtn);
        rightButton.setLayoutParams(rightBtn);
        leftFireButton.setLayoutParams(leftFireBtn);
        rightFireButton.setLayoutParams(rightFireBtn);
        ship.setLayoutParams(shipParams);

        //Set the content view of the game
        this.setContentView(game);
    }

    public void loadSounds(Context context) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            soundPool = new SoundPool.Builder().setMaxStreams(10).build();
        }
        else {
            soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 1);
        }
        soundID = soundPool.load(context,R.raw.laser,1);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mp.pause();
        gameView.pause();
    }
    @Override
    protected void onResume() {
        super.onResume();
        mp.start();
        gameView.resume();
    }
    public class GameView extends SurfaceView implements Runnable {
        Thread gameViewThread = null;
        SurfaceHolder surfaceHolder;
        boolean okToRun = true;
        Bitmap star;
        Bitmap three_pixel_star;

        public GameView(Context context) {
            super(context);
            //initialize holder
            surfaceHolder = this.getHolder();
        }

        @Override
        public void run() {
            while(okToRun) {
                if(!surfaceHolder.getSurface().isValid()) {
                    continue;
                }
                Canvas gameCanvas = surfaceHolder.lockCanvas();
                customOnDraw(gameCanvas);
                surfaceHolder.unlockCanvasAndPost(gameCanvas);

            }
        }

        protected void customOnDraw(Canvas canvas) {
            Random random = new Random();
            Random random1 = new Random();
            canvas.drawColor(Color.BLACK);
            star = BitmapFactory.decodeResource(getResources(), R.drawable.single_pixel_star);
            three_pixel_star = BitmapFactory.decodeResource(getResources(),R.drawable.three_pixel_star);
            canvas.drawBitmap(star, random1.nextInt(canvas.getWidth()-star.getWidth()),random1.nextInt(canvas.getHeight()-star.getHeight()), null);
            canvas.drawBitmap(three_pixel_star, random.nextInt(canvas.getWidth()-three_pixel_star.getWidth()),random.nextInt(canvas.getHeight()-three_pixel_star.getHeight()), null);
        }
        public void pause() {
            okToRun = false;
            while(true) {
                try {
                    gameViewThread.join();
                } catch(InterruptedException e) {
                    Log.v("ERROR", e.getMessage());
                }
                break;
            }
            gameViewThread = null;
        }
        public void resume() {
            okToRun = true;
            gameViewThread = new Thread(this);
            gameViewThread.start();
        }
    }
}
IRGeekSauce

さて、これがそれ自体これを行うための「適切な」方法であるかどうかはわかりませんが、私は今、私の船からレーザーを発射しています。BulletクラスとBulletControllerクラスを作成し、onTouchListenerにメソッドを実装しました。

弾丸クラス:

 public class Bullet {

    private float x;
    private float y;
    private Paint paint;

    Bitmap bullet;

    public Bullet(float x, float y, Context context) {
        this.x = x;
        this.y = y;

        bullet = BitmapFactory.decodeResource(context.getResources(),R.drawable.laser_beam);
    }
    public void tick() {
        y -= 30;
    }
    public void render(Canvas canvas) {
        canvas.drawBitmap(bullet, x, y,null);
    }
}

BulletControllerクラス:

 public class BulletController {

    private LinkedList<Bullet> b = new LinkedList<>();

    Bullet tempBullet;
    Context context;
    //ImageView ship;
    float x;
    float y;
    public BulletController(Context context) {
        this.context = context;
        this.x = x;
        this.y = y;
        addBullet(new Bullet(x, y, context));
    }

    public void tick() {
        for(int i = 0; i < b.size(); i++) {
            tempBullet = b.get(i);
            tempBullet.tick();
        }
    }
    public void render(Canvas canvas) {
        for(int i = 0; i < b.size(); i++) {
            tempBullet = b.get(i);
            tempBullet.render(canvas);
        }
    }
    public void addBullet(Bullet bullet) {
        b.add(bullet);
    }
    public void removeBullet(Bullet bullet) {
        b.remove(bullet);
    }
}

2つの発射ボタンのsetOnTouchListenerで:

 leftFireButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch(motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //TODO FIRE BULLET....
                    bulletController.addBullet(new Bullet((ship.getX() + ship.getWidth()/2) - 15, ship.getY() + ship.getHeight()/2, getApplicationContext())); //<--NEW CODE
                    leftFireButton.setBackgroundResource(R.drawable.red_button_pressed);
                    soundPool.play(soundID,1.0f,0.5f,1,0,1.0f);
                    return true;
                case MotionEvent.ACTION_UP:
                    leftFireButton.setBackgroundResource(R.drawable.red_button);
                    //widgets.removeView(laser);
                    return true;
            }

            return false;
        }
    });
    rightFireButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch(motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //TODO FIRE BULLET
                    bulletController.addBullet(new Bullet((ship.getX() + ship.getWidth()/2) - 15, ship.getY() + ship.getHeight()/2, getApplicationContext())); //<--- NEW CODE


                    rightFireButton.setBackgroundResource(R.drawable.red_button_pressed);
                    soundPool.play(soundID,1.0f,0.5f,1,0,1.0f);
                    return true;
                case MotionEvent.ACTION_UP:
                    rightFireButton.setBackgroundResource(R.drawable.red_button);
                    //widgets.removeView(laser);

                    return true;
            }

            return false;
        }
    });

ボタンを押すたびに、これが最終結果になります。レーザー!

ピューピュー

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別のクラスからArrayListにアクセスするにはどうすればよいですか?

分類Dev

PyQt4のあるクラスから別のクラスに変数にアクセスするにはどうすればよいですか?

分類Dev

別のクラスのIBOutletにアクセスするにはどうすればよいですか?

分類Dev

別のDLL内のクラスにアクセスするにはどうすればよいですか?

分類Dev

あるクラスの値に別のクラスからアクセスするにはどうすればよいですか?スウィフト4

分類Dev

あるクラスから別のクラスにアクセスできるブール値を作成するにはどうすればよいですか?

分類Dev

別のPCからLaravelアプリにアクセスするにはどうすればよいですか?

分類Dev

別のPCからLaravelアプリにアクセスするにはどうすればよいですか?

分類Dev

あるクラスから別のクラスに変数にアクセスするにはどうすればよいですか?

分類Dev

あるクラスから別のクラスにint変数にアクセスするにはどうすればよいですか?(Java)

分類Dev

別のVMから1つのVMにアクセスするにはどうすればよいですか?

分類Dev

dartの別のクラスから1つのクラスメソッドにアクセスするにはどうすればよいですか?

分類Dev

Javaの別のクラスのメインクラスからintにアクセスするにはどうすればよいですか?

分類Dev

Flutterで別のクラスからクラスメソッドにアクセスするにはどうすればよいですか?

分類Dev

別のクラスのクラスからメソッドにアクセスするにはどうすればよいですか?

分類Dev

別の出力から変数にアクセスするにはどうすればよいですか

分類Dev

別のビューからNSStatusBarにアクセスするにはどうすればよいですか?

分類Dev

別のクラスから、asynctaskに入力されたリストビューにアクセスするにはどうすればよいですか?

分類Dev

別のリスト内からクラス内のリストにアクセスするにはどうすればよいですか

分類Dev

別のクラスからプライベートオブジェクトにアクセスするにはどうすればよいですか?

分類Dev

Javaの別のクラスからオブジェクトにアクセスするにはどうすればよいですか?

分類Dev

Javaでプライベートな別のクラスから配列にアクセスするにはどうすればよいですか?

分類Dev

Meteorの実行中に別のクライアントからMeteorのMongoDBにアクセスするにはどうすればよいですか?

分類Dev

Meteorの実行中に別のクライアントからMeteorのMongoDBにアクセスするにはどうすればよいですか?

分類Dev

同じクラスの別の関数から関数内の変数にアクセスするにはどうすればよいですか?

分類Dev

Objective-c : 別のクラスから変数または配列にアクセスするにはどうすればよいですか?

分類Dev

Javaの別のクラスから変数にアクセスするにはどうすればよいですか?

分類Dev

Javaの別のクラスから変数にアクセスするにはどうすればよいですか?

分類Dev

WPFの別のクラスから文字列にアクセスするにはどうすればよいですか

Related 関連記事

  1. 1

    別のクラスからArrayListにアクセスするにはどうすればよいですか?

  2. 2

    PyQt4のあるクラスから別のクラスに変数にアクセスするにはどうすればよいですか?

  3. 3

    別のクラスのIBOutletにアクセスするにはどうすればよいですか?

  4. 4

    別のDLL内のクラスにアクセスするにはどうすればよいですか?

  5. 5

    あるクラスの値に別のクラスからアクセスするにはどうすればよいですか?スウィフト4

  6. 6

    あるクラスから別のクラスにアクセスできるブール値を作成するにはどうすればよいですか?

  7. 7

    別のPCからLaravelアプリにアクセスするにはどうすればよいですか?

  8. 8

    別のPCからLaravelアプリにアクセスするにはどうすればよいですか?

  9. 9

    あるクラスから別のクラスに変数にアクセスするにはどうすればよいですか?

  10. 10

    あるクラスから別のクラスにint変数にアクセスするにはどうすればよいですか?(Java)

  11. 11

    別のVMから1つのVMにアクセスするにはどうすればよいですか?

  12. 12

    dartの別のクラスから1つのクラスメソッドにアクセスするにはどうすればよいですか?

  13. 13

    Javaの別のクラスのメインクラスからintにアクセスするにはどうすればよいですか?

  14. 14

    Flutterで別のクラスからクラスメソッドにアクセスするにはどうすればよいですか?

  15. 15

    別のクラスのクラスからメソッドにアクセスするにはどうすればよいですか?

  16. 16

    別の出力から変数にアクセスするにはどうすればよいですか

  17. 17

    別のビューからNSStatusBarにアクセスするにはどうすればよいですか?

  18. 18

    別のクラスから、asynctaskに入力されたリストビューにアクセスするにはどうすればよいですか?

  19. 19

    別のリスト内からクラス内のリストにアクセスするにはどうすればよいですか

  20. 20

    別のクラスからプライベートオブジェクトにアクセスするにはどうすればよいですか?

  21. 21

    Javaの別のクラスからオブジェクトにアクセスするにはどうすればよいですか?

  22. 22

    Javaでプライベートな別のクラスから配列にアクセスするにはどうすればよいですか?

  23. 23

    Meteorの実行中に別のクライアントからMeteorのMongoDBにアクセスするにはどうすればよいですか?

  24. 24

    Meteorの実行中に別のクライアントからMeteorのMongoDBにアクセスするにはどうすればよいですか?

  25. 25

    同じクラスの別の関数から関数内の変数にアクセスするにはどうすればよいですか?

  26. 26

    Objective-c : 別のクラスから変数または配列にアクセスするにはどうすればよいですか?

  27. 27

    Javaの別のクラスから変数にアクセスするにはどうすればよいですか?

  28. 28

    Javaの別のクラスから変数にアクセスするにはどうすればよいですか?

  29. 29

    WPFの別のクラスから文字列にアクセスするにはどうすればよいですか

ホットタグ

アーカイブ