package com.DevStoreDemo;
import java.io.InputStream;
import java.util.Enumeration;
import com.DevStoreDemo.R;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.view.MotionEvent;
import android.view.View;
public class ChessboardView extends View
{
private PlayBoard playBoard;
public ChessboardView(Context context)
{
super(context);
//初始化游戏板
//前两个数字表示棋子的宽和长,后两个数字是棋子的左上角位置
//最后是引用图片
playBoard = new PlayBoard(4, 5);
Fragment.setPlayBoard(playBoard);
Fragment.addFragment(new Fragment("Cao Cao", Color.WHITE, 2, 2, 1, 0, R.drawable.role_caocao));
Fragment.addFragment(new Fragment("Zhang Fei", Color.BLUE, 1, 2, 0, 0, R.drawable.role_zhangfei));
Fragment.addFragment(new Fragment("Huang Zhong", Color.YELLOW, 1, 2, 3, 0, R.drawable.role_huangzhong));
Fragment.addFragment(new Fragment("Ma Chao", Color.RED, 1, 2, 0, 2, R.drawable.role_machao));
Fragment.addFragment(new Fragment("Zhao Yun", Color.MAGENTA , 1, 2, 3, 2, R.drawable.role_zhaoyun));
Fragment.addFragment(new Fragment("Guan Yu", Color.GREEN, 2, 1, 1, 2, R.drawable.role_guanyu));
Fragment.addFragment(new Fragment("Soldier1", 1, 1, 1, 0, 4, R.drawable.role_soldier1));
Fragment.addFragment(new Fragment("Soldier2", 2, 1, 1, 3, 4, R.drawable.role_soldier2));
Fragment.addFragment(new Fragment("Soldier3", 3, 1, 1, 1, 3, R.drawable.role_soldier3));
Fragment.addFragment(new Fragment("Soldier4", 4, 1, 1, 2, 3, R.drawable.role_soldier4));
//下面是加载监听器
this.setOnTouchListener(new OnTouchListener()
{
private int xPos;
private int yPos;
private int currentSelectedValue = 0;
//记录当前被选中的格子
private int prevSelectedValue = 0;
//记录前一个被选中的格子
//onTouch表示单击
public boolean onTouch(View view, MotionEvent motion)
{
//手指触摸点的坐标,每个格子80像素
xPos = (int)motion.getX();
yPos = (int)motion.getY();
//当前格子的索引
int x = xPos / 80;
int y = yPos / 80;
//下面表示不能选第六格
if(y == 5)
return false;
//以下执行棋子移动
//可以把移动棋子删去,改成松开棋子的地方,可以拖动棋子
else
{
prevSelectedValue = currentSelectedValue;
currentSelectedValue = playBoard.getBoardValue(x, y);
if((currentSelectedValue != prevSelectedValue) && currentSelectedValue == 0)
{
int direction = decideDirection(x, y, (Fragment)Fragment.fragmentHashTable.get(prevSelectedValue));
if(direction != Fragment.DIRECTION_DONTMOVE)
{
Fragment.fragmentHashTable.put(prevSelectedValue, ((Fragment)Fragment.fragmentHashTable.get(prevSelectedValue)).move(direction));
view.invalidate();
}
}
return false;
}
}
private int decideDirection(int xPos, int yPos, Fragment fragment)
{
if((xPos == fragment.getxPos() - 1) && (yPos >= fragment.getyPos() && yPos <= fragment.getyPos() + fragment.getHeight() - 1))
return Fragment.DIRECTION_LEFT;
if((xPos == fragment.getxPos() + fragment.getLength()) && (yPos >= fragment.getyPos() && yPos <= fragment.getyPos() + fragment.getHeight() - 1))
return Fragment.DIRECTION_RIGHT;
if((xPos >= fragment.getxPos() && xPos <= fragment.getxPos() + fragment.getLength() - 1) && (yPos == fragment.getyPos() - 1))
return Fragment.DIRECTION_UP;
if((xPos >= fragment.getxPos() && xPos <= fragment.getxPos() + fragment.getLength() - 1) && (yPos == fragment.getyPos() + fragment.getHeight()))
return Fragment.DIRECTION_DOWN;
return Fragment.DIRECTION_DONTMOVE;
}
});
}
@Override
//涂色
//因为贴图,所以无意义
public void onDraw(Canvas canvas)
{
Enumeration<Fragment> enumeration = Fragment.fragmentHashTable.elements();
while(enumeration.hasMoreElements())
{
Fragment fragment = enumeration.nextElement();
int color;
//如果棋子不是曹操或五虎上将(小兵),那么颜色是灰色
if(fragment.getValue()!=1 && fragment.getValue()!=2 && fragment.getValue()!=3 && fragment.getValue()!=4)
color = fragment.getValue();
else
color = Color.GRAY;
drawFragment(canvas, fragment, color);
}
}
//绘制矩形形状和尺寸
private void drawFragment(Canvas canvas, Fragment fragment, int color)
{
Paint paint = new Paint();
Rect rect = new Rect();
//rect表示矩形
rect.left = fragment.getxPos() * 80;
//矩形左侧边界坐标等于位置(0,1,2,3,4)*80,上侧同理
rect.top = fragment.getyPos() * 80;
rect.right = (fragment.getxPos() + fragment.getLength()) * 80;
rect.bottom = (fragment.getyPos() + fragment.getHeight()) * 80;
InputStream is = this.getContext().getResources().openRawResource(fragment.getPicture());
@SuppressWarnings("deprecation")
BitmapDrawable bmpDraw = new BitmapDrawable(is);
//下划线在腰上,疑似旧的API可以被新的代替,但是也能用
Bitmap mPic = bmpDraw.getBitmap();
canvas.drawBitmap(mPic, null, rect, paint);
}
}