通过处理按键模拟加速度,刹车等功能

本文介绍了一个使用Java实现的游戏按键控制系统,该系统适用于移动设备。通过定义不同的按键事件,如上下左右移动等,并结合Canvas画布进行绘制更新,实现了游戏中的角色控制。此外,还包含了按键响应与释放的处理逻辑,确保了游戏体验的流畅性。

import java.lang.*;
import java.io.*;
import java.util.*;
import javax.microedition.lcdui.*;

public class gKey {
public int key_UP;
public int key_DOWN;
public int key_LEFT;
public int key_RIGHT;
public int key_A;
public int key_B;
public int key_C;
public int key_D;
public int key_STAR;
public int key_POUND;
public int key_TIMER;
public int movespeed ;
public int leftvalue ;
public int upvalue ;
public int rightvalue ;
public int downvalue ;

public gKey ( int keytime , int mspeed )
{
  key_TIMER = keytime ;
  refreshKey() ;  
  movespeed = mspeed ;
}

  public void refreshKey ()
{
  key_UP = 0 ;
  key_DOWN = 0 ;
  key_LEFT = 0 ;
  key_RIGHT = 0 ;
  key_A = 0 ;
  key_B = 0 ;
  key_C = 0 ;
  key_D = 0 ;
  key_STAR = 0 ;
  key_POUND = 0 ;
}

public void flushKey ()
{
  if ( key_UP > 0 )
   if ( key_UP < key_TIMER ) key_UP += upvalue ;
  if ( key_DOWN > 0 )
   if ( key_DOWN < key_TIMER ) key_DOWN += downvalue ;
  if ( key_LEFT > 0 )
   if ( key_LEFT < key_TIMER ) key_LEFT += leftvalue  ;
  if ( key_RIGHT > 0 )
   if ( key_RIGHT < key_TIMER ) key_RIGHT += rightvalue ;
}

public void keyPressed(int keyCode,Canvas canvas)
{
     switch (canvas.getGameAction(keyCode)) {
     case Canvas.UP:
         key_UP = (key_UP < key_TIMER)?key_UP+movespeed:key_TIMER ;
         upvalue = movespeed ;
         break;
     case Canvas.DOWN:
      key_DOWN = (key_DOWN < key_TIMER )?key_DOWN+movespeed:key_TIMER ;
         upvalue = movespeed ;
         break;
     case Canvas.LEFT:
      key_LEFT = (key_LEFT < key_TIMER )?key_LEFT+movespeed:key_TIMER ;
      leftvalue = movespeed ;
         break;
     case Canvas.RIGHT:
      key_RIGHT = (key_RIGHT < key_TIMER )?key_RIGHT+movespeed:key_TIMER ;
      rightvalue = movespeed ;
         break;
     case Canvas.GAME_A:
      key_A = (key_A < key_TIMER )?key_A+1:key_TIMER ;
         break;
     case Canvas.GAME_B:
      key_B = (key_B < key_TIMER )?key_B+1:key_TIMER ;
         break;
     case Canvas.GAME_C:
      key_C = (key_C < key_TIMER )?key_C+1:key_TIMER ;
         break;
     case Canvas.GAME_D:
      key_D = (key_D < key_TIMER )?key_D+1:key_TIMER ;
         break;
     case 0:
     switch (keyCode) {
      case Canvas.KEY_NUM2:
       key_UP = (key_UP < key_TIMER )?key_UP+movespeed:key_TIMER ;
       upvalue = movespeed ;
          break;
      case Canvas.KEY_NUM8:
       key_DOWN = (key_DOWN < key_TIMER )?key_DOWN+movespeed:key_TIMER ;
          upvalue = movespeed ;
          break;
         case Canvas.KEY_NUM4:
       key_LEFT = (key_LEFT < key_TIMER )?key_LEFT+movespeed:key_TIMER ;
       leftvalue = movespeed ;
          break;
         case Canvas.KEY_NUM6:
       key_RIGHT = (key_RIGHT < key_TIMER )?key_RIGHT+movespeed:key_TIMER ;
       rightvalue = movespeed ;
          break;
      case Canvas.KEY_POUND:
       key_POUND = (key_POUND < key_TIMER )?key_POUND+1:key_TIMER ;
          break;
      case Canvas.KEY_STAR:
       key_STAR = (key_STAR < key_TIMER )?key_STAR+1:key_TIMER ;
          break;
         }
         break;
     }
}

