안드로이드 개발 질문/답변
(글 수 45,052)
package com.Game;
import java.util.*;
import android.app.*;
import android.content.*;
import android.graphics.*;
import android.hardware.*;
import android.view.*;
import com.freamwork.*;
public class GameState extends View implements IState, SensorEventListener{
private Player mPlayer;
private BackGround mBackground;
Context mContext;
ArrayList<EnemyBrid> mBridlist = new ArrayList<EnemyBrid>();
ArrayList<EnemyColud> mColudlist = new ArrayList<EnemyColud>();
ArrayList<Effect_Explosion> mExplist = new ArrayList<Effect_Explosion>();
long LastRegenbrid = System.currentTimeMillis();
long LastRegencolud = System.currentTimeMillis();
boolean coludstart = false;
boolean DrawPlayer = true;
Random randEnem = new Random(); // 장애물 랜덤하게 생성
SensorManager m_sensorManager;
int Width, Height;
// 효과음
public static final int SOUND_EFFECT_1 = 1; // 풍선 터지는 소리
public static final int SOUND_EFFECT_2 = 2; // 새_1나오는 소리
public static final int SOUND_EFFECT_3 = 3; // 새_2나오는 소리
public GameState(Context context) {
super(context);
// 디바이스에서 센서 매니져 가져오기
m_sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
// 센서매니져 등록
m_sensorManager.registerListener(this, m_sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
// 사운드 매니저를 사용하기 위한 초기화
SoundManager.getInstance().Init(getContext());
// 화면 해상도 구하기
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
// 화면 폭, 높이
Width = display.getWidth();
Height = display.getHeight();
this.mContext = context;
}
public void Destory() {
// TODO Auto-generated method stub
}
public void Init() {
mPlayer = new Player(AppManager.getInstance().getBitmap(R.drawable.player));
mBackground = new BackGround(0);
SoundManager.getInstance().addSound(SOUND_EFFECT_1, R.raw.die);
SoundManager.getInstance().addSound(SOUND_EFFECT_2, R.raw.brid1);
SoundManager.getInstance().addSound(SOUND_EFFECT_3, R.raw.brid2);
//OpenDig();
}
public void Render(Canvas canvas) {
mBackground.Draw(canvas); // 배경화면 그리기
if(DrawPlayer)
mPlayer.Draw(canvas); // 플레이어 그리기
else if(DrawPlayer == false) {
// 플레이어 이미지 그리기 X
}
// 새 그리기
for(EnemyBrid enembrid : mBridlist) {
enembrid.Draw(canvas);
}
// 구름 비행기 그리기
for(EnemyColud enemcolud : mColudlist) {
enemcolud.Draw(canvas);
}
// 폭발 이미지
for(Effect_Explosion exp : mExplist) {
exp.Draw(canvas);
}
}
public void MakeEnemy() {
// 새
if(System.currentTimeMillis() - LastRegenbrid >= 1000) {
LastRegenbrid = System.currentTimeMillis();
int enemtype = randEnem.nextInt(2);
EnemyBrid enembrid = null;
if(enemtype == 0) {
// 1번타입 장애물
enembrid = new EnemyBrid_1();
SoundManager.getInstance().play(SOUND_EFFECT_2);
}
else if(enemtype == 1) {
// 2번타입 장애물
enembrid = new EnemyBrid_2();
SoundManager.getInstance().play(SOUND_EFFECT_3);
}
enembrid.SetPosition(randEnem.nextInt(416), -60);
enembrid.movetype = randEnem.nextInt(3);
mBridlist.add(enembrid);
}
// 구름, 비행기
if(System.currentTimeMillis() - LastRegencolud >= 45000)
coludstart = true;
if(coludstart == true) {
if(System.currentTimeMillis() - LastRegencolud >= 1000) {
LastRegencolud = System.currentTimeMillis();
int enemtype = randEnem.nextInt(2);
EnemyColud enemcolud = null;
if(enemtype == 0)
enemcolud = new EnemyColud_1();
else if(enemtype == 1)
enemcolud = new EnemyColud_2();
enemcolud.SetPosition(500, randEnem.nextInt(740));
enemcolud.movetype = EnemyColud.MOVE_PATTERN_1;
mColudlist.add(enemcolud);
}
}
}
public void Update() {
final long GameTime = System.currentTimeMillis();
if(DrawPlayer) {
mPlayer.Update(GameTime);
}
else if(DrawPlayer == false) {
mPlayer.m_BoundBox.set(0, 0, 0, 0); // 충돌시 플레이어 Update(X), m_BoundBox 제거
}
mBackground.Update(GameTime);
for(int i=mBridlist.size()-1; i>=0; i--) {
EnemyBrid enembrid = mBridlist.get(i);
enembrid.Update(GameTime);
if(enembrid.state == EnemyBrid.STATE_OUT)
mBridlist.remove(i);
}
for(int i=mColudlist.size()-1; i>=0; i--) {
EnemyColud enemcolud = mColudlist.get(i);
enemcolud.Update(GameTime);
if(enemcolud.state == EnemyColud.STATE_OUT) {
mColudlist.remove(i);
}
}
for(int i=mExplist.size()-1; i>=0; i--) {
Effect_Explosion exp = mExplist.get(i);
exp.Update(GameTime);
if(exp.getAnimationEnd())
mExplist.remove(i);
}
MakeEnemy();
CheckCollision();
}
public void CheckCollision() {
// 새충돌
for (int i=mBridlist.size()-1; i>=0; i--) {
if(CollisionManager.CheckBoxToBox(mPlayer.m_BoundBox, mBridlist.get(i).m_BoundBox)){
// 충돌시 폭파 이미지 플레이어 x, y 좌표에 그리기
mExplist.add(new Effect_Explosion(mPlayer.GetX(), mPlayer.GetY()));
SoundManager.getInstance().play(SOUND_EFFECT_1);
DrawPlayer = false;
if(System.currentTimeMillis() - LastRegencolud >= 3000)
OpenDig();
}
}
// 구름비행기충돌
for(int i=mColudlist.size()-1; i>=0; i--) {
if(CollisionManager.CheckBoxToBox(mPlayer.m_BoundBox, mColudlist.get(i).m_BoundBox)) {
mExplist.add(new Effect_Explosion(mPlayer.GetX(), mPlayer.GetY()));
SoundManager.getInstance().play(SOUND_EFFECT_1);
DrawPlayer = false;
}
}
}
public void onSensorChanged(SensorEvent event) {
float SenSpeed = 2.f;
synchronized(this) {
switch(event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
float Hedaing = event.values[0]; // X축
float Pitch = event.values[1]-5.5f; // Y축
//float Roll = event.values[2]; // Z축
// 속도 조절
mPlayer.x -= (Hedaing*SenSpeed);
if(Pitch > 0)
mPlayer.y += (Pitch*SenSpeed*2.0f);
else if(Pitch < 0)
mPlayer.y += (Pitch*SenSpeed);
// Player 이미지 움직이기
mPlayer.SetPosition(mPlayer.x, mPlayer.y);
// Player 이미지 화면 이탈 방지
if(mPlayer.x <= 0) {
mPlayer.SetPosition(mPlayer.x=0, mPlayer.y);
}
if(mPlayer.y <= 0) {
mPlayer.SetPosition(mPlayer.x, mPlayer.y=0);
}
if(mPlayer.x >= getWidth()+Width-61) {
mPlayer.SetPosition(mPlayer.x=Width-61, mPlayer.y);
}
if(mPlayer.y >= getHeight()+Height-104) {
mPlayer.SetPosition(mPlayer.x, mPlayer.y=Height-104);
}
break;
}
}
invalidate();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void OpenDig() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage("Are you sure you want to exit?")
.setTitle(" Result!")
.setCancelable(false)
.setPositiveButton("재시작", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
.setNegativeButton("종료", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
System.exit(0);
}
}).create();
builder.show();
}
}
캐릭터가 죽으면 3초뒤에 다이얼로그를 띄울려고 하는데.. 0~1.5초 까니는 예상치 않게 중지되었다구 뜨고
2초 부터는 에러는 안뜨는데.. 다이얼로그로 안뜨네요.. 아예 실행이 안되는거 같습니다... ㅠ.ㅜ 어떻게 해야되나요???
고수분들.. 조언좀 해주세요 ㅠ.ㅜ


인스턴스 멤버로 Handler 하나 만드시고,
OpenDlg 호출할 때 핸들로러 감싸서 호출해보세요.
아니면, OpenDlg 안의 코드를 Handler 로 감싸셔도....
Handler mHandler = new Handler();
...
mHandler.post(new Runnable() {
@Override
public void run() {
OpenDlg();
}
});