文章目录
一、计划实现内容
1.1、主界面布局
设计好游戏区域、按钮的布局。
1.2、游戏界面绘制
绘制出游戏显示的界面,确定好游戏以后显示区域。
1.3、方块生成
初步生成一个俄罗斯方块的样式。
二、代码设计
2.1、布局代码
采用线性布局、框架布局
<LinearLayout
android:id="@+id/ll_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/fl_game"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</FrameLayout>
</LinearLayout>
2.2、游戏界面绘制
2.2.1、定义游戏区域
//游戏区域空间
View view;
//游戏区域的高 宽
int xHight,xWidth;
//地图
boolean[][] maps;
2.2.2、初始化数据
//初始化数据
private void initdata(){
//获得屏幕宽度
int width=getScreenWidth(this);
//System.out.println("宽度0:"+width);
//设置游戏区域宽度=屏幕宽度*2/3
xWidth=width*2/3;
// System.out.println("宽度:"+xWidth);
//设置游戏区域的高度=宽度*2
xHight=xWidth*2;
//xHight=xWidth*9/5;
//System.out.println("高度:"+xHight);
//初始化地图
maps=new boolean[10][20];
//初始化方块
boxs=new Point[]{new Point(0,0)};
//初始化方块大小=屏幕长度/10
boxSize=xWidth/maps.length;
}
2.2.3、设置游戏区域
//得到父容器
fl_game=findViewById(R.id.fl_game);
//设置游戏区域大小
view.setLayoutParams(new FrameLayout.LayoutParams(xWidth,xHight));
//是指背景颜色
view.setBackgroundColor(0x10000000);
//添加到父容器里面
fl_game.addView(view);
2.2.4、定义画笔
//辅助线画笔
Paint linePaint;
2.2.5、初始化画笔
//初始化画笔
linePaint=new Paint();
linePaint.setColor(0xff000000);
//一般都会打开看锯齿
linePaint.setAntiAlias(true);
2.2.6、绘制线
//竖线
for (int x=0;x<maps.length;x++){
canvas.drawLine(x*boxSize,0,x*boxSize,view.getHeight(),linePaint);
}
//横线
for (int y=0;y<maps[0].length;y++){
canvas.drawLine(0,y*boxSize,view.getWidth(),y*boxSize,linePaint);
}
2.3、方块生成
2.3.1、定义画笔
//方块画笔
Paint boxPaint;
2.3.2、初始化画笔
//初始化画笔
boxPaint=new Paint();
boxPaint.setColor(0xff666666);
boxPaint.setAntiAlias(true);
2.3.3、方块生成
//初始化方块
boxs=new Point[]{new Point(0,0)};
//方块绘制
for(int i=0;i<boxs.length;i++){
canvas.drawRect(
boxs[i].x*boxSize,
boxs[i].y*boxSize,
boxs[i].x*boxSize+boxSize,
boxs[i].y*boxSize+boxSize, boxPaint);
}
三、完整代码
3.1、布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/fl_game"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</FrameLayout>
<LinearLayout
android:id="@+id/ll_11"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="vertical">
<Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始" />
<Button
android:id="@+id/btn_pause"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂停" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_left"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="向左"/>
<Button
android:id="@+id/btn_top"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="向上"/>
<Button
android:id="@+id/btn_right"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="向右"/>
<Button
android:id="@+id/btn_up"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="向下"/>
</LinearLayout>
</LinearLayout>
3.2、实现代码
package com.example.wuluo.ols;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
public class MainActivity extends AppCompatActivity {
//得到父容器
private FrameLayout fl_game;
//左、上、右、下、开始、暂停
private Button btn_left,btn_top,btn_right,btn_up,btn_start,btn_pause;
//游戏区域空间
View view;
//游戏区域的高 宽
int xHight,xWidth;
//地图
boolean[][] maps;
//方块
Point[] boxs;
//方块大小
int boxSize;
//辅助线画笔、方块画笔
Paint linePaint,boxPaint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initdata();
initview();
}
//初始化数据
private void initdata(){
//获得屏幕宽度
int width=getScreenWidth(this);
//System.out.println("宽度0:"+width);
//设置游戏区域宽度=屏幕宽度*2/3
xWidth=width*2/3;
// System.out.println("宽度:"+xWidth);
//设置游戏区域的高度=宽度*2
xHight=xWidth*2;
//xHight=xWidth*9/5;
//System.out.println("高度:"+xHight);
//初始化地图
maps=new boolean[10][20];
//初始化方块
//boxs=new Point[]{new Point(0,0)};
boxs=new Point[]{new Point(2,2),new Point(2,3),new Point(3,2),new Point(3,3)};
//初始化方块大小=屏幕长度/10
boxSize=xWidth/maps.length;
}
//初始化视图
private void initview() {
//初始化画笔
linePaint=new Paint();
linePaint.setColor(0xff000000);
//一般都会打开看锯齿
linePaint.setAntiAlias(true);
boxPaint=new Paint();
boxPaint.setColor(0xff666666);
boxPaint.setAntiAlias(true);
//得到父容器
fl_game=findViewById(R.id.fl_game);
//按钮
btn_left=findViewById(R.id.btn_left);
btn_top=findViewById(R.id.btn_top);
btn_right=findViewById(R.id.btn_right);
btn_up=findViewById(R.id.btn_up);
btn_start=findViewById(R.id.btn_start);
btn_pause=findViewById(R.id.btn_pause);
//实例化游戏区域
view=new View(this){
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//方块
for(int i=0;i<boxs.length;i++){
canvas.drawRect(
boxs[i].x*boxSize,
boxs[i].y*boxSize,
boxs[i].x*boxSize+boxSize,
boxs[i].y*boxSize+boxSize, boxPaint);
}
//竖线
for (int x=0;x<maps.length;x++){
canvas.drawLine(x*boxSize,0,x*boxSize,view.getHeight(),linePaint);
}
//横线
for (int y=0;y<maps[0].length;y++){
canvas.drawLine(0,y*boxSize,view.getWidth(),y*boxSize,linePaint);
}
}
};
//设置游戏区域大小
view.setLayoutParams(new FrameLayout.LayoutParams(xWidth,xHight));
//是指背景颜色
view.setBackgroundColor(0x10000000);
//添加到父容器里面
fl_game.addView(view);
}
//获得屏幕宽度的方法
public static int getScreenWidth(Context context){
WindowManager wm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics=new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.widthPixels;
}
}
四、实现效果
4.1、一个绘制点
boxs=new Point[]{new Point(0,0)};
4.2、多个绘制点
4.2.1、样式一
boxs=new Point[]{new Point(0,0),new Point(1,0),new Point(2,0),new Point(2,1)};
4.2.2、样式二
boxs=new Point[]{new Point(2,2),new Point(2,3),new Point(3,2),new Point(4,4)};
这里只是单纯实验一下,在界限以内,就会绘制出来。