[PR] この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

Androidプログラミング日記 (仮)  

大発展バウンディングボックス

あなたは

人目のプログラマーだよ。

Androidプログラミング日記 (仮).

 

 

 

 

バウンディングボックス再び!

初心者脱出バウンディングボックスを以前作成しました。今回もバウンディングボックスを作成しました。しかしただ同じものは作りません。手に入れたコードを総動員して色々なものを詰め込みました。タッチでボックスが増えていくのは前のままなのですが、無限に増やせます。メモリ注意です!オプションメニューから(メニューボタンから)作成したBOXのクリアと背景色を白黒黄青グレーから選べます。このコードをちょいと変更するだけで色々遊べると思います。たぶん・・

さっそく

このプログラムに4ファイルほど使用しました、オプションメニュー用にString.xmlファイルを変更追加しました。String.xmlファイルの変更は「オプションメニュー」をご覧ください。

 

ファイル名「Box.java」

001package and.roid.box;
002 
003import android.app.Activity;
004import android.app.AlertDialog;
005import android.content.DialogInterface;
006import android.graphics.Color;
007import android.graphics.PixelFormat;
008import android.os.Bundle;
009import android.view.Display;
010import android.view.Menu;
011import android.view.MenuItem;
012import android.view.Window;
013import android.view.WindowManager;
014public class Box extends Activity {
015//登録するオプションメニューの種類3種
016private static final int
017MENU_ITEM0=0,
018MENU_ITEM1=1,
019MENU_ITEM2=2,
020MENU_ITEM3=3,
021MENU_ITEM4=4,
022MENU_ITEM5=5;
023public float disp_w,disp_h;//端末の画面の大きさを取得するための変数
024private int col = Color.WHITE;
025private boolean reset = false;
026@Override
027public void onCreate(Bundle savedInstanceState) {
028super.onCreate(savedInstanceState);
029requestWindowFeature(Window.FEATURE_NO_TITLE);
030getWindow().setFormat(PixelFormat.TRANSLUCENT);
031//端末の画面の大きさを取得するための処理
032Window window = getWindow();
033WindowManager manager = window.getWindowManager();
034Display disp = manager.getDefaultDisplay();
035disp_w = disp.getWidth();//端末の画面の横幅取得
036disp_h = disp.getHeight();//端末の画面の縦幅取得
037 
038setContentView(new BoxView(this));
039}
040//メニューボタンを押すと、セットされたメニューを表示
041public boolean onCreateOptionsMenu(Menu menu){
042super.onCreateOptionsMenu(menu);
043 
044//add(0,MENU_ITEM0,0,R.string.menu_item0)
045//引数はグループID、アイテムID、優先順位、アイテムタイトルです
046MenuItem item0 = menu.add(0,MENU_ITEM0,0,R.string.menu_item0);
047//アイコン設定
048item0.setIcon(R.drawable.ic_reset);
049 
050MenuItem item1 = menu.add(0,MENU_ITEM1,0,R.string.menu_item1);
051item1.setIcon(R.drawable.ic_white);
052 
053MenuItem item2 = menu.add(0,MENU_ITEM2,0,R.string.menu_item2);
054item2.setIcon(R.drawable.ic_brack);
055 
056MenuItem item3 = menu.add(0,MENU_ITEM3,0,R.string.menu_item3);
057item3.setIcon(R.drawable.ic_yellow);
058 
059MenuItem item4 = menu.add(0,MENU_ITEM4,0,R.string.menu_item4);
060item4.setIcon(R.drawable.ic_blue);
061 
062MenuItem item5 = menu.add(0,MENU_ITEM5,0,R.string.menu_item5);
063item5.setIcon(R.drawable.ic_gray);
064 
065return true;
066}
067//オプションメニューを選択した時の処理
068public boolean onOptionsItemSelected(MenuItem item){
069switch (item.getItemId()){
070case MENU_ITEM0:
071reset = true;
072showDialog(this,"","BOXをすべて消しました");
073return true;
074case MENU_ITEM1:
075col = Color.WHITE;
076showDialog(this,"","背景を白にしました");
077return true;
078case MENU_ITEM2:
079col = Color.BLACK;
080showDialog(this,"","背景を黒にしました");
081return true;
082case MENU_ITEM3:
083col = Color.YELLOW;
084showDialog(this,"","背景を黄色にしました");
085return true;
086case MENU_ITEM4:
087col = Color.BLUE;
088showDialog(this,"","背景を青にしました");
089return true;
090case MENU_ITEM5:
091col = Color.GRAY;
092showDialog(this,"","背景をグレーにしました");
093return true;
094}
095return true;
096}
097//ダイアログを表示させる処理
098private void showDialog(final Activity activity, String title, String text) {
099AlertDialog.Builder ad = new AlertDialog.Builder(activity);
100ad.setTitle(title);
101ad.setMessage(text);
102ad.setPositiveButton("OK", new DialogInterface.OnClickListener() {
103 
104public void onClick(DialogInterface dialog, int which) {
105activity.setResult(Activity.RESULT_OK);
106}
107});
108ad.create();
109ad.show();
110}
111public int getcolor(){return col;}
112public boolean getreset(){return reset;}
113public void setreset(){reset = false;}
114}
 
 

