androidアプリで困っています。ご教授ください(Ver.2)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#31

投稿記事 by ISLe » 12年前

bConf.doUpdate(this);
は引数ではなく、呼び出し文全体です。
thisが呼び出したBarricade自身を指します。

Barricadeのmoveメソッドを使うのはBMoveConfではなく、BMoverの間違いです。
すみませんでした。

BMoveConfはBMoveに処理を委譲するだけです。
#分かりやすく言えば丸投げ。
フレームカウントを進める処理だけを加えてください。

Barricadeのmoveメソッドは引数で与えられたX,Yの差分を使って座標をずらします。
こちらも考えてみてください。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#32

投稿記事 by mi_l » 12年前

返信ありがとうございます。
ISLe さんが書きました:bConf.doUpdate(this);
は引数ではなく、呼び出し文全体です。
thisが呼び出したBarricade自身を指します。

Barricadeのmoveメソッドは引数で与えられたX,Yの差分を使って座標をずらします。
こちらも考えてみてください。
の部分である
Barricade.java
(追記(変更)個所:61~66、75行目)

コード:

package net.dixq.irairabar;

import android.graphics.Bitmap;//追加
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;//追加
import android.graphics.PointF;
import android.graphics.RectF;//追加


public class Barricade extends Task {
    public enum eType{
        OUT,
        GOAL
    }

    protected PointF  _center = new PointF(0,0);        //図形の中心点
    protected PointF  _pt[];                            //図形の頂点
    protected Paint   _paint = new Paint();             //ペイント
    protected eType   _type = eType.OUT;                //タイプ(当たるとアウトな壁、ゴールの壁、等)
    protected float   _rotaSpeed = 0;                   //回転スピード
    protected Bitmap bit;

    protected BConf bConf;//追加

    //protected int images;//参照を保持するインスタンス変数(何型の変数?)

    //コンストラクタ。 type=タイプ、 n=頂点の数、 conf=設定情報
    public Barricade(int n, BConf conf,Bitmap img)
    {

        bit = img;//格納(記録);

        bConf = conf;//格納(追加)


        if( conf != null ){
            _rotaSpeed  = conf.speed;   //回転スピード
            _type       = conf.type;    //物体のタイプ
        }
        switch(_type){
        case OUT:   //接触してアウトな物
            _paint.setColor(Color.RED);
            break;
        case GOAL:  //接触してゴールな物
            _paint.setColor(Color.GREEN);
            break;
        }
        _pt = new PointF[n];    //頂点配列を作る
        for( int i=0; i<n; i++ ){
            _pt[i] = new PointF();  //頂点を作る
        }
        _paint.setAntiAlias(true);
    }
    public Barricade(int n , BConf conf)
    {
        this(n , conf , null);
    }

    //障害物の移動
    public void move(float vx , float vy)
    {
    	vx =_pt[0].x;
    	vy =_pt[0].y;
    }

    //更新する
    public boolean onUpdate(){
        if( _rotaSpeed != 0 ){  //回転するなら
            DiagramCalcr.RotateDiagram( _pt, _center, _rotaSpeed ); //頂点リスト(_pt)を_centerを中心に回転する
        }

        if(bConf != null)
        	bConf.doUpdate(this);
        return true;
    }

    //接触しているかを問う。円cirが線分vecと接触していれば接触した物体のタイプを返す。接触していなければNOを返す
    public Def.eHitCode isHit( final Circle cir, Vec vec ){
        if( DiagramCalcr.isHit( _pt, cir, vec ) == true ){
            switch(_type){
            case OUT:
                return Def.eHitCode.OUT;
            case GOAL:
                return Def.eHitCode.GOAL;
            }
        }
        return Def.eHitCode.NO;
    }

    //描画する
    public void onDraw(Canvas c)
    {
        //頂点が1未満の図形なんてないので
        if( _pt.length < 1 )
        {
            return;//返す
        }
        if( bit == null )
        {
	        Path path = new Path();//パス
	        path.moveTo(_pt[0].x, _pt[0].y);    //パスの初期位置をセット
	        for( int i=0; i<_pt.length; i++ )
	        {
	            path.lineTo(_pt[i].x, _pt[i].y);    //頂点の位置へラインを引いていく(軌跡を描いていく)
	        }
        	c.drawPath(path, _paint);   //引いたラインを描画する
        }
        else
        {
	        //画像は全体を使うと仮定
	        c.drawBitmap(bit, null, new RectF(_pt[0].x-10 , _pt[0].y-10 , _pt[2].x+10 , _pt[2].y+10 ), null);
        }

    }
}
そしてBMoveConf.java
(追記:22行目)

コード:

package net.dixq.irairabar;

public class BMoveConf extends BConf
{
	protected BMover mover ;
	protected int f_cnt;//フレームカウンタ

	public BMoveConf(BMover mover)
	{
		super(Barricade.eType.OUT);
		this.mover = mover;
	}

	//
	@Override
	public void doUpdate(Barricade barricade)
	{

		//BMoverのdoUpdateメソッド呼び出し
		mover.doUpdate(barricade, f_cnt);;

		f_cnt++;//カウントを加算
	}

}
そしてBMover.java
(追記:doUpdateメソッド内(途中で自分の考えが間違ってることに気付いたので断念してしまいました・・・一応消さないで残してありますが・・・))

コード:

package net.dixq.irairabar;

public class BMover
{
	public int num_frames;//フレーム数
	public int distance;//移動距離


	public BMover(/*int frame , int dis*/)//引数には「フレーム数」と「移動距離」
	{
		//メンバ変数に登録(格納)
		//num_frames = frame;
		//distance = dis;
	}

	//Barricadeの座標を更新する
	public void doUpdate(Barricade barricade, int count)
	{
		float mx = 0;
		float my = 0;
		num_frames = count;

			mx += distance / num_frames * 1;
			my += distance / num_frames * 1;

			barricade.move(mx, my);


	}


}

ご指摘、ご教授お願いします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#33

投稿記事 by ISLe » 12年前

引数を書き換えても何も起きませんよ。
Barricadeの座標はどのように管理されているかコードから読み取ってください。

画像を描画するコードに何やらオフセットが加えられていますが、これは何でしょうか。
画像イメージが合わなくて適当に書き加えたのだと推測しますが、ここで指定するサイズには意味があります。
意味を捻じ曲げるようなことはしないでください。
すべての動作に影響してしまいます。

