Androidのサンプル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あんどろいどくん

Androidのサンプル

#1

投稿記事 by あんどろいどくん » 10年前

アプリを制作するためにサンプルプログラムを基に改良をしています。
しかし少々ソースコードが理解できなくて困っています。
現在はクリックするとボールが出現してボール同士が衝突するアプリになっています。今後はボール同士が衝突してボールの色が変わるというプログラムを作りたいのですがいくつか考えましたが色が変わりません。

こちらがサンプルのプログラムです。
これを基に上記で言いました衝突してボールの色を変えたいです。
//描画の方法&加速度センサーを使ってボールの色を変える

package jp.sakef;

import java.util.ArrayList;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainView extends SurfaceView implements SurfaceHolder.Callback, Runnable
{
private static double e = 0.8;
private static double d = 0.99;
private float gx;
private float gy;
private Paint paint;
private SurfaceHolder holder;
private Thread thread;
private ArrayList<Circle> container;
private int width;
private int height;

public MainView(Context context)
{
super(context);
holder = null;
thread = null;
container = new ArrayList<Circle>();
paint = new Paint();
paint.setAntiAlias(true);
gx = gy = 0;

// getHolder()メソッドでSurfaceHolderを取得。さらにコールバックを登録
getHolder().addCallback(this);
}

//SurfaceView生成時に呼び出される
public void surfaceCreated(SurfaceHolder holder)
{
this.holder = holder;
thread = new Thread(this);
}

//SurfaceView変更時に呼び出される
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
if(thread != null )
{
this.width = width;
this.height = height;
thread.start();
}
}

//SurfaceView破棄時に呼び出される
public void surfaceDestroyed(SurfaceHolder holder)
{
thread = null;
}

//スレッドによるSurfaceView更新処理
public void run()
{
while (thread != null)
{
//描画処理
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.argb(255, 0, 0, 0));
int size = container.size();

// 簡易衝突計算
for(int i=0 ; i<size ; i++)
{
for(int j=0 ; j<size ; j++)
{
if(j<=i) continue;

Circle a = container.get(i);
Circle b = container.get(j);
float ab_x = b.x - a.x;
float ab_y = b.y - a.y;
float tr = a.radius + b.radius;

if(ab_x*ab_x + ab_y*ab_y < tr*tr)
{

float len = (float)Math.sqrt(ab_x*ab_x + ab_y*ab_y);
float distance = (a.radius + b.radius) - len;
if(len>0) len = 1 / len;
ab_x *= len;
ab_y *= len;

distance /= 2.0;
a.x -= ab_x * distance;
a.y -= ab_y * distance;
b.x += ab_x * distance;
b.y += ab_y * distance;

canvas.drawColor(Color.argb(0, 255, 0, 255));

// 衝突後の速度を計算
float ma = (float) ((b.m / (a.m + b.m))*(1 + e)* ((b.dx - a.dx)*ab_x + (b.dy - a.dy)*ab_y));
float mb = (float) ((a.m / (a.m + b.m))*(1 + e)* ((a.dx - b.dx)*ab_x + (a.dy - b.dy)*ab_y));
a.dx += ma*ab_x;
a.dy += ma*ab_y;
b.dx += mb*ab_x;
b.dy += mb*ab_y;

}
}
}

// 計算をボールに反映
for(int i = 0 ; i < size ; i++)
{
Circle a = container.get(i);
a.dx *= d;
a.dy *= d;
a.dx += gx;
a.dy += gy;
a.x += a.dx;
a.y += a.dy;

if(a.x < a.radius)
{
a.x = a.radius;
a.dx *= -1;
}
if(a.y < a.radius)
{
a.y = a.radius;
a.dy *= -1;
}
if(a.x > width-a.radius)
{
a.x = width-a.radius;
a.dx *= -1;
}
if(a.y > height-a.radius)
{
a.y = height-a.radius;
a.dy *= -1;
}

paint.setColor(Color.argb(255, a.cr, a.cg, a.cb));
canvas.drawCircle(a.x, a.y, a.radius, paint);
}
holder.unlockCanvasAndPost(canvas);
}
}

// クリック時のイベント
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
float x = event.getX();
float y = event.getY();
float dx = (float)(Math.random()*10-5);
float dy = (float)(Math.random()*10-5);
float ran = (float)Math.random();
float r = ran*20+5;
float m = ran*10+10;
int cr = 255;
int cb = (int)(255 * Math.random());
int cg = (int)(255 * Math.random());
container.add(new Circle(r, x, y, dx, dy, m, cr, cg, cb));
}
return true;
}

