티스토리 뷰
Java 파일
MainActivity
package com.example.canvas;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
MyView myView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myView = findViewById(R.id.myView);
findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myView.addBall();
}
});
}
}
MyView
package com.example.canvas;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Random;
public class MyView extends View {
ArrayList<Ball> ballArr = new ArrayList<>();
int width;
Paint p;
Bitmap playerImg;
public MyView(Context context) {
super(context);
//자바에서 올리면 실행
p = new Paint();
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//xml에서 올리면 실행
p = new Paint();
width = 100;
playerImg = BitmapFactory.decodeResource(getResources(), R.drawable.ch1);
handler.sendEmptyMessage(0);
new YourThread().start();
new Collision().start();
}
class Collision extends Thread {
@Override
public void run() {
super.run();
while (true){
for (int i = 0; i < ballArr.size(); i++) {
Ball temp = ballArr.get(i);
Rect rect = new Rect(temp.posX, temp.posY, temp.posX+width,temp.posY+width);
Rect playerRect = new Rect(playerX, playerY,playerX+200,playerY+200);
if(rect.intersect(playerRect)){
//i 번째 공과 충돌
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class YourThread extends Thread{
@Override
public void run() {
super.run();
while(true){
for (int i = 0; i < ballArr.size(); i++) {
Ball temp = ballArr.get(i);
temp.posX += temp.speedX;
temp.posY += temp.speedY;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
handler.sendEmptyMessageDelayed(0,5);
invalidate();
}
};
public void addBall(){
ballArr.add(new Ball(new Random().nextInt(400)+50
,new Random().nextInt(400)+50
,new Random().nextInt(5)+5
,new Random().nextInt(5)+5));
}
int playerX;
int playerY;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
p.setColor(Color.RED);
canvas.drawRect(0,0,getWidth(),getHeight(),p);
p.setColor(Color. BLACK);
for (int i = 0; i < ballArr.size(); i++) {
Ball temp = ballArr.get(i);
canvas.drawCircle(temp.posX, temp.posY, width/2,p);
}
// canvas.drawBitmap(playerImg, playerX, playerY,p);
canvas.drawBitmap(playerImg
, new Rect(0,0,playerImg.getWidth(), playerImg.getHeight())
, new Rect(playerX, playerY,playerX+200,playerY+200)
, p);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
playerX = (int)event.getX()-100;
playerY = (int)event.getY()-200;
return true;
}
}
Ball
package com.example.canvas;
public class Ball {
int posX;
int posY;
int speedX;
int speedY;
public Ball(int posX, int posY, int speedX, int speedY) {
this.posX = posX;
this.posY = posY;
this.speedX = speedX;
this.speedY = speedY;
}
}
클릭시 생성되는 볼 개체를 위한 객체지향적 설계
xml 파일
MyView 클래스를 그대로 올려준다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click"
android:textSize="20sp" />
<com.example.canvas.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/bt"
android:layout_marginTop="-7dp" />
</RelativeLayout>
댓글