そこで、まずは難しそうなことは避けて、四角い(正方形)当たったらアウトな範囲を作りその上におなじ大きさに切り取った適当な画像をのせれば、画像に当たった=アウトの範囲に当たったになり、正常に動作すると思いました。
そこで自分なりにコードを書いてみましたのでご指摘お願いします
まずはイライラ棒の今回の質問で最低限必要だと思ったものを載せます。
Barricade.java
package net.dixq.irairabar;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
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; //回転スピード
//コンストラクタ, type=タイプ, n=頂点の数 , conf=設定情報
//コンストラクタで、何角形であるかという数値が渡される
public Barricade(int n, BConf conf)
{
if( conf != null )
{
_rotaSpeed = conf.speed; //回転スピード
_type = conf.type; //物体のタイプ
}
switch(_type)
{
case OUT: //接触してダメ(アウト)なもの
_paint.setColor(Color.GREEN);//緑に
break;
case GOAL: //�接触してゴールなもの
_paint.setColor(Color.YELLOW);//黄色に
break;
}
_pt = new PointF[n]; //頂点配列を作る
for( int i=0; i<n; i++ )
{
_pt[i] = new PointF(); //頂点を作る
}
_paint.setAntiAlias(true);
}
//更新する
public boolean onUpdate()
{
//
if( _rotaSpeed != 0 )
{
//頂点リスト(_pt)を_centerを中心に回転する
DiagramCalcr.RotateDiagram( _pt, _center, _rotaSpeed );
}
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;//NOを返す
}
//描画する
public void onDraw(Canvas c)
{
//頂点が1未満の図形なんてないので
if( _pt.length < 1 )
{
return;//返す
}
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); //引いたラインを描画する
}
}
package net.dixq.irairabar;
import java.util.ArrayList;
import java.util.LinkedList;
import net.dixq.irairabar.Barricade.eType;
import android.annotation.SuppressLint;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
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()
{
//↓動かない棒
//画面4隅に四角形を配置
_barrList.add(new BarricadeSquare( 0, 0,540, 20, null));
_barrList.add(new BarricadeSquare( 0, 0, 20,960, null));//コンフィグを特に設定しない時はnullを渡すとデフォルト設定になる
_barrList.add(new BarricadeSquare(520, 0, 20,960, null));
_barrList.add(new BarricadeSquare( 0,940,540, 20, null));
//途中の縦壁
_barrList.add(new BarricadeSquare(170, 300, 10, 640, null));//壁1
_barrList.add(new BarricadeSquare(360, 0, 10, 870, null));//壁2
//横壁(1つ目の通路)
_barrList.add(new BarricadeSquare(0, 820, 100, 20, null));//壁1
_barrList.add(new BarricadeSquare(80, 700, 90, 20, null));//壁2
_barrList.add(new BarricadeSquare(0, 370, 50, 200, null));//壁3
_barrList.add(new BarricadeSquare(100, 350, 70, 250, null));//壁4
//2つ目の通路
// _barrList.add(new BarricadeSquare(180, 850, 120, 90, null));//壁5
//3つ目の通路
//横壁
_barrList.add(new BarricadeSquare(370, 520, 105, 5, null));//壁6
_barrList.add(new BarricadeSquare(410, 290, 110, 5, null));//壁7
_barrList.add(new BarricadeSquare(370, 250, 90, 5, null));//壁7
_barrList.add(new BarricadeSquare(490, 250, 30, 5, null));//壁7
_barrList.add(new BarricadeSquare(370, 210, 30, 5, null));//壁7
_barrList.add(new BarricadeSquare(430, 210, 120, 5, null));//壁7
_barrList.add(new BarricadeSquare(370, 170, 60, 5, null));//壁7
_barrList.add(new BarricadeSquare(460, 170, 80, 5, null));//壁7
//縦壁
_barrList.add(new BarricadeSquare(470, 350, 5, 170, null));//壁6
_barrList.add(new BarricadeSquare(430, 290, 5, 200, null));//壁6
//回転バー
_barrList.add(new BarricadeSquare( 285, 10, 150, 15, new BConf(-PI / 180)));// 回転バー1
_barrList.add(new BarricadeSquare( 430, 770, 250, 15, new BConf(PI / 150)));// 回転バー2
_barrList.add(new BarricadeSquare( 370, 650, 240, 15, new BConf(-PI / 130)));// 回転バー3
//回転三角形
_barrList.add(new BarricadeTriangle( 170, 150, 150, new BConf(+PI / 270)));// 三角形
//回転星
_barrList.add(new BarricadeStar(270, 480, 30, 100, new BConf(+PI / 270)));//星1
_barrList.add(new BarricadeStar(270, 660, 10, 100, new BConf(-PI / 360)));//星2
_barrList.add(new BarricadeStar(240, 850, 40, 70, new BConf(+PI / 30)));//星3
_barrList.add(new BarricadeStar(240, 850, 20, 70, new BConf(-PI / 30)));//星4
_barrList.add(new BarricadeStar(470, 100, 20, 30, new BConf(+PI / 17)));//星3
/*
//_barrList.add(new BarricadeTriangle( 100, 100, 100, new BConf(+PI / 150)));// 三角形
_barrList.add(new BarricadeTriangle( 300, 600, 180, new BConf(+PI / 150)));// 三角形2
_barrList.add(new BarricadeStar(200, 190, 50, 150, new BConf(+PI / 360)));//星1
_barrList.add(new BarricadeStar(200, 190, 15, 100, new BConf(+PI / 180)));//星2(細くて遅い)
// _barrList.add(new BarricadeSquare(0, 480, 240, 20, new BConf(+PI / 360)));//
_barrList.add(new BarricadeSquare( 100, 500, 170, 20, new BConf(-PI / 360)));// 回転バー
_barrList.add(new BarricadeSquare( 400, 100, 20, 100, new BConf(+PI / 360)));// 回転バー2
//_barrList.add(new BarricadeSquare(185, 600, 55, 20, new BConf(+PI / 360)));//
_barrList.add(new BarricadeSquare(450, 650, 30, 20, null));//壁3
*/
_barrList.add(new BarricadeSquare(480, 20, 40, 40, new BConf(eType.GOAL)));//ごーる!!
for (Barricade bar : _barrList)
{
//タスクリストに障害物を追加
_taskList.add(bar);
}
_player = new Player();
_taskList.add(_player);//プレイヤー
_taskList.add(new FpsController());//fpsのやつ
}
//総突判定
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("ざんね~ん!!", 70, 300, paint);
}
break;
case GAMECLEAR:
{
Paint paint = new Paint();
paint.setTextSize(80);
paint.setColor(Color.BLACK);
c.drawText("おめでとう!!", 70, 300, 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 BarricadeSquare extends Barricade
{
public BarricadeSquare( float x, float y, float w, float h, BConf conf )
{
super(4,conf);
//4つの頂点座標(x , y)
_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;
//中心座標(x , y)
_center.x = x+w/2;
_center.y = y+h/2;
}
}
package net.dixq.irairabar;
//画像
public class BarricadeImage extends Barricade
{
public BarricadeImage(float x, float y, float w,float h,BConf conf )
{
super(4 , conf);
//4つの頂点座標(x , y)
_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;
//中心座標(x , y)
_center.x = x+w/2;
_center.y = y+h/2;
}
}
引数の最後のconfは四角形でもそうですが回転するか否かのものです。
私は最終的にはGameMgr.javaに四角形みたいな形
(_barrList.add(new BarricadeSquare(370, 520, 105, 5, null));//壁6)
で書き込むような環境にしたいと思っています。
そして最後にBarricade.javaの93行目のしたにBitmapの描画命令を書けばいいと思っています。
しかし、私の作ったファイルですと画像の座標、(幅、高さ←要るのかいらないのかわからない)は大丈夫ですが、画像の読み込み(登録)と当然1枚ではないのでが配列を用意しなければなりません・・・ここまではわかっているつもりなのですが、これらのことを何処にどのように書けばいいのかわかりません・・・
(ここでは画像の回転、範囲の回転は考えません)
私の考え方、この質問を見て気づいたことなどご教授ください。
また、どのように考えればよいか、教えてください。
よろしくお願いします。