// 加速度の更新
public void setAcce(float gx, float gy)
{
this.gx = gx;
this.gy = gy;
}
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Androidのサンプル

#2

投稿記事 by みけCAT » 10年前

とりあえず、コードを提示するときは、BBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: Androidのサンプル

#3

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

こちらのコードが元ですね?
「Android(Java)を始める – SurfaceViewで描写 + 加速度センサー « Sakef Blog」
http://sakef.jp/blog/2011/02/android01_drawing/
ブログの方に失礼ですので、コードを借用している場合は元のサイトを書くようにしてください。あと雑誌や書籍のコードは掲載NGの場合があります。

何処を直されたんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: Androidのサンプル

#4

投稿記事 by ISLe » 10年前

元よりCircleクラスのcr,cg,cbメンバをRGB各要素として決定する色でボールが描画されていますから、ボールの色を変えたいならcr,cg,cbメンバを書き変えてください。

#Canvasをロックしている期間が無駄に長いのが気になります。

あんどろいどくん

Re: Androidのサンプル

#5

投稿記事 by あんどろいどくん » 10年前

今後、ソースコードを載せるときは気をつけます。
ご指摘ありがとうございます。
簡易衝突のところで色を変更するのでしょうか?
例   [code=java][/code]int cr = 255;
int cb = (int)(255 * Math.random());
int cg = (int)(255 * Math.random());
container.add(new Circle(r, x, y, dx, dy, m, cr, cg, cb));

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

Re: Androidのサンプル

#6

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

あんどろいどくん さんが書きました:今後、ソースコードを載せるときは気をつけます。
ご指摘ありがとうございます。
簡易衝突のところで色を変更するのでしょうか?
例  

コード:

int cr = 255;
int cb = (int)(255 * Math.random());
int cg = (int)(255 * Math.random());
container.add(new Circle(r, x, y, dx, dy, m, cr, cg, cb));
掲示板などで質問されるときは試した上で問題点を質問されたほうが効率的です。
簡単に試すことが出来ると思うのですが。

【補足】
試行錯誤の過程で得られるものも多いのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: Androidのサンプル

#7

投稿記事 by ISLe » 10年前

あんどろいどくん さんが書きました:簡易衝突のところで色を変更するのでしょうか?
色を変更するところはそれで良いですが、例として提示されたコードは色を変更するコードになっていません。

「メンバを書きかえてください」をそのように解釈されたのでしょうか。
だとしたらソースコードを少々理解できないだけではないように思われますが。

あんどろいどくん

Re: Androidのサンプル

#8

投稿記事 by あんどろいどくん » 10年前

メンバを書き換えるということはr,g,bを数値に変えるのでしょうか。
プログラミング初心者なのですみません。

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

Re: Androidのサンプル

#9

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

>メンバを書き換えるということはr,g,bを数値に変えるのでしょうか。

メンバと言う言葉の意味は分かりますか?

ISLeさんの言われているのは、必要最低限のJavaの勉強をされていないのでは無いか?って事だと思います。
少なくともゲームを作るなら、Java言語を勉強して基礎的な練習問題ぐらいなら解けるぐらいは知識を深めて頂いたほうが変な所でつまずかないので良いと思います。
ゲームプログラミングの勉強とJava言語の勉強は別なので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#10

投稿記事 by あんどろいどくん » 10年前

オブジェクトの持つメンバ変数・関数ですよね。
Java言語は未経験に近いです。

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

Re: Androidのサンプル

#11

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

あんどろいどくん さんが書きました:オブジェクトの持つメンバ変数・関数ですよね。
Java言語は未経験に近いです。
他のプログラミング言語を理解しているのなら、代入の効果は違いは無いはずですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#12

投稿記事 by あんどろいどくん » 10年前

初期化でcr,cg,cbの変数を作って
container.add(new Circle(r, x, y, dx, dy, m, cr, cg, cb));を書くのでしょうか


簡易衝突計算の2つ目のif文で衝突した場合色を変えるということをすると思うのですがどの辺りの処理をしたときに色を変えるということをするのでしょうか。

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

Re: Androidのサンプル

#13

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