画像に合わせて調整する必要があるのなら、調整するための仕組みを新たに実装してください。
その場しのぎは無駄を増やすだけだと言いましたよね。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#34

投稿記事 by ISLe » 12年前

Barricadeのmoveメソッドです。
引数の変数名を変えました。

コード:

    public void move(float dx , float dy)
    {
        for (int i=0; i<_pt.length; i++) {
            _pt[i].offset(dx, dy); // 頂点座標をズラす
        }
        _center.offset(dx, dy); // 中心座標をズラす
    }
BMoverのdoUpdateメソッドです。
distance,num_framesの宣言に初期値を設定してください。

コード:

    public void doUpdate(Barricade barricade, int count)
    {
        float dx = 0.0f;
        float dy = 0.0f;

        // distanceピクセルの距離を、
        // num_framesフレーム掛けて下がって、
        // num_framesフレーム掛けて上がる
        count %= num_frames * 2; // 往復だとnum_framesの倍の時間
        if (count < num_frames) {
            // 行き
            dy = (float)distance / num_frames;
        } else {
            // 帰り
            dy = -(float)distance / num_frames;
        }

        barricade.move(dx, dy);
    }
誤差が出るやり方なので気に入らないですが踏襲します。
複雑になりますし。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#35

投稿記事 by ISLe » 12年前

画像の描画範囲を頂点座標から求めているのは、前のスレでBarricadeSquareを前提として作成したためです。
他の図形は頂点の数も配置も違うので使えません。
描画先の矩形を示す情報を別に用意してそれぞれのコンストラクタで引数から計算して適切に設定することで他の図形にも対応できます。

BMoverのパターンを増やすなら、BMoverをインターフェースにして、現在のBMoverはインターフェースを継承した別のクラスにしましょう。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#36

投稿記事 by mi_l » 12年前

返信ありがとうございます。
ISLe さんが書きました:
画像を描画するコードに何やらオフセットが加えられていますが、これは何でしょうか。
画像イメージが合わなくて適当に書き加えたのだと推測しますが、ここで指定するサイズには意味があります。
意味を捻じ曲げるようなことはしないでください。
すべての動作に影響してしまいます。

画像に合わせて調整する必要があるのなら、調整するための仕組みを新たに実装してください。
その場しのぎは無駄を増やすだけだと言いましたよね。
については、指摘された通り、実行するときに私が微調整と題してやってしまったことです。申し訳ありませんでした。

実際にコードまで書いていただき、ありがとうございます。

以下に、変更後のコードと、インターフェース、また実装したBMoverの別パターン(BMoverA)のソースも載せます。

Barricade.java
(変更(追記)箇所:61~70、117行目)

コード:

package net.dixq.irairabar;

import android.graphics.Bitmap;//追加
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;//追加
import android.graphics.PointF;
import android.graphics.RectF;//追加


public class Barricade extends Task {
    public enum eType{
        OUT,
        GOAL
    }

    protected PointF  _center = new PointF(0,0);        //図形の中心点
    protected PointF  _pt[];                            //図形の頂点
    protected Paint   _paint = new Paint();             //ペイント
    protected eType   _type = eType.OUT;                //タイプ(当たるとアウトな壁、ゴールの壁、等)
    protected float   _rotaSpeed = 0;                   //回転スピード
    protected Bitmap bit;

    protected BConf bConf;//追加

    //protected int images;//参照を保持するインスタンス変数(何型の変数?)

    //コンストラクタ。 type=タイプ、 n=頂点の数、 conf=設定情報
    public Barricade(int n, BConf conf,Bitmap img)
    {

        bit = img;//格納(記録);

        bConf = conf;//格納(追加)


        if( conf != null ){
            _rotaSpeed  = conf.speed;   //回転スピード
            _type       = conf.type;    //物体のタイプ
        }
        switch(_type){
        case OUT:   //接触してアウトな物
            _paint.setColor(Color.RED);
            break;
        case GOAL:  //接触してゴールな物
            _paint.setColor(Color.GREEN);
            break;
        }
        _pt = new PointF[n];    //頂点配列を作る
        for( int i=0; i<n; i++ ){
            _pt[i] = new PointF();  //頂点を作る
        }
        _paint.setAntiAlias(true);
    }
    public Barricade(int n , BConf conf)
    {
        this(n , conf , null);
    }

    //障害物の移動
    public void move(float dx , float dy)
    {
    	//全ての頂点に対して・・・
    	for(int i = 0 ; i < _pt.length ; i++)
    	{
    		_pt[i].offset(dx, dy);//頂点座標をずらす
    	}
    	_center.offset(dx, dy);	//中心座標をずらす
    }

    //更新する
    public boolean onUpdate(){
        if( _rotaSpeed != 0 ){  //回転するなら
            DiagramCalcr.RotateDiagram( _pt, _center, _rotaSpeed ); //頂点リスト(_pt)を_centerを中心に回転する
        }

        if(bConf != null)
        	bConf.doUpdate(this);
        return true;
    }

    //接触しているかを問う。円cirが線分vecと接触していれば接触した物体のタイプを返す。接触していなければNOを返す
    public Def.eHitCode isHit( final Circle cir, Vec vec ){
        if( DiagramCalcr.isHit( _pt, cir, vec ) == true ){
            switch(_type){
            case OUT:
                return Def.eHitCode.OUT;
            case GOAL:
                return Def.eHitCode.GOAL;
            }
        }
        return Def.eHitCode.NO;
    }

    //描画する
    public void onDraw(Canvas c)
    {
        //頂点が1未満の図形なんてないので
        if( _pt.length < 1 )
        {
            return;//返す
        }
        if( bit == null )
        {
	        Path path = new Path();//パス
	        path.moveTo(_pt[0].x, _pt[0].y);    //パスの初期位置をセット
	        for( int i=0; i<_pt.length; i++ )
	        {
	            path.lineTo(_pt[i].x, _pt[i].y);    //頂点の位置へラインを引いていく(軌跡を描いていく)
	        }
        	c.drawPath(path, _paint);   //引いたラインを描画する
        }
        else
        {
	        //画像は全体を使うと仮定
	        c.drawBitmap(bit, null, new RectF(_pt[0].x, _pt[0].y, _pt[2].x, _pt[2].y ), null);
        }

    }
}
BMover.java
(変更(追記)箇所:5~7行目、doUpdateメソッド内)

コード:

package net.dixq.irairabar;

public class BMover
{
	//60フレームで60px移動だから・・・・
		public int num_frames = 60;//フレーム数
		public int distance = 60;//移動距離



