日期:2014-05-20  浏览次数:20643 次

J2me游戏地图滚动
package com.mhxy.util;

import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.TiledLayer;

/**********************处理地图滚动************************************/
public class MapContor implements Runnable{
	private LayerManager lm;//图层管理器
	private TiledLayer map;
	private Zhujiao zhujiao;//游戏主角
	private int h;//屏幕水平宽度
	private int v;//屏幕垂直高度
	private int start=35;//主角距离屏幕start时开始滚屏
	private int x=0;//视窗坐标
	private int y=0;//视窗坐标
	private int map_speed=10;//地图滚动间隔时间数
	
	public MapContor(LayerManager lm,TiledLayer map,Zhujiao zhujiao,int width,int height){
		this.lm=lm;
		this.map=map;
		this.zhujiao=zhujiao;
		this.h=width;
		this.v=height;
		
		//设置可视窗口大小与坐标
		lm.setViewWindow(x,y, h, v);
	}
	public void run() {
		/****************主角距离屏幕小于length时开始滚屏**************************/
		while(true){
			//触发左滚
			if(zhujiao.getX()-this.x<this.start){
				boolean flag=true;
				while(flag){
					if(this.x>0){//可以左滚
						if(zhujiao.getX()-this.x<this.h/2){//主角没有滚到中心
							lm.setViewWindow(x--, y, h, v);
						}else{
							flag=false;
						}
					}else{
						flag=false;
					}
					this.Mysleep();
				}
			}

			//触发上滚
			if(zhujiao.getY()-this.y<this.start){
				boolean flag=true;
				while(flag){
					if(this.y>0){//可以上滚
						if(zhujiao.getY()-this.y<this.v/2){//主角没有滚到中心
							lm.setViewWindow(x, y--, h, v);
						}else{
							flag=false;
						}
					}else{
						flag=false;
					}
					this.Mysleep();
				}
			}

			//触发右滚
			if((this.x+this.h)-(zhujiao.getX()+zhujiao.getWidth())<this.start){
				boolean flag=true;
				while(flag){
					if(this.x+this.h<map.getCellWidth()){//可以右滚
						if(zhujiao.getX()-this.x>this.h/2){//主角没有滚到中心
							lm.setViewWindow(x++, y, h, v);
						}else{
							flag=false;
						}
					}else{
						flag=false;
					}
					this.Mysleep();
				}
			}
			//触发下滚
			if((this.y+this.v)-(zhujiao.getY()+zhujiao.getHeight())<this.start){
				boolean flag=true;
				while(flag){
					if(this.y+this.v<map.getHeight()){//可以下滚
						if(zhujiao.getY()-this.y>this.v/2){//主角没有滚到中心
							lm.setViewWindow(x, y++, h, v);
						}else{
							flag=false;
						}
					}else{
						flag=false;
					}
					this.Mysleep();
				}
			}
			
			try {
				Thread.currentThread().sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
	}//end run
	
	public void Mysleep(){
		/**休息**/
		try {
			Thread.currentThread().sleep(map_speed);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}