j2me中,Sprite TieldLayer地图贴图的制作方法

本文介绍了一个使用Java实现的游戏人物移动功能,通过继承MIDlet并利用GameCanvas、LayerManager等组件来绘制地图和控制角色移动。文章详细展示了如何响应键盘输入使角色在地图上移动,并实现了屏幕滚动。
 

public class PersonMoveMain extends MIDlet {
 private Display display;
 private PersonMapCanvas pmc=new PersonMapCanvas(true);
 
 public PersonMoveMain(){
  display=Display.getDisplay(this);
 }
 protected void startApp() throws MIDletStateChangeException {
  display.setCurrent(pmc);
 }

 protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
 
 }

 protected void pauseApp() {
 }
 class PersonMapCanvas extends GameCanvas implements Runnable{
  //声明绘制地图的图片对象
  private Image map;
  //声明一个精灵对象
  private Sprite sperson;
  private LayerManager lm;
  //声明绘制草地和墙的layer
  private TiledLayer tlRoad;
  private TiledLayer tlWall;
  //声明一组精灵图片对象
  private Image pesondownImage;
  //声明一个绘图工具对象
  private Graphics g;
  //声明精灵的初始坐标x,y
  private int current_x=0;
  private int current_y=0;
  //设置屏幕刷新
  private boolean Running=true;
  // 设置背景层的行数和列数
  private int rowNum = 12;
  private int columnNum = 12;
  //控制LayerManager的x、y坐标VW_X
  private int VM_X=0;
  private int VM_Y=0;
  //定义地图分布情况
  int[][] cells = new int[][]{
    {1,1,2,2,2,2,2,2,2,1,2,2},
    {1,1,1,1,1,1,1,1,1,1,2,1},
    {1,1,1,2,2,2,2,2,1,2,1,1},
    {1,1,1,2,2,2,1,2,1,2,1,1},
    {1,1,1,2,2,1,2,1,1,2,1,1},
    {1,1,1,2,1,2,1,2,1,2,1,1},
    {1,1,1,2,1,2,2,1,1,2,1,1},
    {1,1,1,2,1,2,2,1,1,2,1,1},
    {1,1,1,2,1,2,1,2,1,2,1,1},
    {1,1,1,2,2,1,2,2,1,2,1,1},
    {1,1,1,2,1,2,2,2,1,2,1,1},
    {1,1,1,1,2,2,2,2,1,2,1,1}
   };
  protected PersonMapCanvas(boolean suppressKeyEvents) {
   super(true);
   //获得绘图工具对象
   g=this.getGraphics();
   //获得layer管理类对象
   lm=new LayerManager();
   //创建一个地图image对象和精灵image对象
   try {
    map = Image.createImage("/map.png");
    pesondownImage=Image.createImage("/person_down.png");
   } catch (IOException e) {
    e.printStackTrace();
   }
   //实例化地图对象,草地和墙以及精灵对象
   tlRoad = new TiledLayer(rowNum,columnNum,map,map.getWidth()/2,map.getHeight());
   tlWall = new TiledLayer(rowNum,columnNum,map,map.getWidth()/2,map.getHeight()); 
   sperson=new Sprite(pesondownImage,pesondownImage.getWidth()/4,pesondownImage.getHeight());   
   sperson.setPosition(current_x, current_y);
   //通过循环填充地图
   for(int i=0;i<12;i++){
    for(int j=0;j<12;j++){
     if(cells[j][i]==1){
      tlRoad.setCell(j, i, cells[i][j]);
     }
     else if(cells[j][i]==2){
      tlWall.setCell(j, i, cells[i][j]);
     }
    }
   }
   lm.append(sperson);
   lm.append(tlRoad);
   lm.append(tlWall);
   new Thread(this).start();
  }
  public void run() {
   while(Running){
    System.out.println("AAAAAAAAAAAAAA"+sperson.getX()+","+sperson.getX());
   
    g.setColor(255, 255, 255);
    g.fillRect(0, 0, this.getWidth(), this.getHeight());
    
    lm.setViewWindow(VM_X,VM_Y,this.getWidth(),this.getHeight());
    lm.paint(g, 0, 0);
    this.flushGraphics();
    switch (this.getKeyStates()) {
    case DOWN_PRESSED:
     System.out.println("下");
     //判断向下走的范围不要超过地图
     if(sperson.getY()>=0&&sperson.getY()<=map.getHeight()*12-sperson.getHeight()){
      sperson.nextFrame();//下一帧
      sperson.move(0, 1);
     }
     lm.paint(g, this.getWidth(), this.getHeight());
     //判断当精灵走到屏幕的0.6倍后、向上滚动地图
     if(sperson.getY()>this.getHeight()*0.6&&VM_Y<map.getHeight()*12-this.getHeight()){
      System.out.println("DDDD"+VM_Y);
      VM_Y++;
     }
     this.flushGraphics();
     break;
    case UP_PRESSED :
     System.out.println("上");
     sperson.nextFrame();//下一帧
     sperson.move(0, -1);
     lm.paint(g, this.getWidth(), this.getHeight());
     this.flushGraphics();
     break;
    case LEFT_PRESSED :
     System.out.println("左");
     sperson.nextFrame();//下一帧
     sperson.move(-1, 0);
     lm.paint(g, this.getWidth(), this.getHeight());
    
     this.flushGraphics();
     break;
    case RIGHT_PRESSED:
     System.out.println("右");
     sperson.nextFrame();//下一帧
     sperson.move(1, 0);
     lm.paint(g, this.getWidth(), this.getHeight());
     if(sperson.getX()>this.getWidth()*0.6&&VM_X<map.getHeight()*12-this.getWidth()){
      System.out.println("DDDD"+VM_X);
      VM_X++;
     }
     this.flushGraphics();
     break;
    }
    try {
     Thread.currentThread().sleep(100);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   }
  }
  
  
 }
}

运行效果:

 

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值