java - 无法在 Canvas 上绘制矩形 [Android Studio 游戏]

标签 java android canvas

所以我在网上关注了retro-chickens教程,了解如何在android studio上制作2d游戏,我遇到了一个问题,我试图解决它,但我似乎找不到解决方案。问题出现在他的第二个视频 ( https://www.youtube.com/watch?v=Rliwg0sELJo ) 中,他运行代码,屏幕上出现矩形,他可以在其中移动。对我来说,由于某种原因,矩形没有出现在 Canvas 上,它只是一个空白 Canvas ,即使我有与他完全相同的代码(我已经回去检查了)。

有时我的应用程序有时甚至无法启动并给出这样的错误(我有最新的 sdk 版本和所有内容):

Cold swapped changes.
$ adb shell am start -n "com.example.ridhavraj.stardrifter/com.example.ridhavraj.stardrifter.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 3319 on device emulator-5554
W/System: ClassLoader referenced unknown path: /data/app/com.example.ridhavraj.stardrifter-2/lib/x86
I/InstantRun: Instant Run Runtime started. Android package is com.example.ridhavraj.stardrifter, real application class is null.
W/System: ClassLoader referenced unknown path: /data/app/com.example.ridhavraj.stardrifter-2/lib/x86
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 1

                  [ 11-11 20:20:52.858  3319: 3343 D/         ]
                  HostConnection::get() New Host Connection established 0xaee13300, tid 3343
A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 3343 (Thread-5)

        [ 11-11 20:20:53.138  1214: 1214 W/         ]
        debuggerd: handling request: pid=3319 uid=10072 gid=10072 tid=3343
Application terminated.

这是我根据视频制作的代码:

[游戏对象接口(interface)]

package com.example.ridhavraj.stardrifter;

import android.graphics.Canvas;

public interface GameObject {
    public void draw(Canvas canvas);
    public void update();
} 

[主 Activity 类]

package com.example.ridhavraj.stardrifter;

import android.os.Bundle;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new GamePanel(this));
    }

}

[主线程类]

package com.example.ridhavraj.stardrifter;

import android.graphics.Canvas;
import android.provider.Settings;
import android.view.SurfaceHolder;

public class MainThread extends Thread{

    public static final int MAX_FPS = 30;
    private double averageFPS;
    private SurfaceHolder surfaceHolder;
    private GamePanel gamePanel;
    private boolean running;
    public static Canvas canvas;

    public void setRunning(boolean running)
    {
        this.running = running;
    }

    public MainThread(SurfaceHolder surfaceHolder, GamePanel gamePanel)
    {
        super();
        this.surfaceHolder = surfaceHolder;
        this.gamePanel = gamePanel;
    }

    @Override
    public void run()
    {
        long startTime;
        long timeMillis = 1000/MAX_FPS;
        long waitTime;
        int frameCount = 0;
        long totalTime = 0;
        long targetTime = 1000/MAX_FPS;

        while(running)
        {
            startTime = System.nanoTime();
            canvas = null;

            try
            {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized (surfaceHolder)
                {
                    this.gamePanel.update();
                    this.gamePanel.draw(canvas);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (canvas != null)
                {
                    try
                    {
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }

            }

            timeMillis = (System.nanoTime()-startTime)/1000000;
            waitTime = targetTime - timeMillis;

            try
            {
                if (waitTime > 0)
                {
                    this.sleep(waitTime);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

            totalTime += System.nanoTime() - startTime;
            frameCount++;
            if (frameCount == MAX_FPS)
            {
                averageFPS = 1000/((totalTime/frameCount)/1000000);
                frameCount = 0;
                totalTime = 0;
                System.out.println(averageFPS);
            }
        }
    }

}

[GamePanel 类]

package com.example.ridhavraj.stardrifter;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback {

    private MainThread thread;

    private Player player;
    private Point playerPoint;

    public GamePanel(Context context)
    {
        super(context);

        getHolder().addCallback(this);

        thread = new MainThread(getHolder(), this);

        player = new Player(new Rect(100,100,200,200), Color.rgb(255,0,0));
        playerPoint = new Point(150,150);

        setFocusable(true);
    }

    @Override
    public void surfaceChanged(SurfaceHolder Holder, int format, int width, int height)
    {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        thread = new MainThread(getHolder(), this);
        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        boolean retry = true;
        while(true)
        {
            try
            {
                thread.setRunning(false);
                thread.join();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            retry = false;
        }
    }

    public boolean onTouchEvent(MotionEvent event)
    {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                playerPoint.set((int)event.getX(), (int)event.getY());
        }
        return true;
        //return super.onTouchEvent(event);
    }

    public void update()
    {
        player.update(playerPoint);
    }

    @Override
    public void draw(Canvas canvas)
    {
        super.draw(canvas);

        canvas.drawColor(Color.WHITE);
        player.draw(canvas);
    }
}

[玩家等级]

package com.example.ridhavraj.stardrifter;

import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Canvas;
import android.graphics.Rect;

public class Player implements GameObject{

    private Rect rectangle;
    private int color;

    public Player(Rect rectangle, int Color)
    {
        this.rectangle = rectangle;
        this.color = color;
    }

    @Override
    public void draw(Canvas canvas)
    {
        Paint paint = new Paint();
        paint.setColor(color);
        canvas.drawRect(rectangle, paint);
    }

    @Override
    public void update()
    {

    }

    public void update(Point point)
    {
        //l,t,r,b
        rectangle.set(point.x-rectangle.width()/2, point.y-rectangle.height()/2, point.x+rectangle.width()/2, point.y+rectangle.height()/2);

    }
}

我不知道我做错了什么,任何帮助将不胜感激。

最佳答案

好吧,伙计们,我智障,玩家类别中有一个拼写错误

私有(private) Rect 矩形; 私有(private)整数颜色;

public Player(Rect rectangle, int Color [THIS SHOULD BE 'color' and not 'Color')
{
    this.rectangle = rectangle;
    this.color = color;
}

关于java - 无法在 Canvas 上绘制矩形 [Android Studio 游戏],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40559564/

相关文章:

javascript - HTML5 每隔几秒保存一次 Canvas 图像

java - 如何将 JTextFields 中的整数值居中?

android - Android 2.3.3 中的 HTML 标签解析错误

javascript - 绘制后将 Canvas 调整为整个屏幕

android mediaplayer - 播放一次铃声

java - 如何在 Android 应用程序的语音识别中传递语言?

javascript - 如何在 Canvas 中创建文本框

java - 清理未在 reducer 中运行

java - 定时器在扩展 SurfaceView 并实现 Runnable 的类中不起作用

java - 使 jar 文件首先运行特定文件