关于j2me手机游戏!
在j2me手机游戏中,人物向前走时,背景图片向后移动,可是人物已经走出手机屏幕了,背景还没有跟上,怎样设置能让背景图片跟上速度,人物不会出去屏幕?求指教,谢谢!!!...
在j2me手机游戏中,人物向前走时,背景图片向后移动,可是人物已经走出手机屏幕了,背景还没有跟上,怎样设置能让背景图片跟上速度,人物不会出去屏幕?求指教,谢谢!!!
展开
2个回答
展开全部
这是一个滚屏问题,主要应用了LayerManager的setViewWindow()方法。设计思想如下:
问题出在设置什么时候背景开始“跟”:不要设置人物到边沿时再“跟”,设置人物距离边沿还有 int start 长距离时开始“跟”(start=35比较人性化),直到把人物显示在中央才停止。下面是我的一个类,专门用来处理这个滚屏问题的,它是一个线程,你只要把你的LayerManager,地图层,人物,屏幕宽,屏幕高做为参数给它,然后启动它就可以了。
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=20;//地图滚动间隔时间数
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>>1){//主角没有滚到中心
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>>1){//主角没有滚到中心
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>>1){//主角没有滚到中心
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>>1){//主角没有滚到中心
lm.setViewWindow(x, y++, h, v);
}else{
flag=false;
}
}else{
flag=false;
}
this.Mysleep();
}
}
ThreadUtil.sleep(1000);
}
}//end run
public void Mysleep(){
/**休息**/
ThreadUtil.sleep(map_speed);
}
public void setX(int x){
this.x=x;
}
public void setY(int y){
this.y=y;
}
public int getX(){
return this.x;
}
public int getY(){
return this.y;
}
}
问题出在设置什么时候背景开始“跟”:不要设置人物到边沿时再“跟”,设置人物距离边沿还有 int start 长距离时开始“跟”(start=35比较人性化),直到把人物显示在中央才停止。下面是我的一个类,专门用来处理这个滚屏问题的,它是一个线程,你只要把你的LayerManager,地图层,人物,屏幕宽,屏幕高做为参数给它,然后启动它就可以了。
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=20;//地图滚动间隔时间数
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>>1){//主角没有滚到中心
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>>1){//主角没有滚到中心
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>>1){//主角没有滚到中心
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>>1){//主角没有滚到中心
lm.setViewWindow(x, y++, h, v);
}else{
flag=false;
}
}else{
flag=false;
}
this.Mysleep();
}
}
ThreadUtil.sleep(1000);
}
}//end run
public void Mysleep(){
/**休息**/
ThreadUtil.sleep(map_speed);
}
public void setX(int x){
this.x=x;
}
public void setY(int y){
this.y=y;
}
public int getX(){
return this.x;
}
public int getY(){
return this.y;
}
}
aa
2024-08-05 广告
2024-08-05 广告
在选择街机模拟器官方下载平台时,推荐考虑那些用户评价高、功能丰富且安全的软件。比如,一些知名的游戏平台或应用商店中提供的官方街机模拟器,通常都能保证软件的稳定性和安全性。这些平台会有严格的审核机制,确保上传的软件无病毒、无恶意代码,并且提供...
点击进入详情页
本回答由aa提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询