计划第二个游戏是做STG题材的游戏,内容未定(我首先想到的是叉子=_=b)。前几天看到github上有个叫Danmaku的开源项目(用lwjgl写的),我把它移植成用Android的SurfaceView实现,觉得效果还可以,如图:
当然我希望我的能做得更可爱些,不要弄得那么难玩。
android绘图中使用的矩阵是3x3的结构。
矩阵元素的功能:
先挑与平移有关的看。观察矩阵元素功能可知,如果绘制的图形平移到[x, y], 则只需要修改矩阵右上角的2个元素就可以了。
编写一个继承了view的TransView来验证,以下是onDraw()方法。
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.RED); //在点(50,50)绘制半径为5的红色正圆 canvas.drawCircle(50, 50, 5, paint); //在点(200,200)绘制半径为15的红色正圆 canvas.drawCircle(200, 200, 15, paint); Matrix matrix = new Matrix(); //与 matrix.setTranslate(200, 200)等价 { float[] values = { 1, 0, 200, 0, 1, 200, 0, 0, 1 }; matrix.setValues(values); } Log.i("TransView", "" + matrix.toString()); canvas.save(); //画布在x轴移动200,y轴移动200后绘制半径为10的黑色正圆 canvas.setMatrix(matrix); paint.setColor(Color.BLACK); canvas.drawCircle(0, 0, 10, paint); canvas.restore(); }
效果图:
从log看也可以验证之前的结论。
但从效果图中看,通过matrix绘制的图形坐标有偏移,比起直接在坐标(200, 200)绘制的正圆,y坐标小了70,这点十分奇怪,苦思不得其解,需要继续跟进。
什么是 ContentValues类?
ContentValues类和 Hashtable比较类似,它也是负责存储一些名值对,但是它存储的名值对当中的名是一个String类型,而值都是基本类型。
插入记录
在这里我们将要插入的值都放到一个ContentValues的实例当中,然后执行插入操作,具体代码如下所示:
Java代码
public long createDiary(String title, String body) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_BODY, body);
Calendar calendar = Calendar.getInstance();
// 生成年月日字符串
String created = calendar.get(Calendar.YEAR)
+年+calendar.get(Calendar. MONTH)+月+calendar.get
(Calendar.DAY_OF_MONTH)+日+calendar.get(Calendar.
HOUR_OF _DAY)+时+calendar.get(Calendar.MINUTE)+分;
initialValues.put(KEY_CREATED, created);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
public long createDiary(String title, String body) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_BODY, body);
Calendar calendar = Calendar.getInstance();
// 生成年月日字符串
String created = calendar.get(Calendar.YEAR)
+年+calendar.get(Calendar. MONTH)+月+calendar.get
(Calendar.DAY_OF_MONTH)+日+calendar.get(Calendar.
HOUR_OF _DAY)+时+calendar.get(Calendar.MINUTE)+分;
initialValues.put(KEY_CREATED, created);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
代码解释:
ContentValues initialValues = new ContentValues()语句实例化一个contentValues类。
initialValues.put(KEY_TITLE, title)语句将列名和对应的列值放置到initialValues里边。
mDb.insert(DATABASE_TABLE, null, initialValues)语句负责插入一条新的纪录,如果插入成功则会返回这条记录的id,如果插入失败会返回-1。