	public BMover(/*int frame , int dis*/)//引数には「フレーム数」と「移動距離」
	{
		//メンバ変数に登録(格納)
		//num_frames = frame;
		//distance = dis;
	}

	//Barricadeの座標を更新する
	public void doUpdate(Barricade barricade, int count)
	{
		float dx = 0.0f;//x座標
        float dy = 0.0f;//y座標

        // distanceピクセルの距離を・・・・、
        // num_framesフレーム掛けて下り
        // num_framesフレーム掛けて上がる
        count %= num_frames * 2; // 往復だとnum_framesの倍の時間かかる

        if (count < num_frames)
        {
            // 行き
            dy = (float)distance / num_frames;
        } else
        {
            // 帰り
            dy = -(float)distance / num_frames;
        }

        barricade.move(dx, dy);


	}


}
そして、ここからはBmoverのパターンを増やそうとしているとかていして作ったものです
(上のBMoverにインターフェースが実装されてないように下記の二つのファイルはプロジェクトにまだ入っていません)

BMovers.java

コード:

package net.dixq.irairabar;

import net.dixq.irairabar.Barricade;

interface BMovers
{
	public void doUpdate(Barricade barricade , int count);
}
BMoverA.java

コード:

//BMoverA.javaファイル(BMoverの移動設定を変えたもの)
package net.dixq.irairabar;

public class BMoverA implements BMovers
{
	//60フレームで60px移動だから・・・・
	public int num_frames = 60;//フレーム数
	public int distance = 60;//移動距離


	public BMover(/*int frame , int dis*/)//引数には「フレーム数」と「移動距離」
	{
		//メンバ変数に登録(格納)
		//num_frames = frame;
		//distance = dis;
	}

	//Barricadeの座標を更新する
	public void doUpdate(Barricade barricade, int count)
	{
		float dx = 0.0f;
        float dy = 0.0f;

        // distanceピクセルの距離を・・・・、
        // num_framesフレーム掛けて下り
        // num_framesフレーム掛けて上がる
        count %= num_frames * 3; // 往路+停止+復路のためx3する(全て60フレーム使う設定。)

        if (count < num_frames)
        {
            // 行き
            dy = (float)distance / num_frames;//ここでは1pxのこと
        }
        else if(count >= num_frames && count < (num_frames*2))
        {
        	//停止
        	dy = (float)distance % num_frames;//0px(停止のこと)
        }
        else
        {
            // 帰り
            dy = -(float)distance / num_frames;
        }

        barricade.move(dx, dy);

	}
}
ソース変更、インターフェース、また実装クラスに対して、
ご指摘、ご教授お願いします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#37

投稿記事 by ISLe » 12年前

移動パターンを増やす前に動作確認はしたのでしょうか。

主題である、障害物を動かす目的は果たせたと思いますが。

スレの伸びとともにmi_lさん自身が考えず言われるままコードを書くだけになっていっているように感じます。


既にBMoverで作ってあるところを書き換えないようにするためにはインターフェースの名前がBMoverでないといけません。
Eclipseなら一発で置き換えできますが、コードを書き換えずに拡張することに意味があります。


いつまでもdistanceとnum_framesの変数にこだわる必要はありません。
『時間』と『距離』を意識するためにシンプルな動作を提案しましたが、複雑な動作をさせたいなら『時間』と『距離』をセットにデータをテーブル化したほうが分かりやすいと思います。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#38

投稿記事 by mi_l » 12年前

返信ありがとうございます。

ISLe さんが書きました: スレの伸びとともにmi_lさん自身が考えず言われるままコードを書くだけになっていっているように感じます。
という個所なのですが、上級者から見れば、まだ全然未熟な私の返答がまったく意図してないことで困惑することもあると思いますが、自分なりに考えた返答を毎回しております。
「なんでここもわからないの?」という感情は当然持たれるとは思います。ですが、丸写しでいいやとか、そのようなことは一切ありません。そのことはご理解いただきたいです


動作確認しましたが・・・動きません

以下は表示が必要だと思ったソース
GameMgr

コード:

package net.dixq.irairabar;

import java.util.ArrayList;
import java.util.LinkedList;

import net.dixq.irairabar.Barricade.eType;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.annotation.SuppressLint;
import android.content.res.Resources;
import android.content.Context;


public class GameMgr {

    private enum eStatus{
        NORMAL,
        GAMEOVER,
        GAMECLEAR
    };

    private static final float PI = (float) Math.PI;
    private ArrayList<Barricade> _barrList = new ArrayList<Barricade>();//障害物リスト
    private LinkedList<Task> _taskList = new LinkedList<Task>();// タスクリスト
    private eStatus _status = eStatus.NORMAL;
    private Player _player;

    GameMgr(Context con)
    {

        Resources res = con.getResources();
        Bitmap bits = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);

       // _barrList.add(new BarricadeSquare(  20,  30, 700,800, null));

        _barrList.add(new BarricadeSquare(  70 , 60,100, 100, new BConf(Barricade.eType.OUT) , bits));// 画面4隅に四角形を配置

        /*
        _barrList.add(new BarricadeSquare(460,  0, 20,800, null));
        _barrList.add(new BarricadeSquare(  0,780,480, 20, null));

        _barrList.add(new BarricadeTriangle(  0, 0, 200, new BConf(+PI / 150),));// 左上回転する三角形
        _barrList.add(new BarricadeTriangle(480, 0, 180, new BConf(+PI / 150)));// 右上回転する三角形

        _barrList.add(new BarricadeStar(240, 240, 50, 200, new BConf(-PI / 360)));// 中央に回転する星
        _barrList.add(new BarricadeStar(240, 240, 20,  80, new BConf(+PI / 360)));// 中央に回転する星

        _barrList.add(new BarricadeSquare(300, 440, 200, 20, null));//右下の固定通路
        _barrList.add(new BarricadeSquare(250, 520, 130, 20, null));//
        _barrList.add(new BarricadeSquare(330, 620, 130, 20, null));//

        _barrList.add(new BarricadeSquare(230, 390, 20, 350, null));//中央区切り線

        _barrList.add(new BarricadeSquare(0, 480, 240, 20, new BConf(+PI / 360)));// 左下回転するバー

        _barrList.add(new BarricadeSquare( 20, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(130, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(185, 600,  55, 20, new BConf(+PI / 360)));// 左下回転するバー

*/
    //  _barrList.add(new BarricadeSquare(20, 680,  80, 20, null));// ゴールに接触したバー

