質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

値の格納についてなんですが、知識不足なので多少変なことを言っているかもしれません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 905
退会済みユーザー

退会済みユーザー

独学で学んでいる者です。

・試みたこと
下記のTankクラスの問題個所でプレイヤークラスから渡された(setPlayerX(),setPlayerY())はただ原点座標を返しているにすぎないと判断した私は、その座標をプレイヤーの動きと重ねればどうだろうと思い、プレイヤーのYの動きである
PlayerY +=vy;
をsetPlayerYメソッドに書きました。
すると、プレイヤーが落ちてくるよりも遅く(確認のために描画してある)爆炎がゆっくりと下がってきました。
今後、重ねる方法をとらないにしても、なぜ同じ式を入れているプレイヤーと爆炎で落ちるスピードが違うのか?という質問が2番になります。
ダブルバッファリングによるフレーム数とかの問題ですか?

・前回の質問 
1playerが動いているのだからplayerYに格納されている値も変化し続けているのではないのですか?
2同じ値を使っているのに別の座標で落ちる速度が違うのはなぜですか?
3どうすれば逐一動いているplayerYの座標を取得できますか?

プレイヤークラス

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;



public class Players {
private:
    SurfaceHolder holder;
    Graphics gr1;
    Paint paint;

    //ジャンプ
    private int oldY;
    private int newY;

    //プレイヤー
    public int PlayerX ;
    public int PlayerY;
    private int PlayerToX = PlayerX;

    //横方向のカウント数
    private int xcount = 0;

    //添字
    private int ix = 0;

    //重力
   public int vy = 27;


    public Bitmap[] Bp = new Bitmap[30];

    public Players(int w, int h,SurfaceHolder holder,Activity P){


        this.holder =holder;
        this.holder.setFormat(PixelFormat.RGBA_8888);
        this.holder.setFixedSize(w,h);
        paint = new Paint();
        paint.setAntiAlias(true);

        //画面サイズの指定
        Display display = P.getWindowManager().getDefaultDisplay();
        Point p = new Point();
        display.getSize(p);

        gr1= new Graphics(p.x,p.y,holder);
        gr1.setOrigin(p.x,p.y);


        //ビットマップの読み込み
        for (int i = 0; i < 30; i++) {
            Bp [i] = readBitmap(P, "red" + i);


        }

    }

    public void set1(Graphics gr11) {

        gr1 = gr11

        //プレイヤーの描画
        gr11.drawBitmap(Bp[ix],PlayerX, PlayerY);


    }
    //歩行
    public void move1(){
        //歩行
        if (Math.abs(PlayerX - PlayerToX) < 1) {
            PlayerX = PlayerToX;
        } else if (PlayerX < PlayerToX) {


            PlayerX += 27;
        } else if (PlayerX > PlayerToX) {

            PlayerX -= 27;
        }
    }


    //重力加速度
    public int goDown(){

        return PlayerY +=vy ;
    }

    //重力の付加
    public void gravity(){
        PlayerY =goDown();

    }

    //描画座標
    public int setPlayerX() {


        return PlayerX;
    }
    public int setPlayerY(){
//ここにgoDown();を書いたりしました。
        return PlayerY;

    }
    //Xの移動終点
    public int setPlayertoX(){
        return PlayerToX;
    }



    //右方向
    public void move1right(){

        while (PlayerToX - PlayerX > 1) {
            xcount++;


            //カウントから添え字を求める
            ix = Math.abs(xcount)  % 6 + 1;


            break;
        }


    }
    //左方向
    public void move1left(){

        while (PlayerX - PlayerToX > 0) {

            xcount++;

            //カウントから添え字を求める
            ix = Math.abs(xcount)  % 6 + 7;
            break;

        }
    }
    //歩行制御
    public void save(){

        if (PlayerX > 960-176 ) {
            PlayerX =Math.abs(960-176);
        }
    }
    //タッチイベント
    public boolean onTouchEvent(MotionEvent event) {
        int touchX = (int) (event.getX());
        int touchAction = event.getAction();

        if (touchAction == MotionEvent.ACTION_DOWN) {

            PlayerToX = touchX;

            newY = (int) event.getY();


        }


        if (touchAction == MotionEvent.ACTION_UP) {

            PlayerToX = PlayerX;

            oldY = (int) (event.getY());
            if (newY > oldY + 60) {
                PlayerY -= 250;

            } else {}

        }

        return true;
    }