ファイル名「BoxView」

01package and.roid.box;
02 
03import android.R.color;
04import android.content.Context;
05import android.graphics.Canvas;
06import android.graphics.Color;
07import android.graphics.Paint;
08import android.view.MotionEvent;
09import android.view.SurfaceHolder;
10import android.view.SurfaceView;
11 
12public class BoxView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
13private SurfaceHolder holder;
14private Thread thread;
15 
16private float disp_w,disp_h;
17private Box box;
18 
19private BoxGamen gamen;
20private int back_col;
21private static final int
22gamen_x = 5,
23gamen_y = 5,
24gamen_col = Color.BLACK;
25private boolean start;
26 
27public BoxView(Context context) {
28super(context);
29holder = getHolder();
30holder.addCallback(this);
31holder.setFixedSize(getWidth(), getHeight());
32 
33start = false;
34init(context);
35}
36 
37public void init(Context context){
38box = (Box)context;
39disp_w = box.disp_w;
40disp_h = box.disp_h;
41gamen = new BoxGamen(gamen_x,gamen_y,(int)disp_w-5,(int)disp_h-35,gamen_col);
42}
43 
44public void run() {
45Canvas c;
46Paint p = new Paint();
47p.setAntiAlias(true);
48 
49while(thread != null){
50if(box.getreset() == true) {
51box.setreset();
52start = box.getreset();
53gamen.Reset();
54}
55c = holder.lockCanvas();
56c.drawColor(box.getcolor());
57 
58gamen.draw(c, p, start);
59p.setTextSize(30);
60p.setColor(color.black);
61c.drawText("reset:"+box.getreset(), 10, 50, p);
62 
63holder.unlockCanvasAndPost(c);
64 
65try {
66Thread.sleep(50);
67} catch (Exception e){}
68}
69}
70 
71public boolean onTouchEvent(MotionEvent event){
72int action = event.getAction();
73int x = (int)event.getX();
74int y = (int)event.getY();
75switch(action){
76case MotionEvent.ACTION_DOWN:
77break;
78case MotionEvent.ACTION_UP:
79if(x < disp_w-95 && y < disp_h-95){
80start = true;
81gamen.init(x, y);
82}
83break;
84}
85return true;
86}
87 
88public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}
89 
90public void surfaceCreated(SurfaceHolder arg0) {thread = new Thread(this);thread.start();}
91 
92public void surfaceDestroyed(SurfaceHolder arg0) {thread = null;}
93 
94}
 
 

ファイル名「BoxGamen.java」

01package and.roid.box;
02 
03import java.util.ArrayList;
04import java.util.Date;
05import java.util.Random;
06 
07import android.R.color;
08import android.graphics.Canvas;
09import android.graphics.Color;
10import android.graphics.Paint;
11import android.graphics.Rect;
12 
13public class BoxGamen {
14private int gamen_x,gamen_y,gamen_w,gamen_h,gamen_col;
15 
16private static final int
17box_wh = 100,
18box_d = 360;
19private ArrayList<boxob> box = new ArrayList<boxob>();
20 
21BoxGamen(int x,int y,int w,int h, int col){
22gamen_x = x;
23gamen_y = y;
24gamen_w = w;
25gamen_h = h;
26gamen_col = col;
27}
28public void init(int x,int y){
29Random r = new Random(new Date().getTime());
30int wh = r.nextInt(box_wh)+5;
31int d = r.nextInt(box_d);
32int col = Color.rgb(r.nextInt(240)+10, r.nextInt(240)+10, r.nextInt(240)+10);
33int vxy = r.nextInt(20)+5;
34box.add(new BoxOb(x,y,wh,d,vxy,col));
35}
36public void draw(Canvas c, Paint p, boolean start){
37p.setStyle(Paint.Style.STROKE);
38p.setColor(Color.BLACK);
39c.drawRect(new Rect(gamen_x, gamen_y, gamen_w, gamen_h), p);
40if(start == true) for(int i=0;i<box.size();i++) {
41box.get(i).draw(c, p);
42box.get(i).move(gamen_x, gamen_y, gamen_w, gamen_h);
43}
44}
45public void Reset(){
46box.clear();
47}
48}
49</boxob></boxob>
 
 