変数の代入と値の保持を理解されているなら、ボールの色を決める変数に条件に応じて値を代入する事で色を変えることができる事は理解できるはずです。
プログラムの流れの基本的な理解とか、classとか、ArrayListとかをまったく理解されていないことが今までの質問から分かるので、言語の勉強も必要だって話になるわけです。
どのぐらい勉強されてのでしょうか?あるいは勉強される気がありますか?

こちらは短絡的な答えを教えたいのではなく、考え方や言語文法レベルの理解をしてもらいたくて回答しております。ご理解ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#14

投稿記事 by あんどろいどくん » 10年前

C言語2年間・c++は1年半・Javaが数か月です。

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

Re: Androidのサンプル

#15

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

あんどろいどくん さんが書きました:C言語2年間・c++は1年半・Javaが数か月です。
それだけやっているなら、classとか、ArrayListとの事は理解できますよね。
class Circleがどんな役割を持っているかを書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#16

投稿記事 by あんどろいどくん » 10年前

Circleは描画をするクラスで
描画する座標や形、色を生成する役割。

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

Re: Androidのサンプル

#17

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

Circleは、描画するメソッドは持ってないですね。
C++でコンストラクタのみ有る構造体と同じ様な使い方をしています。
だとしたら、Circleのインスタンスが保つ役割はどの様なもので、元のソースコードではどのように使われていますでしょか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#18

投稿記事 by あんどろいどくん » 10年前

形・座標・色のデータを集めたデータ
ここで初期化が行われている

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

Re: Androidのサンプル

#19

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

あんどろいどくん さんが書きました:形・座標・色のデータを集めたデータ
ここで初期化が行われている
こちらにもお答え下さいね。
> だとしたら、Circleのインスタンスが保つ役割はどの様なもので、元のソースコードではどのように使われていますでしょか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#20

投稿記事 by あんどろいどくん » 10年前

上記に書いたのが答えなのですが。

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

Re: Androidのサンプル

#21

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

それだとMainViewでの使われ方に一切触れられておりませんので、わざとインスタンスと書かせていただきました。
あんどろいどくん さんの説明はclass Circleの説明だけだと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#22

投稿記事 by あんどろいどくん » 10年前

ボールに関する情報じゃないのでしょうか。

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

Re: Androidのサンプル

#23

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

あんどろいどくん さんが書きました:ボールに関する情報じゃないのでしょうか。
はい。そのCircleインスタンス具体的な使われ方を説明してもらえますか。
何行目で、こういう風にしているって所です。
必要ないなら私も細かく聞かない事なので大事なことなのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#24

投稿記事 by あんどろいどくん » 10年前

MainViewの166行目~1699行目
int cr = 255;
int cb = (int)(255 * Math.random());
int cg = (int)(255 * Math.random());
container.add(new Circle(r, x, y, dx, dy, m, cr, cg, cb));
描画の為の要素として使われている。

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

Re: Androidのサンプル

#25

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

あんどろいどくん さんが書きました:MainViewの166行目~1699行目
int cr = 255;
int cb = (int)(255 * Math.random());
int cg = (int)(255 * Math.random());
container.add(new Circle(r, x, y, dx, dy, m, cr, cg, cb));
描画の為の要素として使われている。
それでは大雑把すぎるので他もお願いします。
onTouchEventの話だけですよね。

その他の部分はわからないでしょうか?
ジェネリクスを使ってアチコチで使われてます。ジェネリクスはC++で言うところのテンプレートクラスの使い方と同じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#26

投稿記事 by あんどろいどくん » 10年前

80・81行目
Circle a = container.get(i);
Circle b = container.get(j);
container.get(j);
判定処理を受け取っている。

148行目
canvas.drawCircle(a.x, a.y, a.radius, paint);
ボールの描画が行われている。

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

Re: Androidのサンプル

#27

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

> 判定処理を受け取っている。
判定処理の結果を受け取るとは、どのような事をして何が受け取っているんでしょうか?
変化するのは何でしょうか? 具体的にお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#28

投稿記事 by あんどろいどくん » 10年前

a・bに衝突の処理を代入している
ボールのサイズがiとjの処理をしてget(i)と(j)に渡したものを代入している。

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

Re: Androidのサンプル

#29

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

> a・bに衝突の処理を代入している

処理は代入されていませんよね。
a・bに代入されているのは単なる参照です(ここがC++と書き方が違う所)。