    //ビットマップの読み込み
    static Bitmap readBitmap(Context context, String name) {

        int resID = context.getResources().getIdentifier(name, "drawable", context.getPackageName());
        return BitmapFactory.decodeResource(context.getResources(), resID);


    }


}


敵(Tank)

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.view.Display;
import android.view.SurfaceHolder;

import java.util.ArrayList;
import java.util.List;


public class Tank {

private:
     SurfaceHolder holder;
     Graphics gra2;
     Paint paint;
     Players p1;
     BackGround BG;
    int TankX = 1600;
    int TankFlag = 0;


    private class Tfire {
        int x;
        int y;
        int life;

        private Tfire(int x, int y) {
            this.x = x;
            this.y = y;
            this.life = 1;
        }
    }
    private class Smg {
        int x;
        int y;
        int life;

        private Smg(int x, int y) {
            this.x = x;
            this.y = y;
            this.life = 5;
        }
    }

    private class Expl {
        int x;
        int y;
        int life;

        public Expl(int x, int y) {
            this.x = x;
            this.y = y;
            this.life = 5;
        }
    }


    private List<Tfire> fire = new ArrayList<Tfire>(); //戦車弾
    private List<Smg> Smoke = new ArrayList<Smg>();//煙
    private List<Expl> expls =new ArrayList<Expl>();//爆炎


    public Bitmap[] Bt = new Bitmap[30];


    public Tank(int w, int h, SurfaceHolder holder, Activity T){


        this.holder =holder;
        this.holder.setFormat(PixelFormat.RGBA_8888);
        this.holder.setFixedSize(w,h);
        paint = new Paint();
        paint.setAntiAlias(true);

        //画面サイズの指定
        Display display = T.getWindowManager().getDefaultDisplay();
        Point p = new Point();
        display.getSize(p);


        //ビットマップの読み込み
        for (int i = 0; i < 30; i++) {
            Bt [i] = readBitmap(T, "red" + i);

        }
        gra2= new Graphics(w,h,holder);
        BG = new BackGround(w, h, holder, T);
        p1 = new Players(w, h, holder, T);

    }

    public void set1(Graphics gr2) {

        gra2 =gr2;


        //戦車
        gr2.drawBitmap(Bt[16], TankX, BG.setEarthH() - 151);



        //戦車の弾
        for (int i = fire.size() - 1; i >= 0; i--) {
            Tfire atk = fire.get(i);

            gr2.drawBitmap(Bt[17], atk.x, atk.y);

        }
        //煙
        for (int i = Smoke.size() - 1; i >= 0; i--) {
            Smg pos = Smoke.get(i);
            gr2.drawBitmap(Bt[18], pos.x, pos.y);
        }
        //爆炎
        for (int i = expls.size() - 1; i >= 0; i--) {
            Expl expl = expls.get(i);
            gr2.drawBitmap(Bt[20], expl.x, expl.y);
        }
    }

