Java / Android项目符号对象流程

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-