1.Bresenham 直线画法 改进版:
- /** *//**
- * Bresenham Line Algorithm
- * @param dashedMask 设置线型的虚线的间隔,为0则画实线。
- * @param lineWidth 设置线宽。
- * @param x1
- * @param y1
- * @param x2
- * @param y2
- */
- public static void bresenhamLine(Graphics g, int dashedMask, int lineWidth, int x1, int y1, int x2, int y2)
- ...{
- g.setColor( 0xFFFFFF );
- int x, y;
- int dx, dy;
- int incx, incy;
- int balance;
- int i = 0;
- if (x2 >= x1)
- ...{
- dx = x2 - x1;
- incx = 1;
- } else
- ...{
- dx = x1 - x2;
- incx = -1;
- }
- if (y2 >= y1)
- ...{
- dy = y2 - y1;
- incy = 1;
- } else
- ...{
- dy = y1 - y2;
- incy = -1;
- }
- x = x1;
- y = y1;
- if (dx >= dy)
- ...{
- dy <<= 1;
- balance = dy - dx;
- dx <<= 1;
- while (x != x2)
- ...{
- if ((i & dashedMask) == 0)
- g.fillRect(x, y, lineWidth, lineWidth);
- if (balance >= 0)
- ...{
- y += incy;
- balance -= dx;
- }
- balance += dy;
- x += incx;
- i++;
- }
- if ((i & dashedMask) == 0)
- g.fillRect(x, y, lineWidth, lineWidth);
- }
- else
- ...{
- dx <<= 1;
- balance = dx - dy;
- dy <<= 1;
- while (y != y2)
- ...{
- if ((i & dashedMask) == 0)
- g.fillRect(x, y, lineWidth, lineWidth);
- if (balance >= 0)
- ...{
- x += incx;
- balance -= dy;
- }
- balance += dx;
- y += incy;
- i++;
- }
- if ((i & dashedMask) == 0)
- g.fillRect(x, y, lineWidth, lineWidth);
- }
- }
2.绘制精灵飞行轨迹方法
使用示例
isFlyEnd=paintPicFly( g, sprite[y][x], sprite[y][x].getX(), sprite[y][x].getY(), x*RECT_W, y*RECT_H, 4 );
- /** *//**
- * 绘制精灵飞行轨迹
- * @param g
- * @param sprite
- * @param x1 起点
- * @param y1
- * @param x2 终点
- * @param y2
- * @param speed 速度
- * @return 是否飞行结束
- */
- public final boolean paintPicFly( Graphics g, Sprite sprite, int x1, int y1, int x2, int y2, int speed )
- ...{
- if( x1==x2 && y1==y2 )
- ...{
- sprite.paint(g);
- return true;
- }
- int x, y;
- int dx, dy;
- int incx, incy;
- int balance;
- int i = 0;
- if (x2 >= x1)
- ...{
- dx = x2 - x1;
- incx = 1;
- } else
- ...{
- dx = x1 - x2;
- incx = -1;
- }
- if (y2 >= y1)
- ...{
- dy = y2 - y1;
- incy = 1;
- } else
- ...{
- dy = y1 - y2;
- incy = -1;
- }
- x = x1;
- y = y1;
- if (dx >= dy)
- ...{
- dy <<= 1;
- balance = dy - dx;
- dx <<= 1;
- for( ; x!=x2; ) //while (x != x2)
- ...{
- if (balance >= 0)
- ...{
- y += incy;
- balance -= dx;
- }
- balance += dy;
- x += incx;
- i++;
- if ((i & speed) == 0 || i == speed )
- ...{
- paintPic( g, sprite, x, y );
- return false;
- }
- }
- if ((i & speed) == 0 || i == speed )
- ...{
- paintPic( g, sprite, x, y );
- }
- }
- else
- ...{
- dx <<= 1;
- balance = dx - dy;
- dy <<= 1;
- for( ; y!=y2; ) //while (y != y2)
- ...{
- if (balance >= 0)
- ...{
- x += incx;
- balance -= dy;
- }
- balance += dx;
- y += incy;
- i++;
- if ((i & speed) == 0 || i == speed )
- ...{
- paintPic( g, sprite, x, y );
- return false;
- }
- }
- if ((i & speed) == 0 || i == speed )
- ...{
- paintPic( g, sprite, x, y );
- }
- }
- return false;
- }
- void paintPic( Graphics g, Sprite sprite, int x, int y )
- ...{
- sprite.setPosition(x,y);
- sprite.paint(g);
- // g.setColor( 0xFF0000 );
- // g.fillRect(x, y, 1, 1);
- }
3.矩形碰撞检测
- /** *//**
- * 矩形碰撞检测
- * @param x1 矩形1左上角X坐标
- * @param y1 矩形1左上角y坐标
- * @param w1 矩形1宽
- * @param h1 矩形1高
- * @param x2 矩形2左上角y坐标
- * @param y2 矩形2左上角y坐标
- * @param w2 矩形2宽
- * @param h2 矩形2高
- * @return 是否碰撞
- */
- boolean isIntersect(int x1,int y1, int w1, int h1, int x2, int y2, int w2, int h2)
- ...{
- if( Math.abs(x2-x1) < (w1+w2)/2 && Math.abs(y2-y1) < (h1+h2)/2 )
- ...{
- return true;
- }
- else
- return false;
- }
- /以上方法是有问题的!请参看以下方法
- /**
- * 矩形碰撞检测
- * @param x1 矩形1左上角X坐标
- * @param y1 矩形1左上角y坐标
- * @param w1 矩形1宽
- * @param h1 矩形1高
- * @param x2 矩形2左上角x坐标
- * @param y2 矩形2左上角y坐标
- * @param w2 矩形2宽
- * @param h2 矩形2高
- * @return 是否碰撞
- */
- public static boolean isIntersect(int x1,int y1, int w1, int h1, int x2, int y2, int w2, int h2)
- {
- if( isIntersect(x1,y1,w1,h1,x2 ,y2) )
- return true;
- if( isIntersect(x1,y1,w1,h1,x2+w2,y2) )
- return true;
- if( isIntersect(x1,y1,w1,h1,x2+w2,y2+h2) )
- return true;
- if( isIntersect(x1,y1,w1,h1,x2 ,y2+h2) )
- return true;
- return false;
- }
- //判断一个点是否在一个矩形内部或者在这个矩形的边上
- private static boolean isIntersect(int x,int y, int w, int h, int px, int py)
- {
- if( px>=x&&px<=x+w && py>=y&&py<=y+h )
- return true;
- else
- return false;
- }
4.单Player播放MIDI
- static boolean m_isSoundOn;
- static boolean m_isMusicOn;
- static int m_currentSound;
- static int m_currentMIDIID;
- static javax.microedition.media.Player m_sound;
- static byte[][] s_soundData;
- static boolean s_isPlayMid = false;
- void LoadSound()
- ...{
- try
- ...{
- SetCurrentInputStream( new DataInputStream("".getClass().getResourceAsStream("/sou") ) );
- ReadOffsetTable();
- s_soundData = new byte[m_nDataBlocksCount][];
- byte[] buffer = new byte[ m_dataBlocksOffset[ m_nDataBlocksCount ] ];
- int[] header = m_dataBlocksOffset;
- ReadBytes(buffer);
- SetCurrentInputStream( null );
- System.gc();
- for (int i=0; i<m_nDataBlocksCount; i++)
- ...{
- int length = header[ i + 1 ] - header[ i ];
- if ( length > 0 )
- ...{
- s_soundData[i] = new byte[length];
- System.arraycopy( buffer, header[i], s_soundData[i], 0, length );
- }
- }
- header = null;
- buffer = null;
- System.gc();
- m_currentSound = -1;
- m_currentMIDIID = -1;
- }
- catch ( Exception e ) ...{ }
- }
- static void PlaySound(int id)
- ...{
- PlaySoundLoop(id,1);
- }
- static void PlaySoundLoop( int id, int loop )
- ...{
- if (id <= dSoundID.Sound_ID_TITLE) // midi
- ...{
- if (!m_isMusicOn)
- return;
- }
- else // wav
- ...{
- if (!m_isSoundOn && id != dSoundID.Sound_ID_MENUCONFIRM)
- return;
- }
- if (id == m_currentSound && m_sound!=null&& (m_sound.getState() == javax.microedition.media.Player.STARTED))
- return;
- else
- StopSound(id);
- try
- ...{
- InputStream is = new ByteArrayInputStream( s_soundData[id] );
- m_sound = javax.microedition.media.Manager.createPlayer(is, "audio/midi");
- m_sound.realize();
- m_sound.setLoopCount( loop );
- m_sound.start();
- m_currentSound = id;
- s_isPlayMid = false;
- }
- catch (Exception e) ...{ e.printStackTrace(); }
- }
- static void StopSound(int id)
- ...{
- try
- ...{
- if( m_sound == null )
- return;
- else
- ...{
- m_sound.deallocate();
- m_sound.close();
- m_sound = null;
- }
- }
- catch ( Exception e ) ...{ e.printStackTrace(); }
- }
- static void ResumeSound()
- ...{
- PlaySound( m_currentSound );
- }
5.从一张大图分割成小图
- try
- ...{
- img = Image.createImage("/pics/"+imgNum+".png");//将大图创建到临时Image对象中
- Graphics gn; //创建临时绘图设备
- for( int i=0; i<y_tile_sum; i++ )
- ...{
- for( int j=0; j<x_tile_sum; j++ )
- ...{
- img_tile[i][j] = Image.createImage(RECT_W, RECT_H); //创建小图的大小
- gn = img_tile[i][j].getGraphics(); //创建小图的大小的临时绘图设备
- //在该设备上绘制大图temp,但 绘图设备比较小,只有小图那么大,大图多余部分不会被绘制出来
- gn.drawImage(img, -j*RECT_W, -i*RECT_H, gn.LEFT|gn.TOP); //绘制大图时候的起点位置
- }
- }
- gn = null;
- System.gc(); //通知垃圾回收机制,在需要时候会进行垃圾回收
- }
- catch(Exception e)...{ e.printStackTrace(); }
6.j2me 保存记录
- final static String RECORD_FILENAME = "/assassin.sav";
- final static int RECORD_SIZE = 160;
- static byte s_recordData[] = new byte[RECORD_SIZE];
- public static void RecordStore(boolean save)
- ...{
- try
- ...{
- RecordStore rs = RecordStore.openRecordStore(RECORD_FILENAME, true);
- if (rs.getNumRecords() <= 0)
- ...{
- if (save)
- ...{
- rs.addRecord(s_recordData, 0, RECORD_SIZE);
- }
- else
- ...{
- rs.closeRecordStore();
- return;
- }
- }
- else if (save)
- ...{
- rs.setRecord(1, s_recordData, 0, RECORD_SIZE);
- }
- else
- ...{
- rs.getRecord(1, s_recordData, 0);
- }
- rs.closeRecordStore();
- rs = null;
- }
- catch (Exception e)
- ...{
- }
- }