先看效果
我用到的图片-
在看代码
package dk.game;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new GameView(this));
}
}
package dk.game;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameView extends SurfaceView implements Runnable,SurfaceHolder.Callback {
//刷屏主线程
private Thread gameThread;
//游戏屏幕宽和高
public static int screen_width,screen_height;
private Paint paint;
private Canvas canvas;
private SurfaceHolder sfh;
private boolean run_flag=false;
//敌人图片
private Bitmap bmp_enemy;
//移动速度
private int enemy_speed=5;
//角色移动控制帧
private int frame=0;
//按键上下左右移动的判断
private boolean is_up,is_down,is_left,is_right;
//上下左右移动动画帧编号
private int[] enemy_up={3,4,5};
private int[] enemy_down={0,1,2};
private int[] enemy_left={6,7,8};
private int[] enemy_right={9,10,11};
//当前帧动画
private int[] enemy_start=enemy_down;
//初始角色单帧图片右上角位置和单帧图片宽和高
//右上角位置作为图片的人物的控制点不太合适
//private int X=50,Y=50,W,H;
//人物的控制点坐标和宽高
private int X,Y,W,H;
public GameView(Context context) {
super(context);
sfh=getHolder();
sfh.addCallback(this);
paint =new Paint();
paint.setAntiAlias(true);
//获得焦点
setFocusable(true);
setClickable(true);
setFocusableInTouchMode(true);
//保持屏幕常亮
setKeepScreenOn(true);
bmp_enemy=BitmapFactory.decodeResource(getResources(), R.drawable.enemy);
W=bmp_enemy.getWidth()/13;
H=bmp_enemy.getHeight();
//这里我以单帧图片的中心点为控制点。具体控制点的位置,主要看你的图片了
X=X+W/2;
Y=Y+Y/2;
}
public void draw(Canvas canvas,Paint paint){
/* 第一种绘制方法 */
/*
canvas.drawColor(Color.GRAY);
//屏幕显示区域
Rect rect_dst=new Rect(X-W/2, Y-H/2, X+W/2, Y+H/2);
//图片截取区域
Rect rect_src=new Rect(enemy_start[frame]*W, 0, (enemy_start[frame]+1)*W, H);
canvas.drawBitmap(bmp_enemy,rect_src,rect_dst,paint);
*/
/* 第二种绘制方法 */
canvas.save();
canvas.drawColor(Color.GRAY);
//设置可视区域
canvas.clipRect(X-W/2, Y-H/2, X+W/2, Y+H/2);
canvas.drawBitmap(bmp_enemy,X-enemy_start[frame]*W-W/2,Y-H/2,paint);
canvas.restore();
}
public void logic(){
//根据按键状态判断
if(is_up){
Y-=enemy_speed;
}else if(is_down){
Y+=enemy_speed;
}else if(is_left){
X-=enemy_speed;
}else if(is_right){
X+=enemy_speed;
}
//边界暂时先不判断
if(X<0){
X=0;
}
if(Y<0){
Y=0;
}
if(X>screen_width){
X=screen_width;
}
if(Y>screen_height){
Y=screen_height;
}
//移动动画帧的处理
if((is_up || is_down||is_left ||is_right)|| frame!=0){
if(frame<2){
frame++;
}else{
frame=0;
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_DPAD_UP){
is_up=true;
enemy_start=enemy_up;
}else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
is_down=true;
enemy_start=enemy_down;
}else if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
is_left=true;
enemy_start=enemy_left;
}else if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
is_right=true;
enemy_start=enemy_right;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
is_up=false;
is_down=false;
is_left=false;
is_right=false;
return super.onKeyUp(keyCode, event);
}
@Override
public void run() {
while (run_flag) {
try {
long startTime=System.currentTimeMillis();
canvas=sfh.lockCanvas();
logic();
draw(canvas, paint);
long endTime=System.currentTimeMillis();
long useTime=endTime-startTime;
//固定屏幕刷新的时间为50ms
if(useTime<50){
Thread.sleep(50-useTime);
}
} catch (Exception e) {
Log.e("Error", "刷屏线程出错了"+e);
}finally{
if(canvas!=null){
sfh.unlockCanvasAndPost(canvas);
}
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
screen_width=getWidth();
screen_height=getHeight();
gameThread=new Thread(this);
run_flag=true;
//启动线程
gameThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
run_flag=false;
try {
gameThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}
}
最后源码下载
:
http://dl.iteye.com/topics/download/638556d9-97b2-3bd9-a7b7-13588b3eb8b5
- 大小: 9.8 KB
- 大小: 1.1 KB
分享到:
相关推荐
在Android开发中,SurfaceView是一个非常重要的视图组件,它主要用于处理复杂的图形绘制和视频播放等需要高性能、低延迟的场景。本实例将深入探讨SurfaceView的工作原理和使用方法,帮助开发者更好地理解和利用这一...
7-13-5-2(通过移动关节绑定两个Body动作) 7-13-6(鼠标关节-拖拽Body) 7-14(AABB获取Body) 7-4(Box2d物理世界) 7-5在物理世界中添加矩形) 7-7(添加自定义多边形) 7-9(在物理世界中添加圆形) 8-1(迷宫小球) 8-2(堆房子...
在Android游戏开发领域,入门级的经典实例是学习者掌握基础知识和技能的重要途径。"android游戏开发入门级经典实例"这个主题旨在为初学者提供简单易懂的游戏开发实践,帮助他们快速进入Android游戏开发的世界。虽然...
Sample3_7:这是一个实际的项目样本,可能包含一个使用SurfaceView实现特定功能的示例,例如游戏中的角色移动、粒子效果或者自定义的视频播放控件。 通过以上各个章节的学习,你将全面掌握SurfaceView的使用,能够...
在Android游戏开发中,涉及到许多核心技术和组件,这些在标题和描述中有所提及。下面将对这些关键知识点进行深入解析。 1. **View与SurfaceView**: - **View**:是Android UI系统的基础,它代表屏幕上的一个可视...
在Android游戏开发中,创建一个具有人物移动、子弹发射以及跳跃功能的游戏实例是一个常见的实践,这对于初学者来说是一个很好的学习项目。在这个实例中,我们将深入探讨Android游戏开发的基础知识,包括2D图形处理、...
总之,SurfaceView是安卓游戏开发中的重要工具,通过理解和熟练运用它的特性,开发者能够构建出流畅且高效的移动游戏。这个压缩包提供的源码是一个很好的学习资源,可以帮助你深入理解SurfaceView在游戏开发中的应用...
我们通常会使用SurfaceView或者其子类SurfaceHolder.Callback来控制游戏循环,确保游戏逻辑的平滑运行。通过不断地重绘Canvas,我们可以实现动态效果,如角色移动、碰撞检测等。帧率控制(如通过Thread.sleep或...
主Activity创建SurfaceView实例,设置SurfaceHolder回调,并启动子线程进行游戏循环。同时,我们需要处理布局文件,确保SurfaceView在屏幕上正确显示。 总结,通过学习和实践这个Flabby Bird游戏,开发者不仅能掌握...
3. **游戏应用开发**:在Android平台上开发游戏涉及到OpenGL ES、SurfaceView、Canvas、Bitmap的高效使用,以及游戏框架如libGDX、Cocos2d-x的理解与实践。同时,还需了解游戏状态管理、碰撞检测、动画制作和性能...
在Android游戏开发的世界里,开发者可以利用Android SDK和各种游戏引擎来创造丰富的移动游戏体验。本资源包聚焦于"Android游戏开发大全"的第7至10章,提供了丰富的案例源程序,帮助开发者深入理解游戏开发的核心技术...
在Android游戏开发中,物体来回移动是一个常见的动态效果,它涉及到动画原理、坐标系统、帧率控制以及物理运动规律等多个知识点。在这个主题中,我们将深入探讨如何实现物体在屏幕上来回移动的效果,并结合具体的...
本资源提供了一个详细的实例教程,即《从零开始Android游戏编程(第二版)》,这本书是学习Android游戏开发的优秀教材。 首先,Android游戏编程的核心在于理解Android系统架构和SDK。Android SDK提供了丰富的API和...
本示例源码是关于使用SurfaceView构建游戏框架的实例,适合计算机科学与技术专业的学生进行毕业设计或移动开发App的学习。SurfaceView是Android系统中一个专门用于处理高性能图形绘制的视图组件,尤其适用于游戏或...
《安卓Android源码——体育游戏-疯狂足球源码》是一个专为Android平台设计的体育游戏应用的源代码,它提供了一个完整的开发实例,对于想要学习Android游戏开发的开发者来说是宝贵的资源。源码包含了实现游戏功能的...
游戏开发源码则可能涵盖2D和3D游戏开发的基础,如使用Android的SurfaceView进行游戏渲染,学习OpenGL ES进行图形绘制,理解游戏循环和帧率控制,以及物理引擎的运用。此外,可能还会涉及游戏状态管理、碰撞检测、...
CrazyFootball游戏的源码中,我们可以看到如何使用Android的SurfaceView或者OpenGL ES进行2D或3D图形绘制,如何实现游戏的帧率控制,以及如何处理触摸事件来控制游戏对象的移动和交互。 再者,"实例"意味着实际操作...
在Android平台上,开发一款应用程序,让一个小球跟随手指移动,是一个经典的交互式UI设计实例。这个实例主要涉及到了Android的视图系统、事件处理以及绘图机制。下面将详细讲解这些知识点。 首先,Android的视图...
android移动开发案例精选 Android通过画线实现button效果 Android如何防止apk程序被反编译 Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 android开发环境之Logcat(日志)教程实例汇总 android网络通信...