如何解决Java / Android项目符号对象流程
| 想知道是否有人可以指出我正确的方向。 我希望能够将像子弹这样的对象从静态位置动画化到屏幕上的任何区域。 简单的水平和垂直运动没有问题。即x +/- 1或y +/- 1。 但是当涉及到子弹这样的物体可以在任何程度上移动/动画时,我不太确定如何使动画看起来平滑来实现此目的。例如,在18、45或33度角处,像y + 1,x + 1,y + 1 .....这样的算法不会使动画非常平滑。 提前致谢 附言可能也许已经有一些文档? 更新资料 感谢所有答复。 到目前为止,这是我根据您的评论提供的代码。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的临时增量。
@ SyntaxT3rr0r对,这是解决问题的最佳方法。但是,您知道实现此类内容的任何文档吗?
再次感谢所有回复的人
解决方法
我的理解是,您要问的是如何确定每帧要移动项目符号的x&y像素,而不是询问特定于Android动画的实现细节。
简短的答案:用Math:P攻击它
以项目符号为例:
-您可以将动画分割为“将动画分为100帧,以最快的速度播放它们”或“在大约2秒钟内播放动画,在这2秒钟内尽可能多地粉碎帧。\“我将解释前者,因为这听起来像您要尝试执行的操作。
首先以X和Y开头,然后以X和Y结尾:假设您要从0,0移到200,400,并希望在大约100帧动画中进行操作。
将沿X轴行进的总距离除以帧数。对沿Y轴的总距离执行相同操作。现在,您可以每帧移动x和y的距离。对于此示例,您希望子弹横向移动每帧2像素(200像素/ 100帧),垂直移动每像素4像素(400像素/ 100帧)。因此,每帧加x + = 2,y + = 4。
, 我建议您阅读以下文章:
查看动画和属性动画
, 我认为无法以目前的格式来回答。首先,您如何制作动画?您是否在使用图形API? GL? AndEngine?
如果是图形API,则我将画布旋转适当的角度并将子弹沿y轴向上移动。
对于GL,您可以做同样的事情。
对于和引擎,请参考教程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。