实现在SurfaceView上移动游戏人物

本文介绍了一个简单的Android游戏开发案例,通过使用不同的图片资源来实现游戏人物的移动动画效果。文章提供了完整的源代码,并详细解释了如何根据键盘输入改变人物的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

首先给大家介绍一个RPG素材网站

http://www.66rpg.com/ 

这几天一直在捣鼓这个

有很多游戏人物图片

可以用来实现人物动画

 

 

游戏画面如下图

 
 
代码如下
只实现了移动人物,对碰撞之类的还没有实现。
 
package com.example.gamethree;

import android.view.KeyEvent;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.view.View;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Bitmap;
import android.graphics.Color;


public class EightOne extends SurfaceView implements SurfaceHolder.Callback,Runnable{

	private Canvas canvas;
	private Bitmap background;

	private Thread thread;
	private SurfaceHolder holder;

	public int l_id=0;
	public int r_id=0;
	public int u_id=0;
	public int d_id=0;
	
	//人物位置坐标
	int curX=0;
	int curY=0;
	int Code;

	
	//获取人物朝右的图片ID
	int[] r_pic_id={R.drawable.right_a,
			R.drawable.right_b,
			R.drawable.right_a,
			R.drawable.right_d
	};

	//获取人物朝左的图片ID
	int[] l_pic_id={R.drawable.left_a,
			R.drawable.left_b,
			R.drawable.left_c,
			R.drawable.left_d,
	};

	//获取人物朝上的图片ID
	int[] u_pic_id={R.drawable.up_a,
			R.drawable.up_b,
			R.drawable.up_a,
			R.drawable.up_d
	};

	//获取人物朝下的图片ID
	int[] d_pic_id={R.drawable.down_a,
			R.drawable.down_b,
			R.drawable.down_c,
			R.drawable.down_d,
	};


	//获取对应图片ID的Bitmap数组
	Bitmap[] r_pic=new Bitmap[4];
	Bitmap[] l_pic=new Bitmap[4];
	Bitmap[] u_pic=new Bitmap[4];
	Bitmap[] d_pic=new Bitmap[4];

	public EightOne(Context content)
	{
		super(content);	
		holder=getHolder();
		holder.addCallback(this);
		background=BitmapFactory.decodeResource(getResources(), R.drawable.background1);

		//加载图片资源
		maps();	

		thread=new Thread(this);	

		//这个一定要有,否则无法监听到键盘事件
		setFocusable(true);

		
		setOnKeyListener(new OnKeyListener(){
			public boolean onKey(View v,int keyCode,KeyEvent event)
			{

				Code=keyCode;
				if(event.getAction()==KeyEvent.ACTION_DOWN)
				{
					switch(keyCode)
					{
					case KeyEvent.KEYCODE_DPAD_RIGHT:
						if(r_id>2)
							r_id=0;
						r_id++;
						curX+=4;	
						break;
					case KeyEvent.KEYCODE_DPAD_LEFT:
						if(l_id>2)
							l_id=0;
						l_id++;
						curX-=4;								
						break;
					case KeyEvent.KEYCODE_DPAD_UP:
						if(u_id>2)
							u_id=0;
						u_id++;
						curY-=4;										
						break;
					case KeyEvent.KEYCODE_DPAD_DOWN:
						if(d_id>2)
							d_id=0;
						d_id++;
						curY+=4;							
						break;	
					}			
				}
				else
				{
					l_id=0;
					r_id=0;
					u_id=0;
					d_id=2;
				}
				return true;
			}	
		});



	}

	@Override
	public void surfaceChanged(SurfaceHolder holder,int format,int width,int height)
	{

	}
	@Override
	public void surfaceCreated(SurfaceHolder holder)
	{
		//启动一条线程
		thread.start();	
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder)
	{

	}

	//分别加载人物在左、右、上、下四个方面的资源
	public void maps(){
		for(int i=0;i<r_pic_id.length;i++)
		{
			r_pic[i]=BitmapFactory.decodeResource(getResources(), r_pic_id[i]);	
			l_pic[i]=BitmapFactory.decodeResource(getResources(), l_pic_id[i]);	
			u_pic[i]=BitmapFactory.decodeResource(getResources(), u_pic_id[i]);	
			d_pic[i]=BitmapFactory.decodeResource(getResources(), d_pic_id[i]);	
		}
	}


	@Override
	public void run()
	{
		while(true)
		{
			try{
				synchronized(holder)
				{
					
					//调用自定义的绘画方法
					canvas=holder.lockCanvas();
					myDraw();
					holder.unlockCanvasAndPost(canvas);		
				}
			}
			catch(Exception e)
			{

			}
			try{
				Thread.sleep(100);
			}
			catch(Exception e)
			{

			}	
		}
	}
	
	//自定义一个绘画方法
	public void myDraw(){

		canvas.drawColor(Color.BLACK);
		canvas.drawBitmap(background,0,0,null);

		if(Code==KeyEvent.KEYCODE_DPAD_RIGHT)
			canvas.drawBitmap(r_pic[r_id],curX,curY,null);

		else if(Code==KeyEvent.KEYCODE_DPAD_LEFT)
			canvas.drawBitmap(l_pic[l_id],curX,curY,null);

		else if(Code==KeyEvent.KEYCODE_DPAD_UP)
			canvas.drawBitmap(u_pic[u_id],curX,curY,null);

		else
			canvas.drawBitmap(d_pic[d_id],curX,curY,null);

	}
}

转载于:https://my.oschina.net/u/656482/blog/71642

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值