> ボールのサイズがiとjの処理をしてget(i)と(j)に渡したものを代入している。

具体的に変化するメンバ変数をお書き下さい。そこが大事です。
そうすることでどういう永続的な変化が起きますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: Androidのサンプル

#30

投稿記事 by ISLe » 10年前

あんどろいどくん さんが書きました:148行目
canvas.drawCircle(a.x, a.y, a.radius, paint);
ボールの描画が行われている。
わたしの投稿から「ボールの色を変えたいならcr,cg,cbメンバを書き変えてください」という点だけを捉えたのでしょうか。
むしろ大事なのは「元よりCircleクラスのcr,cg,cbメンバをRGB各要素として決定する色でボールが描画されていますから」の部分なのですが。

147行目を見てもどこを書きかえたら良いのか分かりませんかね。

あんどろいどくん

Re: Androidのサンプル

#31

投稿記事 by あんどろいどくん » 10年前

ちょっと分からなくなってきました。
どうやって説明すればいいのか言葉が出てこないです。

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

Re: Androidのサンプル

#32

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

あんどろいどくん さんが書きました:ちょっと分からなくなってきました。
どうやって説明すればいいのか言葉が出てこないです。
まず、関連する部分を上げてみてください。
すくなくとも、どの行が関連しているかぐらいは提示できませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#33

投稿記事 by あんどろいどくん » 10年前

MainViewの
25行~33行目
74行~84行目
113行~148行目
151行目~168行目

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

Re: Androidのサンプル

#34

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

あんどろいどくん さんが書きました:MainViewの
25行~33行目
74行~84行目
113行~148行目
151行目~168行目
元のソースコードの行番号ですよね? 足らないのと、なにか違うところまで提示されている気が。
class Circleに関連する所だけでお願いできますか。 それと、元のブログのソースコードに掲載されている行番号を使って下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#35

投稿記事 by あんどろいどくん » 10年前

MainViewの
64行~109行目
112行~147行目
150行~167行目

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: Androidのサンプル

#36

投稿記事 by dic » 10年前

softyaさん 落ち着いてください。
世の中にはいろんな人がいます。

中学生でも書き込める時代ですから
(中学生とは言ってはいないけど、日本語があまりにもあれです)

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

Re: Androidのサンプル

#37

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

dic さんが書きました:softyaさん 落ち着いてください。
世の中にはいろんな人がいます。

中学生でも書き込める時代ですから
(中学生とは言ってはいないけど、日本語があまりにもあれです)
dicさん。心配していただいて有難うございます。
私は怒っているわけではなく、冷静に分かって貰おうとしているだけです。
と言うことで  あんどろいどくん さんも今しばらくお付き合いくださると嬉しいです。
あんどろいどくん さんが書きました:MainViewの
64行~109行目
112行~147行目
150行~167行目
では、これらの行の中で
(1)ボールの色に関する処理をしている部分
(2)ボールを発生させている部分。
(3)衝突した後でボールの軌道を変えている部分。
をそれぞれ出来るだけ狭い範囲の行で書き出してみてください。

【追記】
(2)はついでなので、省略可です。


他の人と相談した所、全体を理解してもらうのは次の機会として今回は色の変更だけに絞り込んだほうが良いとなりました。
と言うことで、全体の理解をしたい場合は別のトピックで質問をなさってください。
さて、class Circleの使われて所を絞り込んでもらったのですが、class Circleがボールに関する全情報を保持するためのクラスです。
当然、その中にはボールの色も含まれます。
説明の都合で、行番号を入れ替えています。
(1)150行~167行目。class Circleのインスタンスを生成しています。当然色に関しては処理が有りますがインスタンスの生成に関連した処理です。
(2)112行~147行目。移動と描画を担当しています。この中でclass Circleのインスタンスから色を取り出して描画に使っています。
(3)64行~109行目に関しては、色の扱いはありません。ボールの衝突に関する処理ですから。この中に衝突した瞬間が分かる部分がありますので、衝突時の処理としてclass Circleのインスタンスの保持する色を変更をすれば良いことになります。

では、
(1)の色は最終的のどの変数あるいはクラスのインスタンスが保持していることに成るでしょうか?
(2)で色を処理している行を書いてみてください。
(3)色の変更をどの部分に加えると良いと思いますか? 行番号でこの行の上と具体的に書いてみてください。
それとどのような処理をすると良いと思われますか? → ヒント:インスタンスに変更を加えます。