    //  _barrList.add(new BarricadeSquare(20, 700,  80, 80, new BConf(eType.GOAL)));// ゴール

        for (Barricade bar : _barrList) {
            _taskList.add(bar); //タスクリストに障害物を追加
        }

        _player = new Player();
        _taskList.add(_player);
        _taskList.add(new FpsController());
    }

    private boolean Collision(){
        Vec vec = new Vec();
        final Circle cir = _player.getPt();
        for(Barricade barr : _barrList){
            Def.eHitCode code = barr.isHit(cir, vec);
            switch(code){
            case OUT:
                _status = eStatus.GAMEOVER;
                return true;
            case GOAL:
                _status = eStatus.GAMECLEAR;
                return true;
            }
        }
        return false;
    }

    public boolean onUpdate()
    {

        if( _status != eStatus.NORMAL ){
            return true;
        }
        if( Collision() ){
            return true;
        }
        for (int i = 0; i < _taskList.size(); i++) {
            if (_taskList.get(i).onUpdate() == false) { // 更新失敗なら
                _taskList.remove(i); // そのタスクを消す
                i--;
            }
        }
        return true;
    }

    private void drawStatus(Canvas c){
        switch( _status ){
        case GAMEOVER:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameOver", 40, 100, paint);
            }
            break;
        case GAMECLEAR:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameClear", 40, 100, paint);
            }
            break;
        }
    }


@SuppressLint("WrongCall")
public void onDraw(Canvas c)
{
//白く塗りつぶす
c.drawColor(Color.WHITE);
for (Task task : _taskList)
{
//描画
task.onDraw(c);
}
drawStatus(c);
}

}
BConf.java

コード:

package net.dixq.irairabar;

public class BConf {
	public float speed = 0;//回転のスピード

	public Barricade.eType type = Barricade.eType.OUT;

	public BConf(Barricade.eType atype){
		type = atype;
	}

	public BConf(float aspeed){
		speed = aspeed;
	}

	//Barricadeの座標を更新する
	public void doUpdate(Barricade barricade)
	{
		//今のところはまだ空
	}

}
BMoveConf

コード:

package net.dixq.irairabar;

public class BMoveConf extends BConf
{
	protected BMover mover ;
	protected int f_cnt;//フレームカウンタ

	public BMoveConf(BMover mover)
	{
		super(Barricade.eType.OUT);
		this.mover = mover;
	}

	//
	@Override
	public void doUpdate(Barricade barricade)
	{

		//BMoverのdoUpdateメソッド呼び出し
		mover.doUpdate(barricade, f_cnt);

		f_cnt++;//カウントを加算
	}

}
BMover

コード:

package net.dixq.irairabar;

public class BMover
{
	//60フレームで60px移動だから・・・・
		public int num_frames = 60;//フレーム数
		public int distance = 60;//移動距離



	public BMover(/*int frame , int dis*/)//引数には「フレーム数」と「移動距離」
	{
		//メンバ変数に登録(格納)
		//num_frames = frame;
		//distance = dis;
	}

	//Barricadeの座標を更新する
	public void doUpdate(Barricade barricade, int count)
	{
		float dx = 0.0f;//x座標
        float dy = 0.0f;//y座標

        // distanceピクセルの距離を・・・・、
        // num_framesフレーム掛けて下り
        // num_framesフレーム掛けて上がる
        count %= num_frames * 2; // 往復だとnum_framesの倍の時間かかる

        if (count < num_frames)
        {
            // 行き
            dy = (float)distance / num_frames;
        } else
        {
            // 帰り
            dy = -(float)distance / num_frames;
        }

        barricade.move(dx, dy);


	}


}
BarricadeSquare

コード:

package net.dixq.irairabar;

import android.graphics.Bitmap;


public class BarricadeSquare extends Barricade {

    public BarricadeSquare( float x, float y, float w, float h, BConf conf, Bitmap img ){
        super(4,conf, img);
        _pt[0].x  = x;      _pt[0].y = y;
        _pt[1].x  = x+w;    _pt[1].y = y;
        _pt[2].x  = x+w;    _pt[2].y = y+h;
        _pt[3].x  = x;      _pt[3].y = y+h;
        _center.x = x+w/2;
        _center.y = y+h/2;


    }
    public BarricadeSquare( float x, float y, float w, float h, BConf conf)
    {
        this(x, y ,w, h, conf, null);

    }

}
長くなりましたがご指摘お願いします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#39

投稿記事 by ISLe » 12年前

GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。

mi_l さんが書きました:という個所なのですが、上級者から見れば、まだ全然未熟な私の返答がまったく意図してないことで困惑することもあると思いますが、自分なりに考えた返答を毎回しております。
「なんでここもわからないの?」という感情は当然持たれるとは思います。ですが、丸写しでいいやとか、そのようなことは一切ありません。そのことはご理解いただきたいです
わたしが気にしているのは、わたしが書いてくださいと言ったコードは書くけども、わたしが日本語で説明したことは読んでいないのか理解していないのか同じような失敗を何度も繰り返すことです。

BMoveConfはBConfを拡張して差し替えるものであることは最初に書きました。
どうして「BMoveConfを使うにはどうしたら?」でなく「動きませんどうして?」なのでしょう。


わたしは容易に調べることができることを調べなかったり分からないことを分からないと言わずにその場しのぎをすることに腹を立てますが、分からないことを「こんなことも分からないのか」というのはもっと嫌いです。
世間一般はどうか知りませんが当然だとはまったく思いません。
#調べ方を教えた上で「どうして調べないんだ」ということはしょっちゅうありますが。

mi_lさんはそんなつもりではないと思いますが、わたしのことを、(わたしの考える)最低な人間だとおっしゃったわけです。

これまでの説明で障害物を動かすことはできるはずなので、あとはご自身で頑張ってください。
分からないことは新たにスレを立てれば誰か教えてくれる人が現れるかもしれません。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#40

投稿記事 by mi_l » 12年前

返信ありがとうございます。

このトピックを見直し、自分なりに何回も訂正し、実行を繰り返しましたができませんでした。(移動はできませんでした。)

自分なりにやることはやったつもりですので、それでできないということは見落としがあるとしか思えません。

まだ全然未熟さを感じました。

これ以上は放置になってしまいますのでここで解決とさせてもらいます。(一区切りさせてもらいます)

