package com.yarin.android.Examples_05_04;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
public
class
GameView extends View implements Runnable
{
/*
聲明Paint對象
*/
private
Paint mPaint
=
null
;
double
maxS
=
0
;
double
maxH
=
0
;
double
maxT
=
0
;
double
dx;
double
dy;
double
d;
MovingObject obj;
boolean isDraw
=
false
;
public
GameView(Context context)
{
super(context);
/*
構建對象
*/
mPaint
=
new
Paint();
//
計算物體的最大高度、運動時間及最大射程
obj
=
new
MovingObject(
30
, Math.PI
/
4
, Color.RED);
//
運行時間
obj.T
=
2
*
obj.V0
*
Math.sin(obj.Sita)
/
9.8
;
//
最大高度
obj.H
=
obj.V0
*
obj.V0
*
Math.sin(obj.Sita)
*
Math.sin(obj.Sita)
/
(
2
*
9.8
);
//
最大射程
obj.Smax
=
2
*
obj.V0
*
obj.V0
*
Math.sin(obj.Sita)
*
Math.cos(obj.Sita)
/
9.8
;
if
(obj.Smax
>
maxS)
{
maxS
=
obj.Smax;
}
if
(obj.H
>
maxH)
{
maxH
=
obj.H;
}
if
(obj.T
>
maxT)
{
maxT
=
obj.T;
}
dx
=
(
800
-
20
)
/
maxS;
dy
=
(
480
-
20
)
/
maxH;
d
=
Math.min(dx, dy);
//
最大運行時間
Log.v(
"
TAG
"
, String.valueOf(maxT));
//
最大高度
Log.v(
"
TAG
"
, String.valueOf(maxH));
//
最大射程
Log.v(
"
TAG
"
, String.valueOf(maxS));
}
public
void
onDraw(Canvas canvas)
{
super.onDraw(canvas);
/*
設置畫布的顏色
*/
canvas.drawColor(Color.BLACK);
/*
設置取消鋸齒效果
*/
mPaint.setAntiAlias(
true
);
canvas.drawColor(Color.GREEN);
if
(isDraw)
{
canvas.drawCircle((
float
)obj.X, (
float
)obj.Y,
10
, mPaint);
}
}
//
觸筆事件
public
boolean onTouchEvent(MotionEvent
event
)
{
switch
(
event
.getAction())
{
case
MotionEvent.ACTION_DOWN:
new
Thread(
this
).start();
break
;
}
return
true
;
}
public
void
run()
{
for
(
double
t
=
0
; t
<
maxT; t
+=
0.01
)
{
Log.v(
"
TAG
"
, String.valueOf(t));
isDraw
=
true
;
//
水平坐標
double
x
=
obj.V0
*
Math.cos(obj.Sita)
*
t;
//
豎直坐標
double
y
=
obj.V0
*
Math.sin(obj.Sita)
*
t
-
9.8
*
t
*
t
/
2
;
if
(y
<
0
)
{
continue
;
}
//
坐標轉換
obj.X
=
10
+
d
*
x;
obj.Y
=
480
-
10
-
d
*
y;
try
{
Thread.sleep(
10
);
}
catch
(InterruptedException e)
{
Thread.currentThread().interrupt();
}
//
使用postInvalidate可以直接在線程中更新界面
postInvalidate();
}
}
}
class
MovingObject
{
//
重力加速度
public
final
double
G
=
9.8
;
//
/
//
/ 構造函數
//
/
//
/ V0物體的初速度
//
/ Sita物體初速度與水平方向的夾角
//
/ Color顏色
public
MovingObject(
double
V0,
double
Sita,
int
red)
{
this
.V0
=
V0;
this
.Sita
=
Sita;
this
.Color
=
red;
}
//
/
//
/ 物體的初速度
//
/
public
double
V0;
//
/
//
/ 物體初速度與水平方向的夾角
//
/
public
double
Sita;
//
/
//
/ 物體的橫坐標
//
/
public
double
X;
//
/
//
/ 物體的縱坐標
//
/
public
double
Y;
//
物體的顏色
public
int
Color;
//
要繪制的物體的矩形
public
Rect GetObjectRectangle()
{
return
new
Rect((
int
) X
-
3
, (
int
) Y
-
3
,
6
,
6
);
}
//
/
//
/ 最大射程
//
/
public
double
Smax;
//
/
//
/ 最大高度
//
/
public
double
H;
//
/
//
/ 運行時間
//
/
public
double
T;
}