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

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

ただいまの
回答率

90.47%

  • Java

    14102questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6629questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

時間のずらし方

受付中

回答 2

投稿 編集

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

退会済みユーザー

コード
public class MainActivity extends Activity implements Runnable{

     Handler mHandler;
     Thread thread;
     FrameLayout frameLayout;

     SampleView sv;

     ArrayList<Ball> list = new ArrayList<Ball>();
     Ball ball = new Ball(180.0);
     Ball ball2 = new Ball(160.0);

     int time = 0;
     double mul = 0.1;
     double times;


    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        frameLayout = new FrameLayout(this);
        setContentView(frameLayout);

        sv = new SampleView(this);

        list.add(ball);
        list.add(ball2);
        sv.setBall(list);

        frameLayout.addView(sv);

        mHandler = new Handler();

        thread = new Thread(this);
        thread.start();
    }


     @Override
     public void run(){

         ball.setX();
         ball2.setX();

         for(time = 0; time < 100; time++){
             times = time*mul;

             try{
                 Thread.sleep(50);
             }
             catch(InterruptedException e){
             }

             ball.setY(times);
             ball2.setY(times);

             mHandler.post(new Runnable(){
                 @Override
                 public void run(){
                     sv.invalidate();
                 }
             });
         }
     }
}
コード
public class SampleView extends View{

    Paint paint = new Paint();
    ArrayList<Ball> ball;

    public SampleView(Context context) {
        super(context);
    }

    public void setBall(ArrayList<Ball> ball){
        this.ball = ball;
    }

    protected void onDraw(Canvas canvas){
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);
        canvas.drawPoint(ball.get(0).getX(), ball.get(0).getY(), paint);
        canvas.drawPoint(ball.get(1).getX(), ball.get(1).getY(), paint);
    }
}
コード
public class Ball{

    int x;
    int y;

    double V0x = 0.0;
    double V0y;

    double Vx;
    double Vy;

    double G = 9.8*2;

    //コンストラクタ
    public Ball(double V0y){
        this.V0y = V0y;
    }


    public void setX(){
        this.x = (int)(Math.random()*700) + 50;
    }

    public void setY(double times){
        Vy = V0y - G*times;
        this.y = (int)(1100 - (V0y*times - G*times*times/2));
    }

    public int getX(){
        return this.x;
    }

    public int getY(){
        return this.y;
    }
}

上のプログラムは上にボール(点)を投げ上げたときの動きを示したプログラムです。
Ballクラスを作ってインスタンス化することでボールを複数作れました。

ですが、同時にボールを上げることはできたのですが、時間をずらしてあげることが出来ません。
はじめにボールを上げて、1秒後に2つ目のボール、3秒後に3つ目のボールを上げるようにするにはどうすればいいのでしょうか?
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

  1. Ballオブジェクトを時間差でListに入れる
  2. 再描写する際、Listに入っているすべてのBallについて描写するようにする

という2点に気をつければいいのではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/11 00:36

    回答ありがとうございます。
    時間差でListに入れるというのは、意味は分かるのですが、どうすればいいのでしょうか?
    Ballクラスで設定したらいいのでしょうか?

    キャンセル

  • 2016/04/11 00:38

    HandlerのメソッドにpostDelayedという物があります。
    Runnableを指定時間後に実行するよう指示するものです。それを使います。

    キャンセル

  • 2016/04/11 01:47

    了解です。
    postDelayedを使うと上のプログラムの場合
    mHandler.postDelayed(this, 1000)とかになると思うのですが、Ballのインスタンスballやball2に対して.postDelayedを使うにはどうすればいいのでしょうか?
    postDelayedの引数を調べたのですが(Runnable r, long delayMillis)というのしかなくて、ballに対しての使い方がわかりません。
    すみませんが、よろしくお願いします。

    キャンセル

  • 2016/04/11 01:56

    postDelayedの第一引数に渡すRunnableのrunメソッドで、新たなBallオブジェクトをListに追加するようにします。

    キャンセル

  • 2016/04/11 02:22

    onCreateメソッド{
    list.add(ball);
    sv.setBall(list);

    mHandler = new Handler();

    thread = new Thread(this);
    thread.start();
    mHandler.postDelayed(this, 1000);
    }

    runメソッド{
    list.add(ball2);
    sv.setBall(list);

    ball.setX();
    ball2.setX();

    for(time = 0; time < 100; time++){
    times = time*mul;
    ・・・

    こういうことなのでしょうか?

    キャンセル

  • 2016/04/11 14:38

    postDelayedの第一引数に渡すRunnableのrunメソッドで、新たなBallオブジェクトをListに追加する
    これはどういう意味なのでしょうか?

    キャンセル

  • 2016/04/11 18:07 編集

    例えばこういうことです。

    mHandler.postDelayed(new Runnable() {
     @Override
     public run() {
      Ball ball = new Ball(100.0); // 新しいBallオブジェクトを
      list.add(ball); // Listに追加する
     }
    }, 1000);

    キャンセル

0

パッと見ですが、今の実装だと、下記のような実装が修正が少ないように思います。

1.各ボールに何秒後に打ち上げるかのメンバを持たせる。
2.描画する側で、何秒後に描画するかを制御する。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/11 00:41

    回答ありがとうございます。
    時間のメンバを持たせるということですが、そうするとMainActivityクラスの
    for(time = 0; time < 100; time++){
    times = time*mul;

    try{
    Thread.sleep(50);
    }
    catch(InterruptedException e){
    }
    の表記はいらなくなるということでしょうか?

    キャンセル

関連した質問

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

  • Java

    14102questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6629questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。