また、参考書を読み返し、新たなアプリ開発の本でも買い、勉強します。

この質問は、この前のトピックから続いていますがこれまで教わってきた考え方、テクニックは必ず自分の技量につながるので感謝しています。


>>ISLe様

ご教授いただいている立場でありながら最後には不快な記載をして申し訳ありませんでした。これまで長い間丁寧にご指摘いただきありがとうございます。
ここで教わったことは必ず私の技量になりますし、新たなアプリを作ろうと思った時に必ず役に立つと思います。 最後まで感謝いたします。

また、ここの掲示板は利用させていただくことがあると思いますので、今後ともよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#41

投稿記事 by softya(ソフト屋) » 12年前

横から失礼します。
ざっと見させてもらいましてが、クラスの継承などの意味が理解できていないのでは無いでしょうか?
質問の流れてみていると、それに付いては一切質問がされていません。 → ISLeさんが問題にしているのもそこです。
BMoveConfがどういう物なのか、どう使うべきなのか、まったく理解できていないのではありませんか?
ISLeさんが分からないなら、そこを聞いて欲しいと言っているんだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#42

投稿記事 by mi_l » 12年前

>>softyaさん

解決後ですが返信ありがとうございます。
softya(ソフト屋) さんが書きました:横から失礼します。
ざっと見させてもらいましてが、クラスの継承などの意味が理解できていないのでは無いでしょうか?
質問の流れてみていると、それに付いては一切質問がされていません。 → ISLeさんが問題にしているのもそこです。
BMoveConfがどういう物なのか、どう使うべきなのか、まったく理解できていないのではありませんか?
ISLeさんが分からないなら、そこを聞いて欲しいと言っているんだと思います。
というご指摘なのですが、

BMoveConfはBMoverのdoUpdateを呼び出し、フレームの加算をし、コンストラクタにもある通りBMoverを呼び出し続ける・・

そしてBMoverはその設定。ここではdy(y軸だけの移動なので)は「行きと帰り」の動作を行う。よって往復では60x2フレームかかる。
設定では60px/60フレームなので差分の値(60フレーム未満までは+1pxを、60フレーム以上はー1pxを代入し、Barricadeのmoveへと送る(dxは0.0fのまま))

Barricadeのmoveにきて初めて画像がその分(ここだと1px(-1px))動く・・・ということですよね・・・



自分なりに仕組みを整理してみますと

BMoverという部署のdoUpdateメソッドが場合に分けて1フレームあたりの差分の値をdyという入れ物に格納しBarricadeの実際に値を元にして動かす部署(move)へと渡す。

ですがこれでは1px動いて終わる(?)

ここでBMoveConfという部署はBMoverのdoUpdateを呼び出し続け、さらにフレームのカウントを加算する役割がある。

つまり、BMoverのdoUpdateの場合分けはこの加算により機能される。

BMoverがBMoveConfに毎回呼び出され続けることで毎回Barricadeのmoveにも差分の値である1(px)がいく

そこで、60フレームまでBMoveConfがカウントを加算し始めた時、BMoverのdoUpdateメソッドにより処理が変わる(moveに渡す値が1px→ー1pxになる)

BMoveConfは依然としてBMoverを呼び出し、加算を続けるので、実際に障害物は60フレームかけて60px下がり、60フレームかけて60px上がるということになる・・・


というのが私なりの考えなのですが・・・・


なにか「整理」できてない感が否めませんが・・・このような表現が今の私にできるやり方なので・・・・・

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#43

投稿記事 by ISLe » 12年前

ISLe さんが書きました:GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
この日本語の文章を読んでいないのでしょうか。それとも理解できなかったのでしょうか。

コードは『想定して』書くものだということも以前書きましたね。
書いただけでは動かないし、Eclipseのデバッグや実行のコマンドを選択したら書いたコードがすべて実行されるわけでもありません。

BMoveConfやBMoverを作ってもそれをどこからも呼び出していないのに障害物が動くはずありません。
クラスがどうとか以前に、プログラムの実行の仕組みそのものを理解できていないと感じます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#44

投稿記事 by softya(ソフト屋) » 12年前

もしかしたらインスタンスとかクラスを継承することで関連性がどうなるのかがまったく掴めていないんでしょうか?
親の性質は子に継承されますが親は親のままです。
なので、class BConfのインスタンスをどう動かしてもclass BMoveConfの持つ性質は一切発現しません。
class BMoveConfの機能はclass BMoveConfのインスタンスがもっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#45

投稿記事 by mi_l » 12年前

返信ありがとうございます
ISLe さんが書きました:
ISLe さんが書きました:GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
この日本語の文章を読んでいないのでしょうか。それとも理解できなかったのでしょうか。

コードは『想定して』書くものだということも以前書きましたね。
書いただけでは動かないし、Eclipseのデバッグや実行のコマンドを選択したら書いたコードがすべて実行されるわけでもありません。

BMoveConfやBMoverを作ってもそれをどこからも呼び出していないのに障害物が動くはずありません。
クラスがどうとか以前に、プログラムの実行の仕組みそのものを理解できていないと感じます。
の指摘にありますように「解決」とさせていただく段階でGameMgrは書き換え、実行もしてみました。

GameMgr
(変更箇所:41行目)

コード:

package net.dixq.irairabar;

import java.util.ArrayList;
import java.util.LinkedList;

import net.dixq.irairabar.Barricade.eType;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.annotation.SuppressLint;
import android.content.res.Resources;
import android.content.Context;


public class GameMgr {

    private enum eStatus{
        NORMAL,
        GAMEOVER,
        GAMECLEAR
    };

    private static final float PI = (float) Math.PI;
    private ArrayList<Barricade> _barrList = new ArrayList<Barricade>();//障害物リスト
    private LinkedList<Task> _taskList = new LinkedList<Task>();// タスクリスト
    private eStatus _status = eStatus.NORMAL;
    private Player _player;

//private BMover bm;

    GameMgr(Context con)
    {

        Resources res = con.getResources();
        Bitmap bits = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);

       // _barrList.add(new BarricadeSquare(  20,  30, 700,800, null));

        _barrList.add(new BarricadeSquare(  70 , 60,100, 100, new BMoveConf(null) , bits));// 画面4隅に四角形を配置

