最近写了一个四子棋,说实话,我个人比较喜欢Java应用开发和JavaEE开发,但是对于Android游戏开发真的没有什么经验,所以在这个游戏开发的过程中遇见的问题贴一下分享一下:
四子棋的规则和五子棋判断胜负很类似,但是棋子的下落和俄罗斯方块很类似(点击某一列,该列就从上方以动画的形式下落)
废话不多说,先看运行效果:
游戏设计过程中遇见的问题:
1.加载bitmap图片的时候,原来图片的分辨率为130 * 130,被加载到了内存中后,尺寸为390 * 390,查了资料才知道Android会自动缩放图片,所以加载图片的时候需要一个options:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),color.equals("red") ? R.drawable.circle_red : R.drawable.circle_green,options);
2.bitmap缩放的方法:
Matrix matrix = new Matrix();
matrix.setScale(scaleX, scaleY);
Bitmap bitmap = createBitMapCopy();
Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
3.View的平移动画写法:
TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, -points.get(position).y, 0);
translateAnimation.setDuration(1024);
gameView.setAnimation(translateAnimation);
4.源代码贴一下:
package site.iknown.connect4;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.transition.Transition;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
/**
* Created by IamBestCoder on 17/5/16.
*/
public class GameActivity extends AppCompatActivity implements View.OnClickListener
{
private FrameLayout frameLayout = null;
private int countClick = 0;
private ImageView greenImage = null;
private ImageView redImage = null;
private int map[][] = new int[9][10];
private TextView greenText = null;
private TextView redText = null;
private TextView scoreView = null;
//游戏者
private Player green = null;
private Player red = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
setContentView(R.layout.activity_game);
//游戏者取值
green = (Player) getIntent().getSerializableExtra("green");
red = (Player) getIntent().getSerializableExtra("red");
//设置文本
greenText = (TextView) findViewById(R.id.game_text_green);
redText = (TextView) findViewById(R.id.game_text_red);
greenText.setText(green.getName());
redText.setText(red.getName());
scoreView = (TextView) findViewById(R.id.game_text_score);
findViewById(R.id.game_play).setOnClickListener(this);
findViewById(R.id.game_back).setOnClickListener(this);
//ImageView
greenImage = (ImageView) findViewById(R.id.game_image_green);
redImage = (ImageView) findViewById(R.id.game_image_red);
//framelayout
frameLayout = (FrameLayout) findViewById(R.id.game_view);
frameLayout.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
//计算缩放比
float scaleX =
(float) (frameLayout.getWidth() / 700);
float scaleY =
(float) (frameLayout.getHeight() / 600);
countClick++;
String color = null;
if (countClick % 2 == 0)
{
greenImage.setVisibility(View.VISIBLE);
redImage.setVisibility(View.INVISIBLE);
scaleX /= 13 / 7;
scaleY /= 13 / 7;
color = "red";
} else
{
greenImage.setVisibility(View.INVISIBLE);
redImage.setVisibility(View.VISIBLE);
color = "green";
scaleX /= 12 / 7;
scaleY /= 12 / 7;
}
int width = frameLayout.getWidth() / 7;
int height = frameLayout.getHeight() / 6;
boolean isContinue = true;
int i = 0;
//纵轴坐标合集
ArrayList points = null;
while (isContinue && i < 7)
{
i++;
points = new ArrayList();
int circleX = width * i - (int) (width * 0.5);
for (int j = 1; j <= 6; j++)
{
//中心点的位置应该是这个格子的中心
int circleY = height * j - (int) (height * 0.5);
points.add(new Point(circleX, circleY));
}
//找出所在行数
if (Math.abs(event.getX() * 1. - circleX * 1.) <= 64)
{
isContinue = false;
}
}
//最后画点的位置
int position = findEmptyPosition(i);
Point point = points.get(position);
View gameView =
new GameView(GameActivity.this, point.x, point.y, scaleX, scaleY,
color);
//动画
frameLayout.addView(gameView);
TranslateAnimation translateAnimation =
new TranslateAnimation(0, 0, -points.get(position).y, 0);
translateAnimation.setDuration(1024);
gameView.setAnimation(translateAnimation);
//更新map
map[position][i] = countClick % 2 == 0 ? 2 : 1;
//判断是否有冠军产生
int winner = createWinner();
if (winner != 0)
{
//更新比分
if (winner == 1)
{
green.setSocre(green.getSocre() + 1);
} else if (winner == 2)
{
red.setSocre(red.getSocre() + 1);
}
showScore();
//结果
View view = View.inflate(GameActivity.this, R.layout.view_winner, null);
ImageView winnerImage = (ImageView) view.findViewById(R.id.over_image);
TextView winnerText = (TextView) view.findViewById(R.id.over_text);
//设置文本和图片
winnerImage.setImageResource(
winner == 1 ? R.drawable.person_green : R.drawable.person_red);
winnerText.setText(winner == 1 ? green.getName() : red.getName());
//对话框
AlertDialog.Builder builder =
new AlertDialog.Builder(GameActivity.this);
builder.setView(view).setPositiveButton("Continue",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
frameLayout.removeAllViews();
//清空集合
map = new int[9][10];
}
}).create().show();
}
break;
}
return false;
}
});
}
private int createWinner()
{
//判断是否有冠军产生
int winner = 0;
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 7; j++)
{
int n = map[i][j];
if (n != 0)
{
if ((n == map[i + 1][j + 1] && n == map[i + 2][j + 2] &&
n == map[i + 3][j + 3]) ||
(n == map[i][j + 1] && n == map[i][j + 2] && n == map[i][j + 3]) ||
(n == map[i + 1][j] && n == map[i + 2][j] && n == map[i + 3][j]) ||
(i >= 3 && (n == map[i - 1][j + 1] && n == map[i - 2][j + 2] &&
n == map[i - 3][j + 3])))
{
winner = n;
}
}
}
System.out.println();
}
return winner;
}
private int findEmptyPosition(int i)
{
//找到空的位置
for (int j = 5; j >= 0; j--)
{
if (map[j][i] != 1 && map[j][i] != 2)
{
return j;
}
}
return 0;
}
private void showScore()
{
scoreView.setText(green.getSocre() + " : " + red.getSocre());
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.game_back:
//返回
finish();
break;
case R.id.game_play:
//再来一局
Toast.makeText(GameActivity.this, "Game over!", Toast.LENGTH_LONG).show();
green.setSocre(0);
red.setSocre(0);
//清屏
frameLayout.removeAllViews();
//清空集合
map = new int[9][10];
showScore();
break;
default:
break;
}
}
}