わからない部分は分かりませんでかまいません。特に(1)は分からなくても何となくの理解でも今回は何とかなります。
ただ、これ以外の改造を加えていく上では最終的には理解しなとダメな部分でも有ります。
その場合は質問タイトルとズレてくることに成るので、別トピックで質問をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: Androidのサンプル

#38

投稿記事 by ISLe » 10年前

質問者さんはnew Circle(~)でセットされた色が自動的に描画に使われていると考えているように見えます。
ほんとうはコードから自力で読み取って欲しいのですが、ライブラリが絡むのでほとんど答えのようなヒントです。

paint.setColor(Color.argb(255, a.cr, a.cg, a.cb)); // 描画色をセット
canvas.drawCircle(a.x, a.y, a.radius, paint); // セットした描画色を使う
円(ボール)の描画は毎度ひとつずつ描画色をセットしながら行われています。

あんどろいどくん

Re: Androidのサンプル

#39

投稿記事 by あんどろいどくん » 10年前

(1)の色は
最後にreturn trueで終わっていますので
(32行目)paint.setAntiAlias(true);に返されると思います。

(2)で色を処理している行
142と143行目で色の生成と描画が行われていると思います。

(3)色の変更をどの部分に加えると良いか
この行の上と具体的に書くというのは色の変更が行われる行の上
でしょうか。

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

Re: Androidのサンプル

#40

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

あんどろいどくん さんが書きました:(1)の色は
最後にreturn trueで終わっていますので
(32行目)paint.setAntiAlias(true);に返されると思います。
これに関してはJavaやC++のクラスや更にはC言語での関数の理解度が足らないと思われますので、今回は詳しく説明しません。
それとAndroidのイベント駆動の動作自体も未理解だと思ってもらったほうが良いです。
別途勉強をして頂きたいと思いますが、分からないことがあれば別トピックということでお願いします。
これに付いてはここで終わりにしますが、大事なのはcontainerとだけ書いておきます。
あんどろいどくん さんが書きました: (2)で色を処理している行
142と143行目で色の生成と描画が行われていると思います。
そうですね。それは何のどの変数を使って色を生成していますか?
あんどろいどくん さんが書きました: (3)色の変更をどの部分に加えると良いか
この行の上と具体的に書くというのは色の変更が行われる行の上
でしょうか。
色の変更を行ったほうが良いと思われる行の範囲で構いません。
あるいは、この行の上に差し込むという書き方でもOKです。
どちらでもお好きな方で。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#41

投稿記事 by あんどろいどくん » 10年前

(1)
関数にとっつきにくいこともありまして関数が未だに分かりません。

(2)
a.cr,a.cg,a.cbで色が生成されている
a.x, a.y, a.radiusで描画が行われている

(3)
101行目の上に差し込まれると思います
86行~98行目が衝突判定だと思いますので、その後色が変わるという
処理を加えればと考えました。

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

Re: Androidのサンプル

#42

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

(1)関数は基本なので、それが理解できないとプログラムが組めないと思ってもらって良いと思います。
関数のないプログラムは初歩の初歩ぐらいにしかありません。

(2)
>a.cr,a.cg,a.cbで色が生成されている
aは何処から生まれたかを理解すればもっと良いですね。
(3)のためにも考えてみてください。

(3)
>86行~98行目が衝突判定だと思いますので、その後色が変わるという
実はif文の理解も足りないと思います。
ただ、101行目でも構わないのでここに追加するとしましょう。
さて、どのようなソースコードを追加しますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#43

投稿記事 by あんどろいどくん » 10年前

(2)
Circleからa.を書くことが出来てると思います
それかcontainerが生成の原点なのかと思ってたりします

(3)
Circle a = container.get(i);
if(AとBが衝突したら)
{
 色を変える
  a.cr;
}

if(AとCが衝突したら)
{
 色を変える
  a.cg;
}

if(AとDが衝突したら)
{
 色を変える
  a.cb;
}

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

Re: Androidのサンプル

#44

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

(2)  生まれてきたという書き方が語弊がありましたね。失礼しました。
何処から持ってきたのかですね。 containerの方が正解です。