    //攻撃
    public void attack(){

        //弾の移動
        for (int i = fire.size() - 1; i >= 0; i--) {
            Tfire pos = fire.get(i);
            pos.x -= 96;

            if (pos.x < 0) {
                fire.remove(i);
                TankFlag = 0;
            }
            break;
        }

        //爆炎の追加
        if(TankFlag ==1){
        for (int i = fire.size() - 1; i >= 0; i--) {
            Tfire pos = fire.get(i);
//ここで戦車弾とプレイヤーを衝突させたかった
            if (pos.x < 100) {
/*しかし、衝突しなかったのでプレイヤーの座標がどこにあるのか
調べるため、現時点は100の座標と衝突させて、プレイヤーの座標で
爆炎が起こるようになっている。
*/

                expls.add(new Expl(p1.setPlayerX(), p1.setPlayerY()));
                fire.remove(i);

                TankFlag = 0;
            }
        }}
        //煙の遷移
        for (int i = Smoke.size() - 1; i >= 0; i--) {
            Smg pos = Smoke.get(i);
            pos.life--;

            if (pos.life < 0) {
                Smoke.remove(i);
            }
            break;
        }

        //戦車の攻撃
        if (TankFlag == 0) {
            if (TankX > p1.setPlayerX()) {
                fire.add(new Tfire(TankX - 70, BG.setEarthH()-146));
                Smoke.add(new Smg(TankX - 60, BG.setEarthH() - 150));
                TankFlag = 1;

            }
        }
        //爆炎の遷移
        for (int i = expls.size() - 1; i >= 0; i--) {
            Expl expl = expls.get(i);
            expl.life--;
            if (expl.life < 0) {
                expls.remove(i);
            }
            break;
        }

    }

    public void move(){
        TankX -= 27;
        for (int i = Smoke.size() - 1; i >= 0; i--) {
            Smg pos = Smoke.get(i);
            pos.x-=27;
        }
        for (int i = expls.size() - 1; i >= 0; i--) {
            Expl expl = expls.get(i);
            expl.x -= 27;
        }
    }



    //ビットマップの読み込み
    static Bitmap readBitmap(Context context, String name) {

        int resID = context.getResources().getIdentifier(name, "drawable", context.getPackageName());
        return BitmapFactory.decodeResource(context.getResources(), resID);


    }
}

これらの細かいクラスをダブルバッファリングで大本のクラスに書いています

>この質問で一番聞きたい事
戦車弾とプレイヤーを衝突させたいです。
どうしたらいいですか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/05/19 13:58

    タグはすいませんでした

    キャンセル

  • Bongo

    2017/05/19 14:57

    コードご提示ありがとうございます。ただ、当初のご質問では「前回の質問」に至る前段階の疑問点をいろいろ記入されていたかと思いますが(表示される値が違う、でしたっけ?失念してしまいました...)、あの部分も削除せず残したままの方が他の回答者の皆さんに分かりやすいかと思います。たびたびすみません。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/05/19 17:06

    度々、御付き合いありがとうございます。「試みたこと」に似たようなことを書きました。消してしまって詳しくは覚えていませんが、、。人に見せる予定ではなかったので俗に言うスパゲティコードなのかもしれませんが、お許しください。

    キャンセル

回答 2

+1

せっかくコードまで示していただいたので、なるべくお力にはなりたいと思うのですが...ちょっと読み解くことが難しく、なんとも言いがたい状態です。
いくつかお伺いしたい点として、

  • TankFlagとは何を意図するものでしょうか。TankFlagを1にしている箇所が見つからず、「if(TankFlag ==1)」のブロックが実行されないのでは...と思われました。
  • Explクラスが爆炎でしょうか。gr2.drawBitmap(Bt[20], expl.x, expl.y)が爆炎の描画部分とすると、「爆炎がゆっくりと下がって」とあるため、どこかでexpl.yを書き換えているはずと思いましたが、どうも見つかりません。
  • 全角のセミコロンや中かっこがいくつかあるようですが、プログラムを起動させることまでは可能な状態なのですよね?これらは投稿時のミスでしょうか。

