3天打造一个 android 小游戏
2011-10-04 20:46 youxiachai 阅读(8113) 评论(9) 编辑 收藏 举报十月二日日~十月四日,三天(对前两天没兴趣的,可以直接下拉到第三天)
第一天:小游戏的简单准备
竟然是小游戏…当然越简单越好了…
游戏策划---
游戏玩法:
玩家只需要把屏幕里面见到的人物全部消灭!
游戏需要的技术:
1,surfaceview 的用法.
2,游戏的线程循环.
3,坐标的居中.
素材:
人物:
http://www.famitsu.com/freegame/tool/chibi/index2.html
这个网站可以帮我们生成我们需要的十二宫格人物
第二天:技术代码的实现
1,surfaceView
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101public
class
GameViewSurface
extends
SurfaceView
{
//1,声明我们的Bitmap对象
private
Bitmap bitmap;
//2,声明一个holder对象
private
SurfaceHolder holder;
//3,声明用于线程循环的对象
private
GameThread gameThread;
//4,声明我们的精灵,下一章节用的
private
List<Sprite> sprites =
new
ArrayList<Sprite>();
//5,初始我们的变量
public
GameViewSurface(Context context) {
super
(context);
gameThread =
new
GameThread(
this
);
holder = getHolder();
//用于调用运行的线程
holder.addCallback(
new
Callback() {
@Override
public
void
surfaceDestroyed(SurfaceHolder holder) {
//1退出时终止我们的run方法
boolean
retry =
true
;
gameThread.setRunning(
false
);
//2等待线程的终止
while
(retry) {
try
{
gameThread.join();
retry =
false
;
}
catch
(InterruptedException e) {
Log.d(
"sur"
,
"gua le "
);
}
}
}
//添加我们的绘图线程
@Override
public
void
surfaceCreated(SurfaceHolder holder) {
//1,创建精灵
createSprites();
//2,开始我们的线程
gameThread.setRunning(
true
);
gameThread.start();
}
@Override
public
void
surfaceChanged(SurfaceHolder holder,
int
format,
int
width,
int
height) {
}
});
}
//创建精灵方法
private
void
createSprites() {
sprites.add(createSprite(R.drawable.bad1));
}
private
Sprite createSprite(
int
resouce) {
bitmap = BitmapFactory.decodeResource(getResources(), resouce);
return
new
Sprite(
this
, bitmap);
}
//绘图方法
protected
void
onDraw(Canvas canvas)
{
//把背景画成黑色
canvas.drawColor(Color.BLACK);
//画出所有精灵
for
(Sprite sprite : sprites) {
sprite.onDraw(canvas);
}
}
//点了精灵消失的方法
//1,控制最后点击的时间
long
lastClick;
@Override
public
boolean
onTouchEvent(MotionEvent event) {
// 当时间间隔太少不执行以下方法
if
(System.currentTimeMillis() - lastClick >
500
){
lastClick = System.currentTimeMillis();
synchronized
(getHolder()) {
float
tX = event.getX();
float
tY = event.getY();
for
(
int
i = sprites.size() -
1
; i >=
0
;i--){
Sprite sprite = sprites.get(i);
if
(sprite.isCollison(tX,tY)){
//精灵消失
sprites.remove(i);
break
;
}
}
}
}
return
true
;
}
}
2,接着就要写我们的game循环的线程
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657public
class
GameThread
extends
Thread {
private
GameView view;
private
boolean
running =
false
;
public
GameLoopThread(GameView view) {
this
.view = view;
}
public
void
setRunning(
boolean
run) {
running = run;
}
@Override
public
void
run() {
while
(running) {
Canvas c =
null
;
try
{
c = view.getHolder().lockCanvas();
synchronized
(view.getHolder()) {
view.onDraw(c);
}
}
finally
{
if
(c !=
null
) {
view.getHolder().unlockCanvasAndPost(c);
}
}
}
}
}
3,创建我们的精灵类
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879public
class
Sprite {
//图片有四行
private
static
final
int
BMP_ROWS =
4
;
//图片有三列
private
static
final
int
BMP_COLUMNS =
3
;
private
int
x =
0
;
private
int
y =
0
;
private
int
xSpeed =
5
;
private
GameSurfaceView gameView;
private
Bitmap bmp;
//当前片断
private
int
currentFrame =
0
;
private
int
width;
private
int
height;
public
Sprite(GameSurfaceView gameView, Bitmap bmp) {
this
.gameView = gameView;
this
.bmp = bmp;
this
.width = bmp.getWidth() / BMP_COLUMNS;
this
.height = bmp.getHeight() / BMP_ROWS;
}
private
void
update() {
if
(x > gameView.getWidth() - width - xSpeed) {
xSpeed = -
5
;
}
if
(x + xSpeed <
0
) {
xSpeed =
5
;
}
x = x + xSpeed;
currentFrame = ++currentFrame % BMP_COLUMNS;
}
public
void
onDraw(Canvas canvas) {
update();
//处理,人物的行走
int
srcX = currentFrame * width;
//对于人物的动作先不处理
int
srcY =
1
* height;
//1,画出我们要矩形
Rect src =
new
Rect(srcX, srcY, srcX + width, srcY + height);
//2,画到的具体目的
Rect dst =
new
Rect(x, y, x + width, y + height);
//3,画出..
canvas.drawBitmap(bmp, src, dst,
null
);
}
public
boolean
isCollison(
float
x2,
float
y2) {
//判断要消失的精灵位置
return
x2 > x && x2 < x +width && y2 > y && y2 < y + height ;
}
这三个类写好以后,应该就有这样的效果
4,剩下就是让多个精灵随机出现,这个我相信就不多说了,只需要在sprite的构造方法中x,y的坐标随机化就好了,人物的动作就是改变操纵srcY的坐标.
12345678910//坐标随机参考代码
x = rnd.nextInt(gameView.getWidth() - width);
y = rnd.nextInt(gameView.getHeight() - height);
//人物动作参考代码
int
srcY = getAnimationRow()* height;
private
int
getAnimationRow(){
double
dirDouble = (Math.atan2(xSpeed, ySpeed)) / (Math.PI /
2
) +
2
;
int
direction = (
int
)Math.round(dirDouble) % BMP_ROWS;
return
direction;
}
这也能叫做游戏??
完成的源代码下载
http://115.com/file/aq7kzhff#
kill_them_all_by_tom.rar
第三天:思考与总结
还记得前两天做的游戏吗?那个也能配得叫做做游戏吗?没有华丽的画面.没有动听的音乐,没有动人的剧情,更没有好玩的操作,还…
当然,前两天只是做一个例子,算不上真正的游戏,那今天,我们想想什么才算得上一个游戏呢?
1,好的画面,音乐,特效
技术的发展,也同时带动了游戏画面的发展,我们现在做一款FC年代的游戏画面的游戏的话,估计,会被喷子们碰死,”这都啥年代了还做这种游戏!”(当然,也有例外的情况),这年头,大家真正愿意掏钱购买的游戏,如果,没有在第一眼给人以震撼,估计很少人会去购买,这种作品就是我们俗称的大作,例如,将要发售的战地3,而那些小游戏,只是作为无聊的时候打发时间用的,如果,有标价的话,他们宁愿玩另外一款免费的,因为,在他们看来,小游戏就应该是免费的,无论这个游戏做得多好.小游戏的画面,依然达不到值得他们购买的水平.当然,做得非常好的也会心甘情愿的掏钱购买,例如,植物大战僵尸,水果忍者,愤怒的小鸟等等,不过,要做到这种程度的话…不是可以复制的.(当然…在中国,你只能看到这些游戏是免费的…)
2,足以支持第一点的技术
一个优秀的想法,也要有足以实现的技术…不然,就像达芬奇那样…有着天才的想法,却没有相应实现的技术…
3,优秀的剧本
一个优秀的游戏,必然有一个好的剧本支撑.你说,俄罗斯方块这些没有剧本也很好玩…如果,我告诉你如果加上剧本的话就更好玩了(NDS上有一款马里奥俄罗斯方块),优秀的剧本,可以说得上游戏的灵魂.
4,人性化的操作
如果,我们做的游戏想模拟飞行类那样的操作,估计就只有那些很少一部分人能够享受其中的乐趣了.所以,我们在设计我们的游戏的时候,要针对我们面对的人群,设计出一套最人性化的操作,这点我觉得很重要.
5,能够提供给人以好玩的感受
一个游戏,最关键的是什么?对于,一般玩家来说,应该就是好玩.虽然,他们玩玩说不出为什么好玩,但是,他们就感觉好玩,然后,他们就会购买你的游戏,这点,以我目前的水平还不足以阐述清楚.
综合以上五点:我们能不能改进一下我们前两天做的游戏呢?
1,游戏的玩法,剧情,
1,玩法不变,但是,我们可以加上一点游戏背景
2,在一个晚上,你在睡觉的时候,有一只蚊子在里耳旁飞行,你忍无可忍,于是,打开灯,与蚊子进行一番搏斗.
2,设计与相应技术.
1,环境的视角设计,
1,用人的身体作为背景(有猎奇的性质)
2,用房间作为背景(普通)
2,追逐蚊子的方式
1,利用手机的重力感应,
2,利用手势
3,蚊子的死亡与攻击
1,拍的蚊子以后可以出现一滩鲜血
2,被蚊子咬到的时候,手机震动,或者屏幕变红
4,蚊子AI的设计
1,蚊子躲避,
2,蚊子咬人的位置
3,图片,音乐,特效的设计
如果,加上以上几点,那么前两天做的游戏是不是变成焕然一新呢?
PS:以上提到的只是建议...没有实现...
作者:游戏阿柴
出处:http://www.cnblogs.com/youxilua
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
微博联系:新浪微博
用支付宝赞助博主:http://me.alipay.com/youxilua
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架