(3) 衝突相手で色を変えるのは、あんどろいどくん さんには高度なので色を変えるだけに絞った方が良いと思います。
つまりif文は増やさないでください。
あと a.cb; やa.cr; だけでは色は変わりません。色を代入してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#45

投稿記事 by あんどろいどくん » 10年前

(3)
Circle a = container.get(i);
 
元の色からほかの色に変える
  a.r = 元の色;

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

Re: Androidのサンプル

#46

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

> Circle a = container.get(i);

既に有るので必要ありません。

>元の色からほかの色に変える
>  a.r = 元の色;

rはメンバ変数として存在しません。
あと代入文を理解されていますか?
a.cr=元の色;
だとしてどんな効果を期待していますか。
それと「元の色」って部分も具体的な命令文でお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#47

投稿記事 by あんどろいどくん » 10年前

(3)
代入が逆でした
元の色?( canvas.drawCircle)=a.r

命令文で
if( canvas.drawCircle == a.r)
{
canvas.drawCircleの色を青にする?
}

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

Re: Androidのサンプル

#48

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

> 元の色?( canvas.drawCircle)=a.r
すいません。意味不明です。
canvas.drawCircleはメンバ関数なので代入で書きません。
あとa.rはrと言うメンバ変数が先程も書いた通りありません。

それとif文は増やす必要がないと書いたのですが何故増やすのですか?理由を教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#49

投稿記事 by あんどろいどくん » 10年前

if文が複数あるのはダメだと捉えてしまって。
if文が命令文であったからです。

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

Re: Androidのサンプル

#50

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

とりあえず最大のヒントです。
cr,cb,cgに値を代入すれば色は変わります。
if文は必要ないです。
※ crはcolor redの略です。以下cb,cgも同様。

それ以上の事をプログラムに加えたいなら、今一度基礎の基礎から勉強しなければならない状態だと思ってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#51

投稿記事 by あんどろいどくん » 10年前

101行目の上に
例:int cr = 0;
  int cg = 0;
int cb = 255
と記述してもボールが衝突したときに青色に変わらないですよね

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

Re: Androidのサンプル

#52

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

描画で使っているのはcontainer.get(i);で得たa.crなどですから、色を変更するのもcontainer.get(i);から得たa.crなどでなければいけません。
と言う理解で今はやってください。本当の話は難しすぎるので省略します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#53

投稿記事 by あんどろいどくん » 10年前

a.cr=0;
a.cg=255;
a.cb=0;
を記述して色を変えることはできました。

もしも同色のボールと衝突したら消滅するという
処理を行うとしたら。

次のような記述をするのでしょうか

if(もしも同色と同じなら)
{
消滅する(destroye)
}

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

Re: Androidのサンプル

#54

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

あんどろいどくん さんが書きました:a.cr=0;
a.cg=255;
a.cb=0;
を記述して色を変えることはできました。

もしも同色のボールと衝突したら消滅するという
処理を行うとしたら。

次のような記述をするのでしょうか

if(もしも同色と同じなら)
{
消滅する(destroye)
}
関数やクラスを理解できていない現状のあんどろいどくん さんには難しいと思います。
まず、ちゃんと言語の勉強をされるべきです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#55

投稿記事 by あんどろいどくん » 10年前

どのように独学で学ぶのが効率いいでしょうか

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

Re: Androidのサンプル

#56

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

あんどろいどくん さんが書きました:どのように独学で学ぶのが効率いいでしょうか
効率のよい方法なんてのは多分ないと思います。
ちゃんと1命令、1命令をコンパイル実行してデバッガやprintfなどで動作を確認しなら機能をイメージできるように理解するしかありません。
それを何ヶ月も続けて、やっと分かってくるというのがプログラミングです。

なお、既に本題から外れていますので、これを続けるなら別トピックでお願いします。
こちらは、解決チェックして投稿してください。

【補足】
効率のよい方法があるなら、学校などであんなに長い期間を掛けて言語の授業なんてしないと思いませんか。
あと、あの分厚く密度の濃い言語の入門書なんて必要ないですよね。
とにかく地道な積み重ねがじわじわと効いてくるのがプログラミングですので途中をすっ飛ばすと現状の あんどろいどくん さんの様に分けがわからなくなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あんどろいどくん

Re: Androidのサンプル

#57

投稿記事 by あんどろいどくん » 10年前

どうもありがとうございます
新たにトピックを作り直そうと思います

閉鎖

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