Ridzzzz
Ridzzzz

Reputation: 31

Cant draw rectangle on canvas [Android Studio Game]

so i was following retro-chickens tutorial online on how to make a 2d game on android studio and i have run across a problem and i tried to figure it out but i just cant seemm to find a solution. The problem occured on his 2nd video (https://www.youtube.com/watch?v=Rliwg0sELJo) where he runs his code and rectangle appears on the screen which he can move around. For me the rectangle doesnt appear on the canvas for some reason, it is just a blank canvas even though i have the exact same code as him (i have gone back and checked).

At times my application sometimes doesnt even launch and gives me error like this (I have the latest sdk version and everything):

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.

Here is the code that i have made from the video:

[GameObject Interface]

package com.example.ridhavraj.stardrifter;

import android.graphics.Canvas;

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

[MainActivity Class]

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));
    }

}

[MainThread Class]

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 Class]

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);
    }
}

[Player Class]

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);

    }
}

I dont clue what i am doing wrong, any help would be greatly appreciated.

Upvotes: 0

Views: 591

Answers (2)

Nimesh Vasani
Nimesh Vasani

Reputation: 1

for 3D Rectangle(cube) copy whole code to your CustomView Class

Paste This into onDraw() method
        drawCube(
                    fp.mX.toInt(), fp.mY.toInt(),
                    100 + (fp.mCx.toInt() - fp.mX.toInt()),
                    100 + fp.mCy.toInt() - fp.mY.toInt(),
                    mPaint, mCanvas!!
                )
        drawCube(
                    fp.mX.toInt(), fp.mY.toInt(),
                    100 + (fp.mCx.toInt() - fp.mX.toInt()),
                    100 + fp.mCy.toInt() - fp.mY.toInt(),
                    mStrokePaint, mCanvas!!
                )

3D Cube Function Code

private fun drawCube(
    x: Int,
    y: Int,
    width: Int,
    height: Int,
    paint: Paint,
    canvas: Canvas
) {
    val p1 = Point(x, y)
    val p2 = Point(x, y + height)
    val p3 = Point(x + width, y + height)
    val p4 = Point(x + width, y)
    val p5 = Point(x + width / 2, y - height / 2)
    val p6 = Point(x + 3 * width / 2, y - height / 2)
    val p7 = Point(x + 3 * width / 2, y + height / 2)

    val path = Path()
    path.fillType = Path.FillType.EVEN_ODD
    path.moveTo(p1.x.toFloat(), p1.y.toFloat())
    path.lineTo(p2.x.toFloat(), p2.y.toFloat())
    path.lineTo(p3.x.toFloat(), p3.y.toFloat())
    path.lineTo(p4.x.toFloat(), p4.y.toFloat())
    path.lineTo(p1.x.toFloat(), p1.y.toFloat())
    path.lineTo(p5.x.toFloat(), p5.y.toFloat())
    path.lineTo(p6.x.toFloat(), p6.y.toFloat())
    path.lineTo(p4.x.toFloat(), p4.y.toFloat())
    path.moveTo(p3.x.toFloat(), p3.y.toFloat())
    path.lineTo(p7.x.toFloat(), p7.y.toFloat())
    path.lineTo(p6.x.toFloat(), p6.y.toFloat())
    path.lineTo(p4.x.toFloat(), p4.y.toFloat())
    path.close()
    canvas.drawPath(path, paint)

}

Upvotes: 0

Ridzzzz
Ridzzzz

Reputation: 31

Well Turns out guys, i am retarded, there was a typo in the player class

private Rect rectangle; private int color;

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

Upvotes: 2

Related Questions