竟然是小遊戲…當然越簡單越好了…
遊戲策劃---
遊戲玩法:
玩家隻需要把螢幕裡面見到的人物全部消滅!
<a target="_blank" href="http://blog.51cto.com/attachment/201202/213735480.gif"></a>
1,surfaceview 的用法.
2,遊戲的線程循環.
3,坐标的居中.
人物:
<a href="http://www.famitsu.com/freegame/tool/chibi/index2.html">http://www.famitsu.com/freegame/tool/chibi/index2.html</a>
這個網站可以幫我們生成我們需要的十二宮格人物
<a target="_blank" href="http://blog.51cto.com/attachment/201202/213742502.png"></a>
public 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 ");
} }
}
//添加我們的繪圖線程
public void surfaceCreated(SurfaceHolder holder) {
//1,建立精靈
createSprites();
//2,開始我們的線程
gameThread.setRunning(true); gameThread.start();
}
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; } }
public 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); } } } } }
public 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 ; }
這三個類寫好以後,應該就有這樣的效果
<a target="_blank" href="http://blog.51cto.com/attachment/201202/213749570.gif"></a>
//坐标随機參考代碼
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
還記得前兩天做的遊戲嗎?那個也能配得叫做做遊戲嗎?沒有華麗的畫面.沒有動聽的音樂,沒有動人的劇情,更沒有好玩的操作,還…
當然,前兩天隻是做一個例子,算不上真正的遊戲,那今天,我們想想什麼才算得上一個遊戲呢?
技術的發展,也同時帶動了遊戲畫面的發展,我們現在做一款FC年代的遊戲畫面的遊戲的話,估計,會被噴子們碰死,”這都啥年代了還做這種遊戲!”(當然,也有例外的情況),這年頭,大家真正願意掏錢購買的遊戲,如果,沒有在第一眼給人以震撼,估計很少人會去購買,這種作品就是我們俗稱的大作,例如,将要發售的戰地3,而那些小遊戲,隻是作為無聊的時候打發時間用的,如果,有标價的話,他們甯願玩另外一款免費的,因為,在他們看來,小遊戲就應該是免費的,無論這個遊戲做得多好.小遊戲的畫面,依然達不到值得他們購買的水準.當然,做得非常好的也會心甘情願的掏錢購買,例如,植物大戰僵屍,水果忍者,憤怒的小鳥等等,不過,要做到這種程度的話…不是可以複制的.(當然…在中國,你隻能看到這些遊戲是免費的…)
一個優秀的想法,也要有足以實作的技術…不然,就像達芬奇那樣…有着天才的想法,卻沒有相應實作的技術…
一個優秀的遊戲,必然有一個好的劇本支撐.你說,俄羅斯方塊這些沒有劇本也很好玩…如果,我告訴你如果加上劇本的話就更好玩了(NDS上有一款馬裡奧俄羅斯方塊),優秀的劇本,可以說得上遊戲的靈魂.
如果,我們做的遊戲想模拟飛行類那樣的操作,估計就隻有那些很少一部分人能夠享受其中的樂趣了.是以,我們在設計我們的遊戲的時候,要針對我們面對的人群,設計出一套最人性化的操作,這點我覺得很重要.
一個遊戲,最關鍵的是什麼?對于,一般玩家來說,應該就是好玩.雖然,他們玩玩說不出為什麼好玩,但是,他們就感覺好玩,然後,他們就會購買你的遊戲,這點,以我目前的水準還不足以闡述清楚.
綜合以上五點:我們能不能改進一下我們前兩天做的遊戲呢?
1,玩法不變,但是,我們可以加上一點遊戲背景
2,在一個晚上,你在睡覺的時候,有一隻蚊子在裡耳旁飛行,你忍無可忍,于是,打開燈,與蚊子進行一番搏鬥.
1,環境的視角設計,
1,用人的身體作為背景(有獵奇的性質)
2,用房間作為背景(普通)
2,追逐蚊子的方式
1,利用手機的重力感應,
2,利用手勢
3,蚊子的死亡與攻擊
1,拍的蚊子以後可以出現一灘鮮血
2,被蚊子咬到的時候,手機震動,或者螢幕變紅
4,蚊子AI的設計
1,蚊子躲避,
2,蚊子咬人的位置
如果,加上以上幾點,那麼前兩天做的遊戲是不是變成煥然一新呢?
PS:以上提到的隻是建議...沒有實作...
本文轉自 liam2199 部落格,原文連結: http://blog.51cto.com/youxilua/772684 如需轉載請自行聯系原作者