androidアプリで困っています。ご教授ください(Ver.2)
Re: androidアプリで困っています。ご教授ください(Ver.2)
bConf.doUpdate(this);
は引数ではなく、呼び出し文全体です。
thisが呼び出したBarricade自身を指します。
Barricadeのmoveメソッドを使うのはBMoveConfではなく、BMoverの間違いです。
すみませんでした。
BMoveConfはBMoveに処理を委譲するだけです。
#分かりやすく言えば丸投げ。
フレームカウントを進める処理だけを加えてください。
Barricadeのmoveメソッドは引数で与えられたX,Yの差分を使って座標をずらします。
こちらも考えてみてください。
は引数ではなく、呼び出し文全体です。
thisが呼び出したBarricade自身を指します。
Barricadeのmoveメソッドを使うのはBMoveConfではなく、BMoverの間違いです。
すみませんでした。
BMoveConfはBMoveに処理を委譲するだけです。
#分かりやすく言えば丸投げ。
フレームカウントを進める処理だけを加えてください。
Barricadeのmoveメソッドは引数で与えられたX,Yの差分を使って座標をずらします。
こちらも考えてみてください。
Re: androidアプリで困っています。ご教授ください(Ver.2)
返信ありがとうございます。
Barricade.java
(追記(変更)個所:61~66、75行目)
そしてBMoveConf.java
(追記:22行目)
そしてBMover.java
(追記:doUpdateメソッド内(途中で自分の考えが間違ってることに気付いたので断念してしまいました・・・一応消さないで残してありますが・・・))
ご指摘、ご教授お願いします。
の部分である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);
}
}
}
(追記: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++;//カウントを加算
}
}
(追記: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);
}
}
ご指摘、ご教授お願いします。
Re: androidアプリで困っています。ご教授ください(Ver.2)
引数を書き換えても何も起きませんよ。
Barricadeの座標はどのように管理されているかコードから読み取ってください。
画像を描画するコードに何やらオフセットが加えられていますが、これは何でしょうか。
画像イメージが合わなくて適当に書き加えたのだと推測しますが、ここで指定するサイズには意味があります。
意味を捻じ曲げるようなことはしないでください。
すべての動作に影響してしまいます。
画像に合わせて調整する必要があるのなら、調整するための仕組みを新たに実装してください。
その場しのぎは無駄を増やすだけだと言いましたよね。
Barricadeの座標はどのように管理されているかコードから読み取ってください。
画像を描画するコードに何やらオフセットが加えられていますが、これは何でしょうか。
画像イメージが合わなくて適当に書き加えたのだと推測しますが、ここで指定するサイズには意味があります。
意味を捻じ曲げるようなことはしないでください。
すべての動作に影響してしまいます。
画像に合わせて調整する必要があるのなら、調整するための仕組みを新たに実装してください。
その場しのぎは無駄を増やすだけだと言いましたよね。
Re: androidアプリで困っています。ご教授ください(Ver.2)
Barricadeのmoveメソッドです。
引数の変数名を変えました。
BMoverのdoUpdateメソッドです。
distance,num_framesの宣言に初期値を設定してください。
誤差が出るやり方なので気に入らないですが踏襲します。
複雑になりますし。
引数の変数名を変えました。
public void move(float dx , float dy)
{
for (int i=0; i<_pt.length; i++) {
_pt[i].offset(dx, dy); // 頂点座標をズラす
}
_center.offset(dx, dy); // 中心座標をズラす
}
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);
}
複雑になりますし。
Re: androidアプリで困っています。ご教授ください(Ver.2)
画像の描画範囲を頂点座標から求めているのは、前のスレでBarricadeSquareを前提として作成したためです。
他の図形は頂点の数も配置も違うので使えません。
描画先の矩形を示す情報を別に用意してそれぞれのコンストラクタで引数から計算して適切に設定することで他の図形にも対応できます。
BMoverのパターンを増やすなら、BMoverをインターフェースにして、現在のBMoverはインターフェースを継承した別のクラスにしましょう。
他の図形は頂点の数も配置も違うので使えません。
描画先の矩形を示す情報を別に用意してそれぞれのコンストラクタで引数から計算して適切に設定することで他の図形にも対応できます。
BMoverのパターンを増やすなら、BMoverをインターフェースにして、現在のBMoverはインターフェースを継承した別のクラスにしましょう。
Re: androidアプリで困っています。ご教授ください(Ver.2)
返信ありがとうございます。
実際にコードまで書いていただき、ありがとうございます。
以下に、変更後のコードと、インターフェース、また実装したBMoverの別パターン(BMoverA)のソースも載せます。
Barricade.java
(変更(追記)箇所:61~70、117行目)
BMover.java
(変更(追記)箇所:5~7行目、doUpdateメソッド内)
そして、ここからはBmoverのパターンを増やそうとしているとかていして作ったものです
(上のBMoverにインターフェースが実装されてないように下記の二つのファイルはプロジェクトにまだ入っていません)
BMovers.java
BMoverA.java
ソース変更、インターフェース、また実装クラスに対して、
ご指摘、ご教授お願いします。
については、指摘された通り、実行するときに私が微調整と題してやってしまったことです。申し訳ありませんでした。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);
}
}
}
(変更(追記)箇所: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にインターフェースが実装されてないように下記の二つのファイルはプロジェクトにまだ入っていません)
BMovers.java
package net.dixq.irairabar;
import net.dixq.irairabar.Barricade;
interface BMovers
{
public void doUpdate(Barricade barricade , int count);
}
//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);
}
}
ご指摘、ご教授お願いします。
Re: androidアプリで困っています。ご教授ください(Ver.2)
移動パターンを増やす前に動作確認はしたのでしょうか。
主題である、障害物を動かす目的は果たせたと思いますが。
スレの伸びとともにmi_lさん自身が考えず言われるままコードを書くだけになっていっているように感じます。
既にBMoverで作ってあるところを書き換えないようにするためにはインターフェースの名前がBMoverでないといけません。
Eclipseなら一発で置き換えできますが、コードを書き換えずに拡張することに意味があります。
いつまでもdistanceとnum_framesの変数にこだわる必要はありません。
『時間』と『距離』を意識するためにシンプルな動作を提案しましたが、複雑な動作をさせたいなら『時間』と『距離』をセットにデータをテーブル化したほうが分かりやすいと思います。
主題である、障害物を動かす目的は果たせたと思いますが。
スレの伸びとともにmi_lさん自身が考えず言われるままコードを書くだけになっていっているように感じます。
既にBMoverで作ってあるところを書き換えないようにするためにはインターフェースの名前がBMoverでないといけません。
Eclipseなら一発で置き換えできますが、コードを書き換えずに拡張することに意味があります。
いつまでもdistanceとnum_framesの変数にこだわる必要はありません。
『時間』と『距離』を意識するためにシンプルな動作を提案しましたが、複雑な動作をさせたいなら『時間』と『距離』をセットにデータをテーブル化したほうが分かりやすいと思います。
Re: androidアプリで困っています。ご教授ください(Ver.2)
返信ありがとうございます。
「なんでここもわからないの?」という感情は当然持たれるとは思います。ですが、丸写しでいいやとか、そのようなことは一切ありません。そのことはご理解いただきたいです
動作確認しましたが・・・動きません
以下は表示が必要だと思ったソース
GameMgr
BConf.java
BMoveConf
BMover
BarricadeSquare
長くなりましたがご指摘お願いします。
という個所なのですが、上級者から見れば、まだ全然未熟な私の返答がまったく意図してないことで困惑することもあると思いますが、自分なりに考えた返答を毎回しております。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);
}
}
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)
{
//今のところはまだ空
}
}
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++;//カウントを加算
}
}
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);
}
}
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);
}
}
Re: androidアプリで困っています。ご教授ください(Ver.2)
GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
BMoveConfはBConfを拡張して差し替えるものであることは最初に書きました。
どうして「BMoveConfを使うにはどうしたら?」でなく「動きませんどうして?」なのでしょう。
わたしは容易に調べることができることを調べなかったり分からないことを分からないと言わずにその場しのぎをすることに腹を立てますが、分からないことを「こんなことも分からないのか」というのはもっと嫌いです。
世間一般はどうか知りませんが当然だとはまったく思いません。
#調べ方を教えた上で「どうして調べないんだ」ということはしょっちゅうありますが。
mi_lさんはそんなつもりではないと思いますが、わたしのことを、(わたしの考える)最低な人間だとおっしゃったわけです。
これまでの説明で障害物を動かすことはできるはずなので、あとはご自身で頑張ってください。
分からないことは新たにスレを立てれば誰か教えてくれる人が現れるかもしれません。
わたしが気にしているのは、わたしが書いてくださいと言ったコードは書くけども、わたしが日本語で説明したことは読んでいないのか理解していないのか同じような失敗を何度も繰り返すことです。mi_l さんが書きました:という個所なのですが、上級者から見れば、まだ全然未熟な私の返答がまったく意図してないことで困惑することもあると思いますが、自分なりに考えた返答を毎回しております。
「なんでここもわからないの?」という感情は当然持たれるとは思います。ですが、丸写しでいいやとか、そのようなことは一切ありません。そのことはご理解いただきたいです
BMoveConfはBConfを拡張して差し替えるものであることは最初に書きました。
どうして「BMoveConfを使うにはどうしたら?」でなく「動きませんどうして?」なのでしょう。
わたしは容易に調べることができることを調べなかったり分からないことを分からないと言わずにその場しのぎをすることに腹を立てますが、分からないことを「こんなことも分からないのか」というのはもっと嫌いです。
世間一般はどうか知りませんが当然だとはまったく思いません。
#調べ方を教えた上で「どうして調べないんだ」ということはしょっちゅうありますが。
mi_lさんはそんなつもりではないと思いますが、わたしのことを、(わたしの考える)最低な人間だとおっしゃったわけです。
これまでの説明で障害物を動かすことはできるはずなので、あとはご自身で頑張ってください。
分からないことは新たにスレを立てれば誰か教えてくれる人が現れるかもしれません。
Re: androidアプリで困っています。ご教授ください(Ver.2)
返信ありがとうございます。
このトピックを見直し、自分なりに何回も訂正し、実行を繰り返しましたができませんでした。(移動はできませんでした。)
自分なりにやることはやったつもりですので、それでできないということは見落としがあるとしか思えません。
まだ全然未熟さを感じました。
これ以上は放置になってしまいますのでここで解決とさせてもらいます。(一区切りさせてもらいます)
また、参考書を読み返し、新たなアプリ開発の本でも買い、勉強します。
この質問は、この前のトピックから続いていますがこれまで教わってきた考え方、テクニックは必ず自分の技量につながるので感謝しています。
>>ISLe様
ご教授いただいている立場でありながら最後には不快な記載をして申し訳ありませんでした。これまで長い間丁寧にご指摘いただきありがとうございます。
ここで教わったことは必ず私の技量になりますし、新たなアプリを作ろうと思った時に必ず役に立つと思います。 最後まで感謝いたします。
また、ここの掲示板は利用させていただくことがあると思いますので、今後ともよろしくお願いします。
このトピックを見直し、自分なりに何回も訂正し、実行を繰り返しましたができませんでした。(移動はできませんでした。)
自分なりにやることはやったつもりですので、それでできないということは見落としがあるとしか思えません。
まだ全然未熟さを感じました。
これ以上は放置になってしまいますのでここで解決とさせてもらいます。(一区切りさせてもらいます)
また、参考書を読み返し、新たなアプリ開発の本でも買い、勉強します。
この質問は、この前のトピックから続いていますがこれまで教わってきた考え方、テクニックは必ず自分の技量につながるので感謝しています。
>>ISLe様
ご教授いただいている立場でありながら最後には不快な記載をして申し訳ありませんでした。これまで長い間丁寧にご指摘いただきありがとうございます。
ここで教わったことは必ず私の技量になりますし、新たなアプリを作ろうと思った時に必ず役に立つと思います。 最後まで感謝いたします。
また、ここの掲示板は利用させていただくことがあると思いますので、今後ともよろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: androidアプリで困っています。ご教授ください(Ver.2)
横から失礼します。
ざっと見させてもらいましてが、クラスの継承などの意味が理解できていないのでは無いでしょうか?
質問の流れてみていると、それに付いては一切質問がされていません。 → ISLeさんが問題にしているのもそこです。
BMoveConfがどういう物なのか、どう使うべきなのか、まったく理解できていないのではありませんか?
ISLeさんが分からないなら、そこを聞いて欲しいと言っているんだと思います。
ざっと見させてもらいましてが、クラスの継承などの意味が理解できていないのでは無いでしょうか?
質問の流れてみていると、それに付いては一切質問がされていません。 → ISLeさんが問題にしているのもそこです。
BMoveConfがどういう物なのか、どう使うべきなのか、まったく理解できていないのではありませんか?
ISLeさんが分からないなら、そこを聞いて欲しいと言っているんだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: androidアプリで困っています。ご教授ください(Ver.2)
>>softyaさん
解決後ですが返信ありがとうございます。
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上がるということになる・・・
というのが私なりの考えなのですが・・・・
なにか「整理」できてない感が否めませんが・・・このような表現が今の私にできるやり方なので・・・・・
解決後ですが返信ありがとうございます。
というご指摘なのですが、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上がるということになる・・・
というのが私なりの考えなのですが・・・・
なにか「整理」できてない感が否めませんが・・・このような表現が今の私にできるやり方なので・・・・・
Re: androidアプリで困っています。ご教授ください(Ver.2)
この日本語の文章を読んでいないのでしょうか。それとも理解できなかったのでしょうか。ISLe さんが書きました:GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
コードは『想定して』書くものだということも以前書きましたね。
書いただけでは動かないし、Eclipseのデバッグや実行のコマンドを選択したら書いたコードがすべて実行されるわけでもありません。
BMoveConfやBMoverを作ってもそれをどこからも呼び出していないのに障害物が動くはずありません。
クラスがどうとか以前に、プログラムの実行の仕組みそのものを理解できていないと感じます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: androidアプリで困っています。ご教授ください(Ver.2)
もしかしたらインスタンスとかクラスを継承することで関連性がどうなるのかがまったく掴めていないんでしょうか?
親の性質は子に継承されますが親は親のままです。
なので、class BConfのインスタンスをどう動かしてもclass BMoveConfの持つ性質は一切発現しません。
class BMoveConfの機能はclass BMoveConfのインスタンスがもっています。
親の性質は子に継承されますが親は親のままです。
なので、class BConfのインスタンスをどう動かしてもclass BMoveConfの持つ性質は一切発現しません。
class BMoveConfの機能はclass BMoveConfのインスタンスがもっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: androidアプリで困っています。ご教授ください(Ver.2)
返信ありがとうございます
GameMgr
(変更箇所:41行目)
この場合は「null」ですがそれ以外の
の指摘にありますように「解決」とさせていただく段階でGameMgrは書き換え、実行もしてみました。ISLe さんが書きました:この日本語の文章を読んでいないのでしょうか。それとも理解できなかったのでしょうか。ISLe さんが書きました:GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
コードは『想定して』書くものだということも以前書きましたね。
書いただけでは動かないし、Eclipseのデバッグや実行のコマンドを選択したら書いたコードがすべて実行されるわけでもありません。
BMoveConfやBMoverを作ってもそれをどこからも呼び出していないのに障害物が動くはずありません。
クラスがどうとか以前に、プログラムの実行の仕組みそのものを理解できていないと感じます。
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);
}
}
Re: androidアプリで困っています。ご教授ください(Ver.2)
返信ありがとうございます
GameMgr
(変更箇所:33、43行目)
(もちろん、この後、BarricadeSquare , Barricade のコンストラクタの引数も「BMoveConf conf」にしました。 )
・・・・・・・・ですがこれでは(下にしか)動きません。
私はBMoverで
としっかりISLeさんの提案通り(記載していただいた)通り、往復の手順を書きました。
ですが、実際に動いたのは「下に」だけです・・・
私は60フレームかけて60px降下し、60フレームかけて60px上昇すると書きました(書いたつもしなのかもしれませんが)
ですので、私は「動きません」と書きました。
更に、ISleさんに対し、失礼なことを記載してしまった手前、最後まで上昇をどうすればいいか試行錯誤しましたができなかったので自分勝手に「解決」させてもらいました。
まだ、ご指摘いただけるのであれば、ご指摘お願いします。
との指摘の部分なのですが、「解決」とさせてもたった時に書き換え、実行もしてみました・・・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);
}
}
ですが、実際に動いたのは「下に」だけです・・・
私は60フレームかけて60px降下し、60フレームかけて60px上昇すると書きました(書いたつもしなのかもしれませんが)
ですので、私は「動きません」と書きました。
更に、ISleさんに対し、失礼なことを記載してしまった手前、最後まで上昇をどうすればいいか試行錯誤しましたができなかったので自分勝手に「解決」させてもらいました。
まだ、ご指摘いただけるのであれば、ご指摘お願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: androidアプリで困っています。ご教授ください(Ver.2)
class BMoverのdoUpdateメソッドの中でcount = 0;としている理由は何ですか?
前になかったはずですが、どういう効果を期待して付け加えましたか?
【補足】
それと解決直前までは、BMoveConfに付いては一切インスタンス化しようとしたことは無かったって事でしょうか。
>GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
1)これは理解できなかったって事ですかね? → 理解できないなら質問してほしい所です。
2)あるいは、意味が読み取れなかった?
3)あるいは、見逃した?
4)それともBMoveConfとBConfは同じものだと思っていた?
今後のために聞いておきたいのです。
【追記】
雑談トピックが次のページに行ってしまったので、お礼を書いて解決にしておいてください。
前になかったはずですが、どういう効果を期待して付け加えましたか?
【補足】
それと解決直前までは、BMoveConfに付いては一切インスタンス化しようとしたことは無かったって事でしょうか。
>GameMgrで、動かしたい障害物のコンストラクタの実引数のBConfをBMoveConfに替えてください。
1)これは理解できなかったって事ですかね? → 理解できないなら質問してほしい所です。
2)あるいは、意味が読み取れなかった?
3)あるいは、見逃した?
4)それともBMoveConfとBConfは同じものだと思っていた?
今後のために聞いておきたいのです。
【追記】
雑談トピックが次のページに行ってしまったので、お礼を書いて解決にしておいてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: androidアプリで困っています。ご教授ください(Ver.2)
どうしてそんなことをしたのでしょうか。mi_l さんが書きました:(もちろん、この後、BarricadeSquare , Barricade のコンストラクタの引数も「BMoveConf conf」にしました。 )
そんなことをしなくてもエラーは出ないですよね。
そのためにBMoveConfはBConfを継承しているのですし、doUpdateメソッドをオーバーライドしているのです。
既存のコードはそのまま、動かしたい障害物にだけBMoveConfを使う。
使っていないところは今までどおりに動き、BMoveConfを使った障害物だけが移動する。
ということも最初に説明しましたよね。
回転やアニメーションする派生クラスを作ることもできると説明しましたよね。
どうしてBMoveConf専用にしてしまうのですか?
GameMgrの既存の障害物をコメントアウトしている理由が分かりませんが。
わたしが記載したとおりではないようですが。mi_l さんが書きました:としっかりISLeさんの提案通り(記載していただいた)通り、往復の手順を書きました。
Re: androidアプリで困っています。ご教授ください(Ver.2)
返信が遅くなりましたが、無事に解決できました。
BMoverを実装した設定クラスを作り、ステージも作れました。
ご教授ありがとうございました。
BMoverを実装した設定クラスを作り、ステージも作れました。
ご教授ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: androidアプリで困っています。ご教授ください(Ver.2)
すいません。解決コードの投稿が基本ルールとなっておりますのでお願いします。mi_l さんが書きました:返信が遅くなりましたが、無事に解決できました。
BMoverを実装した設定クラスを作り、ステージも作れました。
ご教授ありがとうございました。
http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: androidアプリで困っています。ご教授ください(Ver.2)
基本ルールにのっとり、返信していなかったため、上記の私の返信の追加として、コードを載せます
BMover.java
自分で作った「BmoverA」「BMoverB」
GameMgr.java
(変更(追記)箇所:33,34、45,47行目)
二つの障害物に違う動きをさせることができました。
BMover.java
package net.dixq.irairabar;
public interface BMover {
//Barricadeの座標を更新する(ver1)(なしと考える
public abstract void doUpdate(Barricade barricade, int count);
}
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);
}
}
(変更(追記)箇所: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);
}
}