Android 물리 게임 의 중력 시스템 개발 예시 코드
중력 센서 에서 저 는 원형 이 핸드폰 의 반전 각도 에 따라 서로 다른 속 도 를 가 집 니 다.그러나 그 안에 가속도 알고리즘 이 내장 되 어 있 는 것 은 모두 Android os 로 봉 인 된 것 입 니 다.오늘 우리 가 말 하고 자 하 는 중력 시스템 은 바로 이 속 도 를 모 의 하여 자 유 롭 게 떨 어 지 는 원형 을 만 드 는 것 입 니 다.현실 의 고무공 처럼 질 적 이 고 양 이 있 는 것 같 습 니 다!떨 어 질 때 속도 가 빨 라 지고 튕 겨 나 오 면 속도 가 점점 줄어든다.
먼저 두 장의 효과 캡 처 를 붙 여 여러분 에 게 직관 적 인 이 해 를 한 다음 에 상세 하 게 설명 하 겠 습 니 다.
원형 자유 낙하 데모 안내
시 뮬 레이 터 의 임의의 버튼 을 눌 렀 을 때 랜 덤 으로 화면 에 랜 덤 크기,랜 덤 색상,랜 덤 위치,끊임없이 반 짝 이 는 원형 을 생 성 합 니 다.그리고 원형 은 중력 을 가지 고 있 습 니 다.자유 낙하 체 를 할 때 원형 이 화면 밑 에 닿 았 을 때 반 짝 이 고 반 짝 이 는 높이 가 한 번 에 낮 습 니 다!(허허,약간 H 를 가지 고 놀다 가 버튼 을 미 친 듯 이 눌 러 서 화면 이 온통-)
이 실례 에서 보기 위해 서 나 는 원형 을 최종 적 으로 멈 추 게 하지 않 고 한 높이 에서 계속 반등 하고 떨 어 질 것 이다.
그리고 한 가 지 는 원형 이 고도 로 자유 낙하 할 때 X 좌표계 에서 변 하지 않 았 을 수도 있 습 니 다.물론 이것 은 우리 코드 에서 이상 적 인 상태 에 속 합 니 다.현실 생활 에서 보통 X/Y 좌표계 가 변동 이 있 기 때 문 입 니 다.여기 서 Demo 에서 저 는 주로 수직 으로 떨 어 지고 반등 하 는 기능 을 만 들 었 습 니 다.수평 가속도 에 대해 저 는 하지 않 았 습 니 다.첫 번 째 는 수직 적 인 처리 사고 와 거의 일치 하기 때 문 입 니 다.두 번 째 는 시간 이 없습니다~
됐어,쓸데없는 소리 하지 마!먼저 제 가 정의 한 원형 류 를 소개 하 겠 습 니 다.
자바 코드
package com.himi;
import java.util.Random;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
/**
* @author Himi
* @
*/
public class MyArc {
private int arc_x, arc_y, arc_r;// X,Y
private float speed_x = 1.2f, speed_y = 1.2f;// x、y
private float vertical_speed;//
private float horizontal_speed;// ,
private final float ACC = 0.135f;//
private final float RECESSION = 0.2f;//
private boolean isDown = true;//
private Random ran;//
/**
* @
* @param x X
* @param y Y
* @param r
*/
public MyArc(int x, int y, int r) {
ran = new Random();
this.arc_x = x;
this.arc_y = y;
this.arc_r = r;
}
public void drawMyArc(Canvas canvas, Paint paint) {//
paint.setColor(getRandomColor());// , ( )
canvas.drawArc(new RectF(arc_x + speed_x, arc_y + speed_y, arc_x + 2 *
arc_r + speed_x, arc_y + 2 * arc_r + speed_y), 0, 360, true, paint);
}
/**
* @return
* @
*/
public int getRandomColor() {
int ran_color = ran.nextInt(8);
int temp_color = 0;
switch (ran_color) {
case 0:
temp_color = Color.WHITE;
break;
case 1:
temp_color = Color.BLUE;
break;
case 2:
temp_color = Color.CYAN;
break;
case 3:
temp_color = Color.DKGRAY;
break;
case 4:
temp_color = Color.RED;
break;
case 6:
temp_color = Color.GREEN;
case 7:
temp_color = Color.GRAY;
case 8:
temp_color = Color.YELLOW;
break;
}
return temp_color;
}
/**
*
*/
public void logic() {//
if (isDown) {//
/*-- 1-*/speed_y += vertical_speed;// Y
int count = (int) vertical_speed++;
//
// for (int i = 0; i < vertical_speed++; i++) {} - -
for (int i = 0; i < count; i++) {// 1
/*-- 2-*/ vertical_speed += ACC;
}
} else {//
speed_y -= vertical_speed;
int count = (int) vertical_speed--;
for (int i = 0; i < count; i++) {
vertical_speed -= ACC;
}
}
if (isCollision()) {
isDown = !isDown;// !
vertical_speed -= vertical_speed * RECESSION;//
}
}
/**
*
* @return
* @ true
*/
public boolean isCollision() {
return arc_y + 2 * arc_r + speed_y >= MySurfaceViee.screenH;
}
}
비교적 간단 하 다.주로 몇 가지 비 고 를 설명 한다.비고 1:
아마 일부 학생 들 은 이곳 이 약간 어 지 러 운 것 을 보 았 을 것 이다.내 가 설명 하 자 면 모두 가 자 유 롭 게 떨 어 질 때 속도 가 점점 빨 라 지 는 것 을 알 고 있다.이것 은 가속도 의 영향 을 받 는 것 이기 때문에 여기 서 우 리 는 원래 의 원형 y 속 도 를 바탕 으로 가속도!
여기에 있 는 어린이 신발 은 for 순환 을 간략하게 쓸 수 있다 고 합 니 다.그러면 저 는 여러분 에 게 힌트 를 드 리 겠 습 니 다.
for (int i = 0; i < count; i++) {
vertical_speed += ACC;
}
상기 코드 는 확실히 한 마디 로 표시 할 수 있다.vertical_speed +=ACC*count; 혹은 vertical_speed =vertical_speed + ACC*count;
그러나 주의해 야 할 것 은 저 에 게 변 수 는 모두 부동 소수점 이기 때문에 부동 소수점 에 대해 자릿수 제한 이 있다 는 것 을 잘 알 고 있 습 니 다.그러면 저 는 for 로 쓰 면 곱 하기 를 피 할 수 있 습 니 다.만약 에 약자 의 형식 이 얻 은 결과 에 차이 가 있 을 수 있 습 니 다!그 러 니까 조심해.
그리고 제발 vertical 로 간략하게 쓰 지 마 세 요.speed =(vertical_speed +ACC)*count; 이것 은 잘못된 것 이다!
비고 2:
가속도 가 원형 원래 의 속도 에 영향 을 주 었 지만 우리 의 가속도 도 일정 하지 않다.실제 구체 의 자유 낙하 를 모 의 하기 위해 가속도 에 편 이 량 ACC 를 증가 시 켰 을 뿐만 아니 라 그 변화의 규칙 에 대해 모 의 를 해서 다음 가속도 편 이 량 을 배로 증가 시 켜 야 한다.그래서 왜 for 순환 할 때 가속도 의 값 을 for 순환 의 판정 조건 으로 생각 합 니까?
자,다음은 우리 Surface View 를 보 겠 습 니 다.
package com.himi;
import java.util.Random;
import java.util.Vector;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class MySurfaceViee extends SurfaceView implements Callback, Runnable {
private Thread th;
private SurfaceHolder sfh;
private Canvas canvas;
private Paint paint;
private boolean flag;
public static int screenW, screenH;
private Vector<MyArc> vc;//
private Random ran;//
public MySurfaceViee(Context context) {
super(context);
this.setKeepScreenOn(true);
vc = new Vector<MyArc>();
ran = new Random();// 1
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setAntiAlias(true);
setFocusable(true);
}
public void surfaceCreated(SurfaceHolder holder) {
flag = true;// 。。。
th = new Thread(this);
screenW = this.getWidth();
screenH = this.getHeight();
th.start();
}
public void draw() {
try {
canvas = sfh.lockCanvas();
canvas.drawColor(Color.BLACK);
if (vc != null) {// ,
for (int i = 0; i < vc.size(); i++) {
vc.elementAt(i).drawMyArc(canvas, paint);
}
}
} catch (Exception e) {
// TODO: handle exception
} finally {
try {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
} catch (Exception e2) {
}
}
}
private void logic() {//
if (vc != null) {// ,
for (int i = 0; i < vc.size(); i++) {
vc.elementAt(i).logic();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// ,
vc.addElement(new MyArc(ran.nextInt(this.getWidth()), ran.nextInt(100), ran.nextInt(50)));
return true;
}
public void run() {
// TODO Auto-generated method stub
while (flag) {
logic();
draw();
try {
Thread.sleep(100);
} catch (Exception ex) {
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.v("Himi", "surfaceChanged");
}
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
OK,코드 도 간단 하고 또렷 해!한 마디 만 하 겠 습 니 다.MyArc 에 도 MysurfaceView 와 같은 방법 인 logic()와 draw()가 있 습 니 다.그러면 우리 의 코드 구 조 를 잘 관리 하고 생각 이 뚜렷 하 며 각자 의 책임 을 다 하 며 혼란 을 피 할 수 있 습 니 다.이상 은 안 드 로 이 드 개발 중력 시스템 에 대한 자료 정리 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.