        /*
        _barrList.add(new BarricadeSquare(460,  0, 20,800, nul
        _barrList.add(new BarricadeSquare(  0,780,480, 20, null));

        _barrList.add(new BarricadeTriangle(  0, 0, 200, new BConf(+PI / 150),));// 左上回転する三角形
        _barrList.add(new BarricadeTriangle(480, 0, 180, new BConf(+PI / 150)));// 右上回転する三角形

        _barrList.add(new BarricadeStar(240, 240, 50, 200, new BConf(-PI / 360)));// 中央に回転する星
        _barrList.add(new BarricadeStar(240, 240, 20,  80, new BConf(+PI / 360)));// 中央に回転する星

        _barrList.add(new BarricadeSquare(300, 440, 200, 20, null));//右下の固定通路
        _barrList.add(new BarricadeSquare(250, 520, 130, 20, null));//
        _barrList.add(new BarricadeSquare(330, 620, 130, 20, null));//

        _barrList.add(new BarricadeSquare(230, 390, 20, 350, null));//中央区切り線

        _barrList.add(new BarricadeSquare(0, 480, 240, 20, new BConf(+PI / 360)));// 左下回転するバー

        _barrList.add(new BarricadeSquare( 20, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(130, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(185, 600,  55, 20, new BConf(+PI / 360)));// 左下回転するバー

*/
    //  _barrList.add(new BarricadeSquare(20, 680,  80, 20, null));// ゴールに接触したバー

    //  _barrList.add(new BarricadeSquare(20, 700,  80, 80, new BConf(eType.GOAL)));// ゴール

        for (Barricade bar : _barrList) {
            _taskList.add(bar); //タスクリストに障害物を追加
        }

        _player = new Player();
        _taskList.add(_player);
        _taskList.add(new FpsController());
    }

    private boolean Collision(){
        Vec vec = new Vec();
        final Circle cir = _player.getPt();
        for(Barricade barr : _barrList){
            Def.eHitCode code = barr.isHit(cir, vec);
            switch(code){
            case OUT:
                _status = eStatus.GAMEOVER;
                return true;
            case GOAL:
                _status = eStatus.GAMECLEAR;
                return true;
            }
        }
        return false;
    }

    public boolean onUpdate()
    {

        if( _status != eStatus.NORMAL ){
            return true;
        }
        if( Collision() ){
            return true;
        }
        for (int i = 0; i < _taskList.size(); i++) {
            if (_taskList.get(i).onUpdate() == false) { // 更新失敗なら
                _taskList.remove(i); // そのタスクを消す
                i--;
            }
        }
        return true;
    }

    private void drawStatus(Canvas c){
        switch( _status ){
        case GAMEOVER:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameOver", 40, 100, paint);
            }
            break;
        case GAMECLEAR:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameClear", 40, 100, paint);
            }
            break;
        }
    }


@SuppressLint("WrongCall")
public void onDraw(Canvas c)
{
//白く塗りつぶす
c.drawColor(Color.WHITE);
for (Task task : _taskList)
{
//描画
task.onDraw(c);
}
drawStatus(c);
}

}
この場合は「null」ですがそれ以外の

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#46

投稿記事 by mi_l » 12年前

プレビューと間違え「送信」を押してしまいました。

もう一回正しく返信しなおします。

お手間かけます。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#47

投稿記事 by mi_l » 12年前

返信ありがとうございます
ISLe さんが書きました:
ISLe さんが書きました:GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
この日本語の文章を読んでいないのでしょうか。それとも理解できなかったのでしょうか。

コードは『想定して』書くものだということも以前書きましたね。
書いただけでは動かないし、Eclipseのデバッグや実行のコマンドを選択したら書いたコードがすべて実行されるわけでもありません。

BMoveConfやBMoverを作ってもそれをどこからも呼び出していないのに障害物が動くはずありません。
クラスがどうとか以前に、プログラムの実行の仕組みそのものを理解できていないと感じます。
との指摘の部分なのですが、「解決」とさせてもたった時に書き換え、実行もしてみました・・・

GameMgr
(変更箇所:33、43行目)
(もちろん、この後、BarricadeSquare , Barricade のコンストラクタの引数も「BMoveConf conf」にしました。 )

コード:

package net.dixq.irairabar;

import java.util.ArrayList;
import java.util.LinkedList;

import net.dixq.irairabar.Barricade.eType;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.annotation.SuppressLint;
import android.content.res.Resources;
import android.content.Context;


public class GameMgr {

    private enum eStatus{
        NORMAL,
        GAMEOVER,
        GAMECLEAR
    };

    private static final float PI = (float) Math.PI;
    private ArrayList<Barricade> _barrList = new ArrayList<Barricade>();//障害物リスト
    private LinkedList<Task> _taskList = new LinkedList<Task>();// タスクリスト
    private eStatus _status = eStatus.NORMAL;
    private Player _player;

    private BMover bm  = new BMover();

    GameMgr(Context con)
    {

        Resources res = con.getResources();
        Bitmap bits = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);

       // _barrList.add(new BarricadeSquare(  20,  30, 700,800, null));

        _barrList.add(new BarricadeSquare(  70 , 60,100, 100, new BMoveConf(bm) , bits));// 画面4隅に四角形を配置

        /*
        _barrList.add(new BarricadeSquare(460,  0, 20,800, nul
        _barrList.add(new BarricadeSquare(  0,780,480, 20, null));

        _barrList.add(new BarricadeTriangle(  0, 0, 200, new BConf(+PI / 150),));// 左上回転する三角形
        _barrList.add(new BarricadeTriangle(480, 0, 180, new BConf(+PI / 150)));// 右上回転する三角形

        _barrList.add(new BarricadeStar(240, 240, 50, 200, new BConf(-PI / 360)));// 中央に回転する星
        _barrList.add(new BarricadeStar(240, 240, 20,  80, new BConf(+PI / 360)));// 中央に回転する星

        _barrList.add(new BarricadeSquare(300, 440, 200, 20, null));//右下の固定通路
        _barrList.add(new BarricadeSquare(250, 520, 130, 20, null));//
        _barrList.add(new BarricadeSquare(330, 620, 130, 20, null));//

        _barrList.add(new BarricadeSquare(230, 390, 20, 350, null));//中央区切り線

        _barrList.add(new BarricadeSquare(0, 480, 240, 20, new BConf(+PI / 360)));// 左下回転するバー

        _barrList.add(new BarricadeSquare( 20, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(130, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(185, 600,  55, 20, new BConf(+PI / 360)));// 左下回転するバー

*/
    //  _barrList.add(new BarricadeSquare(20, 680,  80, 20, null));// ゴールに接触したバー

    //  _barrList.add(new BarricadeSquare(20, 700,  80, 80, new BConf(eType.GOAL)));// ゴール

        for (Barricade bar : _barrList) {
            _taskList.add(bar); //タスクリストに障害物を追加
        }

        _player = new Player();
        _taskList.add(_player);
        _taskList.add(new FpsController());
    }

    private boolean Collision(){
        Vec vec = new Vec();
        final Circle cir = _player.getPt();
        for(Barricade barr : _barrList){
            Def.eHitCode code = barr.isHit(cir, vec);
            switch(code){
            case OUT:
                _status = eStatus.GAMEOVER;
                return true;
            case GOAL:
                _status = eStatus.GAMECLEAR;
                return true;
            }
        }
        return false;
    }

    public boolean onUpdate()
    {

        if( _status != eStatus.NORMAL ){
            return true;
        }
        if( Collision() ){
            return true;
        }
        for (int i = 0; i < _taskList.size(); i++) {
            if (_taskList.get(i).onUpdate() == false) { // 更新失敗なら
                _taskList.remove(i); // そのタスクを消す
                i--;
            }
        }
        return true;
    }

    private void drawStatus(Canvas c){
        switch( _status ){
        case GAMEOVER:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameOver", 40, 100, paint);
            }
            break;
        case GAMECLEAR:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameClear", 40, 100, paint);
            }
            break;
        }
    }


@SuppressLint("WrongCall")
public void onDraw(Canvas c)
{
//白く塗りつぶす
c.drawColor(Color.WHITE);
for (Task task : _taskList)
{
//描画
task.onDraw(c);
}
drawStatus(c);
}

}
・・・・・・・・ですがこれでは(下にしか)動きません。


私はBMoverで

コード:

package net.dixq.irairabar;

public class BMover
{
	//60フレームで60px移動だから・・・・
		public int num_frames = 60;//フレーム数
		public int distance = 60;//移動距離



	public BMover(/*int frame , int dis*/)//引数には「フレーム数」と「移動距離」
	{
		//メンバ変数に登録(格納)
		//num_frames = frame;
		//distance = dis;
	}

	//Barricadeの座標を更新する
	public void doUpdate(Barricade barricade, int count)
	{
		float dx = 0.0f;//x座標
        float dy = 0.0f;//y座標
        count = 0;

        // distanceピクセルの距離を・・・・、
        // num_framesフレーム掛けて下り
        // num_framesフレーム掛けて上がる
        count %= num_frames * 2; // 往復だとnum_framesの倍の時間かかる

        if (count < num_frames)
        {
            // 行き
            dy = (float)distance / num_frames;
        } else
        {
            // 帰り
            dy = -(float)distance / num_frames;
        }

        barricade.move(dx, dy);


	}


}
としっかりISLeさんの提案通り(記載していただいた)通り、往復の手順を書きました。

ですが、実際に動いたのは「下に」だけです・・・

私は60フレームかけて60px降下し、60フレームかけて60px上昇すると書きました(書いたつもしなのかもしれませんが)

ですので、私は「動きません」と書きました。

更に、ISleさんに対し、失礼なことを記載してしまった手前、最後まで上昇をどうすればいいか試行錯誤しましたができなかったので自分勝手に「解決」させてもらいました。

まだ、ご指摘いただけるのであれば、ご指摘お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#48

投稿記事 by softya(ソフト屋) » 12年前

class BMoverのdoUpdateメソッドの中でcount = 0;としている理由は何ですか?
前になかったはずですが、どういう効果を期待して付け加えましたか?

【補足】
それと解決直前までは、BMoveConfに付いては一切インスタンス化しようとしたことは無かったって事でしょうか。

>GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。

1)これは理解できなかったって事ですかね? → 理解できないなら質問してほしい所です。
2)あるいは、意味が読み取れなかった?
3)あるいは、見逃した?
4)それともBMoveConfとBConfは同じものだと思っていた?

今後のために聞いておきたいのです。

【追記】
雑談トピックが次のページに行ってしまったので、お礼を書いて解決にしておいてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#49

投稿記事 by ISLe » 12年前

mi_l さんが書きました:(もちろん、この後、BarricadeSquare , Barricade のコンストラクタの引数も「BMoveConf conf」にしました。 )
どうしてそんなことをしたのでしょうか。
そんなことをしなくてもエラーは出ないですよね。
そのためにBMoveConfはBConfを継承しているのですし、doUpdateメソッドをオーバーライドしているのです。

既存のコードはそのまま、動かしたい障害物にだけBMoveConfを使う。
使っていないところは今までどおりに動き、BMoveConfを使った障害物だけが移動する。
ということも最初に説明しましたよね。
回転やアニメーションする派生クラスを作ることもできると説明しましたよね。
どうしてBMoveConf専用にしてしまうのですか?

GameMgrの既存の障害物をコメントアウトしている理由が分かりませんが。
mi_l さんが書きました:としっかりISLeさんの提案通り(記載していただいた)通り、往復の手順を書きました。
わたしが記載したとおりではないようですが。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#50

投稿記事 by mi_l » 12年前

返信が遅くなりましたが、無事に解決できました。

BMoverを実装した設定クラスを作り、ステージも作れました。

ご教授ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: androidアプリで困っています。ご教授ください(Ver.2)

#51

投稿記事 by softya(ソフト屋) » 12年前

mi_l さんが書きました:返信が遅くなりましたが、無事に解決できました。

BMoverを実装した設定クラスを作り、ステージも作れました。

ご教授ありがとうございました。
すいません。解決コードの投稿が基本ルールとなっておりますのでお願いします。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: androidアプリで困っています。ご教授ください(Ver.2)

#52

投稿記事 by mi_l » 12年前

基本ルールにのっとり、返信していなかったため、上記の私の返信の追加として、コードを載せます

BMover.java

コード:

package net.dixq.irairabar;

public interface BMover {

	//Barricadeの座標を更新する(ver1)(なしと考える
	public abstract void doUpdate(Barricade barricade, int count);

}
自分で作った「BmoverA」「BMoverB」

コード:

package net.dixq.irairabar;

public class BMoverA implements BMover
{
	//60フレームで60px移動だから・・・・
		public int num_frames = 60;//フレーム数
		public int distance = 60;//移動距離



	public BMoverA(/*int frame , int dis*/)//引数には「フレーム数」と「移動距離」
	{
		//メンバ変数に登録(格納)
		//num_frames = frame;
		//distance = dis;
	}

