⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bttalker.java

📁 j2me的手机源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    }

    length = (buf[0] << 8 & 0xFF) | (buf[1] & 0xFF);
    length = length - 2;
    if (length < 0) {
      System.out.println("Dropped adj len=" + length);
      return;
    }

    byte tmp[] = new byte[length];
    for (int i=0; i < length; i++) {
      tmp[i] = buf[i+2];
    }
    synchronized (receiveDataStack) {
      receiveDataStack.addElement(tmp);
      receiveDataStack.notify();
    }
    tmp = null;
  }

  // Read a single byte, blocks if data not available
  private byte read()
  {
    byte rc;
    while (true)
    {
      if (receiveBuf != null)
      {
        rc = receiveBuf[receiveIndex++];
        if (receiveIndex >= receiveBuf.length) {
          receiveBuf = null;
        }
        return rc;
      }
      synchronized (receiveDataStack) {
        while (receiveDataStack.size() == 0 )
        {
          try {
            receiveDataStack.wait();
          }
          catch (InterruptedException e) {}
        }
        receiveBuf = (byte []) receiveDataStack.elementAt(0);
        receiveDataStack.removeElementAt(0);
        receiveIndex = 0;
      }
    }
  }

  public void remoteSendHello()
  {
    if( observer.getState() != observer.CONNECT )
      return;
    byte buf[] = new byte[1];
    buf[0] = BTCMD_SAY_HELLO;
    System.out.println("Sending: Hello message");
    sendDataStack.addElement(buf);
    sendDataIfNecessary();
    buf = null;
    }

  public void remoteStart3DWorld()
  {
    if( observer.getState() != observer.CONNECT )
      return;
    byte buf[] = new byte[1];
    buf[0] = BTCMD_START_3D_WORLD;
    System.out.println("Sending: start 3D world");
    sendDataStack.addElement(buf);
    sendDataIfNecessary();
    buf = null;
    }

  public void remoteSendReady()
  {
    if( observer.getState() != observer.CONNECT )
      return;
    byte buf[] = new byte[1];
    buf[0] = BTCMD_READY_FOR_PLAY;
    System.out.println("Sending: ready for play");
    sendDataStack.addElement(buf);
    sendDataIfNecessary();
    amIReady = true;
    // in case avatar build itself up already
    if(avatarReady)
    {
      System.out.println("avatar already ready");
      observer.startMultiRace();
    }
    buf = null;
    System.gc();
  }

  private static byte mBufPosTab[] = new byte[29];
  public void remoteUpdateSpeedAndPos(Vector3D aMyCarPos, int aAngZ,
                                      Vector3D aMyCarSpeedVect,
                                      boolean aSignalColision)
  {
    if( observer.getState() != observer.CONNECT )
      return;
    if(aSignalColision)
      mBufPosTab[0] = BTCMD_COLISION_SIGNAL;
    else
      mBufPosTab[0] = BTCMD_UPDATE_SPEED_AND_POS;

    int a, b, c, d, tmp = 0, iter = 0;
    iter++;
    for( int i=0; i<5; ++i)
    {
      switch(i) {
        case 0 : tmp = aMyCarPos.x;        break;
        case 1 : tmp = aMyCarPos.y;        break;
        case 2 : tmp = aAngZ;              break;
        case 3 : tmp = aMyCarSpeedVect.x;  break;
        case 4 : tmp = aMyCarSpeedVect.y;  break;
      }
      a = (tmp & 0xFF000000);
      b = (tmp & 0x00FF0000);
      c = (tmp & 0x0000FF00);
      d = (tmp & 0x000000FF);
      a = (a >> 24);
      b = (b >> 16);
      c = (c >> 8);
      mBufPosTab[iter] = (byte)a; iter++;
      mBufPosTab[iter] = (byte)b; iter++;
      mBufPosTab[iter] = (byte)c; iter++;
      mBufPosTab[iter] = (byte)d; iter++;
    }
    write(mBufPosTab, 0, 21);
    sendTransmitBuf();
  }

  public void remoteSendColisionConfirm(Vector3D aMyCarPos, int aAngZ,
                                        Vector3D aMyCarSpeedVect,
                                        Vector3D aAvatarSpeedVect)
  {
    if( observer.getState() != observer.CONNECT )
      return;
    int a, b, c, d, tmp = 0, iter = 0;
    mBufPosTab[0] = BTCMD_COLISION_CONFIRM;
    iter++;
    for( int i=0; i<7; ++i)
    {
      switch(i) {
        case 0 : tmp = aMyCarPos.x;        break;
        case 1 : tmp = aMyCarPos.y;        break;
        case 2 : tmp = aAngZ;              break;
        case 3 : tmp = aMyCarSpeedVect.x;  break;
        case 4 : tmp = aMyCarSpeedVect.y;  break;
        case 5 : tmp = aAvatarSpeedVect.x; break;
        case 6 : tmp = aAvatarSpeedVect.y; break;
      }
      a = (tmp & 0xFF000000);
      b = (tmp & 0x00FF0000);
      c = (tmp & 0x0000FF00);
      d = (tmp & 0x000000FF);
      a = (a >> 24);
      b = (b >> 16);
      c = (c >> 8);
      mBufPosTab[iter] = (byte)a; iter++;
      mBufPosTab[iter] = (byte)b; iter++;
      mBufPosTab[iter] = (byte)c; iter++;
      mBufPosTab[iter] = (byte)d; iter++;
    }
    write(mBufPosTab, 0, 29);
    sendTransmitBuf();
  }

  public void remoteSendColisionNone(Vector3D aMyCarPos, int aAngZ, Vector3D aMyCarSpeedVect)
  {
    if( observer.getState() != observer.CONNECT )
      return;
    int a, b, c, d, tmp = 0, iter = 0;
    mBufPosTab[0] = BTCMD_COLISION_NONE;
    iter++;
    for( int i=0; i<5; ++i)
    {
      switch(i) {
        case 0 : tmp = aMyCarPos.x;        break;
        case 1 : tmp = aMyCarPos.y;        break;
        case 2 : tmp = aAngZ;              break;
        case 3 : tmp = aMyCarSpeedVect.x;  break;
        case 4 : tmp = aMyCarSpeedVect.y;  break;
      }
      a = (tmp & 0xFF000000);
      b = (tmp & 0x00FF0000);
      c = (tmp & 0x0000FF00);
      d = (tmp & 0x000000FF);
      a = (a >> 24);
      b = (b >> 16);
      c = (c >> 8);
      mBufPosTab[iter] = (byte)a; iter++;
      mBufPosTab[iter] = (byte)b; iter++;
      mBufPosTab[iter] = (byte)c; iter++;
      mBufPosTab[iter] = (byte)d; iter++;
    }
    write(mBufPosTab, 0, 21);
    sendTransmitBuf();
  }

  private void sendDataIfNecessary()
  {
    byte tmp[];
    if( observer.getState() == observer.CONNECT )
    {
      try {
        // Send Drawing messages to peer
        while (sendDataStack.size() > 0)
        {
          tmp = (byte []) sendDataStack.elementAt(0);
          write(tmp, 0, tmp.length);
          sendDataStack.removeElementAt(0);
          tmp = null;
        }
        flush();
      }
      catch (Exception e) {
        System.out.println("ERROR BTTalker::sendDataIfNecessary(): " + e);
      }
    }
  }

  public void write(byte buf[], int offset, int length)
  {
    synchronized (transmitBuffer)
    {
      for (int i = 0; i < length; i++)
      {
        transmitBuffer[transmitIndex++] = buf[offset+i];
        if( transmitIndex >= transmitBuffer.length )
          sendTransmitBuf();
      }
    }
  }

  public void flush()
  {
    synchronized (transmitBuffer)
    {
      // If there is data to send, then send it!
      if (transmitIndex > 2)
        sendTransmitBuf();
    }
  }

  private void sendTransmitBuf()
  {
    if(conn == null)
      return;
    try {
      synchronized (transmitBuffer)
      {
        // Store the length in the first two bytes of the array
        transmitBuffer[0] = (byte) (transmitIndex >> 8 & 0xFF);
        transmitBuffer[1] = (byte) (transmitIndex & 0xFF);
        conn.send(transmitBuffer);
        transmitIndex = 2;
      }
    }
    catch (IOException e) {
      System.out.println("ERROR: conn.send: " + e);
    }
  }

  public void stopBeingActive()
  {
    sendDataStack.removeAllElements();
    mBtReceiver = null;
    mBtReader = null;
    System.gc();
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -