JAVA子弹怎么弄_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.绘图相当缓慢和跳跃...相比,像这个Java例子http://www.youtube.com/watch?v=-g5CyPQlIo4

2.如果点击位置接近Y = 0,那么由于ENDY / FRAME的值小于1,意味着向上取整为0并且子弹穿过屏幕的顶部,而不是在Y.Ocessionaly增量。

@ SyntaxT3rr0r你的权利,这是prob最好的方式去做。但是你知道任何文件来实现这样的东西吗?

再次感谢所有回复的人

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值