すみませんが、まだ情報が不足しているようです。「//関係部分のみ抜粋」とありますが、Tankクラスはここにお示しのものがクラス全体ではないということでしょうか?もしそうでしたら、差し支えなければ全体をご提示いただけますでしょうか。もしかして、相当長くなってしまうのでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/20 15:52

    言い方が変でしたね。私もTankクラスのplayer座標は何も動きを指定していないため、プレイヤークラスのplayer座標とは別のものという認識はありました。それでもプレイヤークラスから参照できないかという疑問に至ったわけです。しかし、難しそうですね。今回は前回答者の直接取得をヒントにTankクラスに描画しない疑似プレイヤーを作り、プレイヤーと同じ動きをさせることで決着としました。

    そうじゃないと質問の題名と違いすぎますもんね、、。
    いろいろとお時間をとっていただきありがとうございました。大変親身になってもらい助かりました。
    また困ったら質問します。

    キャンセル

  • 2017/05/20 21:08 編集

    ダミーのプレイヤーに同じ動きをさせる...なかなか興味深い方法と思いました。私の思いつく手となると、

    - 案1:Tank生成時にPlayers(歩いたり跳ねたりする方の)をコンストラクタ引数として渡してp1に入れる。
    - 案2:p1にクラス外からPlayersをセットするためのアクセッサメソッドを追加し、TankやPlayersを管理しているクラスがそれを使ってp1にPlayersをセットする。
    - 案3:TankやPlayersを管理しているクラスに、Playersの座標を取得して(PlayersのsetPlayerXやsetPlayersYを呼んで)返すメソッドを追加する。Tankはこれを使ってPlayersの位置を知る。

    などでしょうか。ともあれ、進捗がありましたようで何よりです。

    以下直接関係ないアドバイスですが、ご質問者さんのコードを拝見すると、文法的には正しい(コンパイルは問題ない)ものの、AndroidやJavaの慣習・規約的にややそぐわない箇所もあるようです(例えば私の場合、「setPlayerX」という名前を見て「playerXに新しい値をセットするセッターメソッド」を連想しました)。
    必ずしも厳格に従ったり、すぐに全部修正したりする必要はないのかもしれませんが、この手のプログラムデザイン上のスタイル・イディオム・パターン・ガイドラインのようなものもご留意いただけますと、読みやすさが向上して回答が集まりやすくなったり、発覚しにくい潜在的トラブルを少なくできたり...などのメリットもあるものと思われます(逆に、避けるべきアンチパターン・バッドプラクティスなどの記事をお探しになるのも面白いと思います)。このあたりはアマチュアの私よりも本職の方々の方が的確なご意見をいただけるのではないでしょうか。
    長々と失礼しました。今後とも私の力及ぶ範囲でしたらご協力いたします。

    キャンセル

  • 2017/05/21 16:45

    案1はなんかスタイリッシュにできそうですねー。ほーほーなるほど参考になります。
    案2は勉強不足でまだよくわかりませんが案3は1番最初に試してダメだったパターンかと思います。恐らく私が作ったクラスのせいかと思いますが…

    ですよね。プログラミングを始めようと思い立ったときに、誰にも見せないからいいかと読み飛ばした部分です…。しかし、今回みたいな場合や誰かと協力して作る場合などは全く意志疎通のできないコードですよね。今後の課題です。
    まぁ追々ですかね、、。
    とりあえず今は最初の一つを完成という状態にもっていきたいので。

    稚拙な説明とコードにお付き合いとご協力いただきありがとうございました。

    キャンセル

checkベストアンサー

0

変数に代入した値は、何かしらの再代入が行われない限り変化しません。

つまり、少しでも落下する度に変数PlayerYに再代入されるという処理がない限り、
PlayerYの値はそのままです。

なので、そのような処理を作った上で、好きなタイミングで取得するようにすれば良いと思います。
もっといいのは、変数を参照するのではなく、対象の座標を直接取得する処理を作ることだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/19 13:54

    なるほど、では私の
    PlayerY +=vy;
    というのは、vyの値を代入し続けるではないということなのですね。

    対象の座標を直接取得ですか、、やってみます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • 値の格納についてなんですが、知識不足なので多少変なことを言っているかもしれません。