    public void keyReleased(int keyCode,Canvas canvas) {
     switch (canvas.getGameAction(keyCode)) {
     case Canvas.UP:
      upvalue = - (key_UP / 4) ;
         break;
     case Canvas.DOWN:
      downvalue = - (key_DOWN / 4) ;
         break;
     case Canvas.LEFT:
      leftvalue = - (key_LEFT / 4) ;
         break;
     case Canvas.RIGHT:
      rightvalue = -(key_RIGHT / 4) ;
         break;
     case Canvas.GAME_A:
      key_A = 0 ;
         break;
     case Canvas.GAME_B:
      key_B = 0 ;
         break;
     case Canvas.GAME_C:
      key_C = 0 ;
         break;
     case Canvas.GAME_D:
      key_D = 0 ;
         break;
     case 0:
     switch (keyCode) {
      case Canvas.KEY_NUM2:
       upvalue = -(key_UP / 4) ;
          break;
      case Canvas.KEY_NUM8:
       downvalue = -(key_DOWN / 4) ;
          break;
         case Canvas.KEY_NUM4:
       leftvalue = -(key_LEFT / 4) ;
          break;
         case Canvas.KEY_NUM6:
       rightvalue = -(key_RIGHT / 4) ;
          break;
      case Canvas.KEY_POUND:
       key_POUND = 0 ;
          break;
      case Canvas.KEY_STAR:
       key_STAR = 0 ;
          break;
        }
        break;
    }
    }

}

import java.lang.*;
import java.io.*;
import java.util.*;
import javax.microedition.lcdui.*;

public class gCanvas extends Canvas implements Runnable {

private Graphics bgGraphics;
private Image bgBuf;
private int width ;
private int height ;
private int dfwidth ;
private int dfheight ;
private int snoffx ;
private int snoffy ;
private boolean isOver;
private boolean isFirstRun ;
public gKey keyParam ;
public int thDelay ;
private Thread mThread ;


// test
private int x,y ;

public gCanvas (int w,int h,int keytimer,int thdelay)
{
  try{
   width = getWidth() ;
   height = getHeight() ;
   dfwidth = w ;
   dfheight = h ;
   isFirstRun = true ;
   snoffx = ( width - dfwidth ) / 2 ;
   snoffy = ( height - dfheight ) / 2 ;
   isOver = false ;
   bgBuf = Image.createImage ( dfwidth, dfheight ) ;
   bgGraphics = bgBuf.getGraphics() ;
   mThread = new Thread(this) ;
   x = 0 ;
   y = 0 ;
   keyParam = new gKey ( keytimer) ;
   thDelay = thdelay ;  
   // test
  }
  catch(Exception ex){
   isOver = true ;
  }
  
}


public void OverProcess ()
{
  isOver = true ;
  // add destroy code
}

public void run ()
{
  try{
   while ( !isOver )
   {
    // add execute code
    if ( keyParam.key_A > 0 ){
     keyParam.refreshKey() ;  // 键按下后只响应一次要调用这个函数
     OverProcess() ;
    }
    
    if ( y > 0 ) y -= keyParam.key_UP ;
    if ( y < width - 32 ) y += keyParam.key_DOWN ;//这里读出来的值不是顾定的,你按的越长值越大,上限是keytime,表示加速度,当你松开键时这里的值不会马上为0,但是会很快变成0,表示惯性
    if ( x > 0 ) x -= keyParam.key_LEFT ;
    if ( x < height - 32 ) x += keyParam.key_RIGHT ;
    keyParam.flushKey() ;
    
    
    repaint() ;
    mThread.sleep(thDelay);
   }
  }
  catch(Exception ex)
  {}
}

public void paint (Graphics g)
{
  // clear screen
  if ( isFirstRun == true ){
   g.setColor(0) ;
   g.fillRect ( 0 , 0 , width , height ) ;
  }
  
  
  // add draw function

  g.drawImage (bgBuf,snoffx,snoffy,g.LEFT|g.TOP) ;
}


    public void keyPressed(int keyCode) {
     keyParam.keyPressed(keyCode,this) ;
    }


    public void keyReleased(int keyCode) {
     keyParam.keyReleased(keyCode,this) ;
    }

}



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=745631


基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值