ファイル名「BoxOb.java」

01package and.roid.box;
02 
03import android.graphics.Canvas;
04import android.graphics.Paint;
05import android.graphics.Rect;
06 
07public class BoxOb {
08private static final double PIE = 3.1415926;
09private double obj_x,obj_y;//オブジェクト座標
10private int obj_wh;
11private int obj_d;//オブジェクトが進む角度
12private int obj_xspeed;//移動量
13private int obj_yspeed;//移動量
14private int obj_col;//オブジェクトの色
15private int obj_vxy;
16 
17BoxOb(double x,double y, int wh, int d, int vxy,int col){
18obj_x = x;
19obj_y = y;
20obj_wh = wh;
21obj_d = d;
22obj_vxy = vxy;
23obj_col = col;
24obj_d = (obj_d+360)%360;
25obj_xspeed = (int) (Math.cos(toRadian(obj_d))*obj_vxy);
26obj_yspeed = (int)-(Math.sin(toRadian(obj_d))*obj_vxy);
27}
28public void init(){}
29public void draw(Canvas c, Paint p){
30p.setStyle(Paint.Style.FILL);
31p.setColor(obj_col);
32c.drawRect(new Rect( (int)obj_x, (int)obj_y, (int)obj_x + obj_wh, (int)obj_y + obj_wh), p);
33}
34public void move(int x1,int y1,int x2,int y2){
35obj_x += obj_xspeed;
36obj_y += obj_yspeed;
37if(obj_x < x1 || obj_x > x2-obj_wh ) obj_xspeed *= -1;
38if(obj_y < y1 || obj_y > y2-obj_wh ) obj_yspeed *= -1;
39}
40public float toRadian(float deg){return (float) (deg * PIE / 180);}
41 
42}
 
 


 
 

 

 
     

 

このプログラムの説明

始まると白い背景でなにもありません。タップするとランダムな大きさ、色、角度、速さで移動します。作成できるBOXの数は、このプログラムでは指定させてなく、ArrayListでどんどん作成してしまうので、各々で作成できる数は決めてください。起動時はメモリと電池残量に注意です。メニューボタンを押すと作成したBOXクリアと背景を5色どれかに変更ができます。なにがおもしろいかとかはありません。綺麗なのは綺麗ですけどね・・

今回はオプションメニューの使用、これは書いてある場所コード自体などそのまま使ってもいいかもしれません。あとソースコード的なことは、配列は配列ですが、ArrayListを使用しています。配列は最初に使う数を指定しないといけませんが、これは追加していく形で使用できるのでものすごく便利です。あと今回BOXの移動方向は角度で行い、移動量も角度計算にておこなっています。これにより、ちょっとした改造で色々なお試し遊びができます。相手を作りそれに近づくコードにすると、直線的な動きではなくなり誘導弾のような動きになったり、へんな動きをしたりします。BoxOb.javaは表示するBOXをオブジェクトとして扱っているので、これに円や画像などの表示をくわえたりも簡単にできます。弾幕作成の練習とかもできますね。BOX同士に当たり判定をつけてみたり、バウンディングボックスは単純ながら色々なゲームに役に立つアルゴリズムを勉強できるのでわたしは大好きです。

以前のバウンディングボックスよりもだいぶ発展できました。これはAndroidプログラミングがちょっとだけ染み付いてきたということでいいかもしれません。しかしながら、どの言語プログラミングにも言えることなのですが、作成するプログラムの大半を占めるものはアルゴリズムです。シューティングゲームが作りたいなら弾幕の移動方法や当たり判定、背景の移動方法など言語ごとの勉強はいりませんよね。そのアルゴリズムを勉強できる簡単なプログラミングコードを作成して、やりたいアルゴリズムを試す、そんなコードがわたしは大好きです。バウンディングボックスはその一つですね。

何か簡単なプログラムを組んで、あとあとそれを改造していくと自分がどのくらいできるようになったかわかるのでおもしろいですね。

 

 

 

Androidプログラミング日記 (仮) | サイトマップ | 個人情報保護方針 | 応援メールテヘペロ | ©2012 Japan  相互リンク大募集中です