	//Barricadeの座標を更新する(ver1)(なしと考える
	public void doUpdate(Barricade barricade, int count)
	{
		float dx = 0.0f;//x座標
        float dy = 0.0f;//y座標
        //count = 0;

        // distanceピクセルの距離を・・・・、
        // num_framesフレーム掛けて下り
        // num_framesフレーム掛けて上がる
        count %= num_frames * 2; // 往復だとnum_framesの倍の時間かかる

       if (count < num_frames)
        {
            // 行き
            dy = (float)distance / num_frames;
        }
       else
        {
            // 帰り
            dy = -(float)distance / num_frames;
        }

        barricade.move(dx, dy);


	}
}

コード:

package net.dixq.irairabar;

public class BMoverB implements BMover
{
	//60フレームで60px移動だから・・・・
		public int num_frames = 60;//フレーム数
		public int distance = 200;//移動距離



	public BMoverB(/*int frame , int dis*/)//引数には「フレーム数」と「移動距離」
	{
		//メンバ変数に登録(格納)
		//num_frames = frame;
		//distance = dis;
	}

	//Barricadeの座標を更新する(ver1)(なしと考える
	public void doUpdate(Barricade barricade, int count)
	{
		float dx = 0.0f;//x座標
        float dy = 0.0f;//y座標
        //count = 0;

        // distanceピクセルの距離を・・・・、
        // num_framesフレーム掛けて下り
        // num_framesフレーム掛けて上がる
        count %= num_frames * 3; // 往復だとnum_framesの倍の時間かかる

       if (count < num_frames)
        {
            // 行き
            dy = (float)distance / num_frames;
        }
       else if(count >= num_frames && count < (num_frames*2))//停止
       {
    	   dy = 0;
       }
       else
        {
            // 帰り
            dy = -(float)distance / num_frames;
        }

        barricade.move(dx, dy);


	}
}
GameMgr.java
(変更(追記)箇所:33,34、45,47行目)

コード:

package net.dixq.irairabar;

import java.util.ArrayList;
import java.util.LinkedList;

import net.dixq.irairabar.Barricade.eType;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.annotation.SuppressLint;
import android.content.res.Resources;
import android.content.Context;


public class GameMgr {

    private enum eStatus{
        NORMAL,
        GAMEOVER,
        GAMECLEAR
    };

    private static final float PI = (float) Math.PI;
    private ArrayList<Barricade> _barrList = new ArrayList<Barricade>();//障害物リスト
    private LinkedList<Task> _taskList = new LinkedList<Task>();// タスクリスト
    private eStatus _status = eStatus.NORMAL;
    private Player _player;

    private BMoverA bma  = new BMoverA();
    private BMoverB bmb = new BMoverB();

    /*private int Dflag = 0;//描画フラグ
    private float x , y;*/

    GameMgr(Context con)
    {

        Resources res = con.getResources();
        Bitmap bits = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);

        _barrList.add(new BarricadeSquare(  220,  30, 100,100, new BMoveConf(bmb) , bits));

        _barrList.add(new BarricadeSquare(  70 , 60, 100, 100, new BMoveConf(bma) , bits));// 画面4隅に四角形を配置

/*
        _barrList.add(new BarricadeTriangle(  0, 0, 200, new BConf(+PI / 150),));// 左上回転する三角形
        _barrList.add(new BarricadeTriangle(480, 0, 180, new BConf(+PI / 150)));// 右上回転する三角形

        _barrList.add(new BarricadeStar(240, 240, 50, 200, new BConf(-PI / 360)));// 中央に回転する星
        _barrList.add(new BarricadeStar(240, 240, 20,  80, new BConf(+PI / 360)));// 中央に回転する星

        _barrList.add(new BarricadeSquare(300, 440, 200, 20, null));//右下の固定通路
        _barrList.add(new BarricadeSquare(250, 520, 130, 20, null));//
        _barrList.add(new BarricadeSquare(330, 620, 130, 20, null));//

        _barrList.add(new BarricadeSquare(230, 390, 20, 350, null));//中央区切り線

        _barrList.add(new BarricadeSquare(0, 480, 240, 20, new BConf(+PI / 360)));// 左下回転するバー

        _barrList.add(new BarricadeSquare( 20, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(130, 600, 110, 20, new BConf(+PI / 360)));// 左下回転するバー
        _barrList.add(new BarricadeSquare(185, 600,  55, 20, new BConf(+PI / 360)));// 左下回転するバー

*/
    //  _barrList.add(new BarricadeSquare(20, 680,  80, 20, null));// ゴールに接触したバー

    //  _barrList.add(new BarricadeSquare(20, 700,  80, 80, new BConf(eType.GOAL)));// ゴール

        for (Barricade bar : _barrList) {
            _taskList.add(bar); //タスクリストに障害物を追加
        }

        _player = new Player();
        _taskList.add(_player);
        _taskList.add(new FpsController());
    }

    private boolean Collision(){
        Vec vec = new Vec();
        final Circle cir = _player.getPt();
        for(Barricade barr : _barrList){
            Def.eHitCode code = barr.isHit(cir, vec);
            switch(code){
            case OUT:
                _status = eStatus.GAMEOVER;
                return true;
            case GOAL:
                _status = eStatus.GAMECLEAR;
                return true;
            }
        }
        return false;
    }

    public boolean onUpdate()
    {

        if( _status != eStatus.NORMAL ){
            return true;
        }
        if( Collision() ){
            return true;
        }
        for (int i = 0; i < _taskList.size(); i++) {
            if (_taskList.get(i).onUpdate() == false) { // 更新失敗なら
                _taskList.remove(i); // そのタスクを消す
                i--;
            }
        }
        return true;
    }

    private void drawStatus(Canvas c){
        switch( _status ){
        case GAMEOVER:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameOver", 40, 100, paint);
            }
            break;
        case GAMECLEAR:
            {
                Paint paint = new Paint();
                paint.setTextSize(80);
                paint.setColor(Color.BLACK);
                c.drawText("GameClear", 40, 100, paint);
            }
            break;
        }
    }


@SuppressLint("WrongCall")
public void onDraw(Canvas c)
{
//白く塗りつぶす
c.drawColor(Color.WHITE);
for (Task task : _taskList)
{
//描画
task.onDraw(c);
}
drawStatus(c);
}

}
二つの障害物に違う動きをさせることができました。

閉鎖

“C言語何でも質問掲示板” へ戻る