누군가 올바른 방향으로 나를 가리킬 수 있는지 궁금합니다.Java/Android 글 머리 기호 개체 흐름
글 머리 기호와 같은 개체를 정적 위치에서 화면의 모든 영역으로 애니메이션 할 수 있기를 원합니다.
간단한 가로 및 세로 움직임에는 아무런 문제가 없습니다. 나는. x +/- 1 또는 y +/- 1 그러나 글 머리 기호와 같은 객체가 움직일 수있는 경우에는 애니메이션을 매끄럽게 보이게 만드는 방법을 잘 모릅니다. 예를 들어 18, 45 또는 33도 각도에서 y + 1, x + 1, y + 1 .....과 같은 알고리즘을 사용하면 애니메이션이 매우 매끄럽게 진행되지 않습니다.
미리 감사드립니다.
P.s 어쩌면 이미 몇 가지 문서가 있습니까?
업데이트 응답 한 모든 사람에게
감사합니다.
이것은 귀하의 의견을 기반으로 작성한 코드입니다.
package com.bullet;
//imports go here
public class canvas extends SurfaceView implements OnTouchListener, SurfaceHolder.Callback{
private Bitmap bullet;
private int bulletStartX, bulletStartY;
private int bulletX, bulletY;
private int bulletEndX = -1;
private int bulletEndY = -1;
private int incX = 0;
private int incY = 0;
private SurfaceHolder holder;
private Thread t;
public canvas(Context context) {
super(context);
this.setBackgroundColor(Color.WHITE);
setFocusable(true);
setFocusableInTouchMode(true);
setOnTouchListener(this);
bulletStartX = 0;
bulletStartY = 0;
bulletX = bulletStartX;
bulletY = bulletStartY;
bullet = BitmapFactory.decodeResource(getResources(), R.drawable.bullet);
holder = getHolder();
holder.addCallback(this);
}
public void onDraw(Canvas canvas){
if(bulletEndX != -1 && bulletEndY != -1){
Log.e("here", "drawing bullet");
Log.e("here", "x: " + bulletX + ", y: " + bulletY);
canvas.drawBitmap(bullet, bulletX, bulletY, null);
}
}
public void updateBullet(){
Log.e("here", "inc bullet");
bulletX += incX;
bulletY += incY;
if(bulletX > bulletEndX){
bulletEndX = -1;
}
if(bulletY > bulletEndY){
bulletEndY = -1;
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int[] coordinates = {(int) event.getX(), (int) event.getY()};
int motion = event.getAction();
switch(motion){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
bulletX = bulletStartX;
bulletY = bulletStartY;
bulletEndX = (int) event.getX();
bulletEndY = (int) event.getY();
incX = (int) bulletEndX/50;
incY = (int) bulletEndY/50;
Log.e("here", "touch up");
break;
}
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
t = new GameThread(this, holder);
t.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
//Thread class
class GameThread extends Thread{
private canvas canvas;
private SurfaceHolder holder;
private boolean run = false;
long delay = 70;
public GameThread(canvas canvas, SurfaceHolder holder){
this.holder = holder;
this.canvas = canvas;
startThread(true);
}
public boolean isRunning(){
return this.run;
}
private void startThread(boolean run){
this.run = run;
}
public void stopThread(){
this.run = false;
}
@Override
public void run(){
while(run){
Canvas c = null;
try {
//lock canvas so nothing else can use it
c = holder.lockCanvas(null);
synchronized (holder) {
//clear the screen with the black painter.
//This is where we draw the game engine.
//Log.e("drawthread", "running");
if(bulletEndX != -1 && bulletEndY != -1){
updateBullet();
canvas.postInvalidate();
}
canvas.onDraw(c);
//Log.e("drawthread", "ran");
try {
sleep(32);
//Log.e("slept", "sleeping");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} finally {
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
holder.unlockCanvasAndPost(c);
}
}
}
}
}
}
그림은 꽤 잘 작동하지만 두 가지 문제점이 있습니다.
1 도면이 자바의 예처럼 뭔가에 비해 ... 매우 느리고 불안해입니다
2 클릭이 인해 다음 Y = 0 가까이있는 위치에있는 경우 http://www.youtube.com/watch?v=-g5CyPQlIo4
ENDY/FRAME의 값이 1보다 작 으면 반올림이 0으로되고 총알이 Y에서의 증가가 아니라 화면 상단을 가로 질러 이동 함을 의미합니다.@ SyntaxT3rr0r 귀하의 권리는 prob입니다. 그것에 대해 갈 수있는 가장 좋은 방법입니다. 그러나 이와 같은 것을 구현하는 데 필요한 모든 문서를 알고 있습니까? 다시
화면 좌표! = 세계 좌표. 게임은 일반적으로 임의의 좌표계를 사용하고 객체를 화면 좌표로 변환하여 화면에 적용합니다 (예 : 온라인 * 스타 크래프트 2 * 대 1280x960 또는 1600x1200의 상대와 비교할 수 있습니다 * 상대방의 yota를 바꿉니다. 왜냐하면 당신은 여전히 동일한 임의의 게임 좌표계로 게임하고 있기 때문입니다. 총알 위치를 화면 좌표보다 큰 좌표계로 계산하십시오. 그것은 초보자를위한 것일 뿐이므로 답변이 아닙니다. – SyntaxT3rr0r
updated 내 게시물 – Stevanicus