📄 pandacanvas.java
字号:
import java.io.IOException;
import java.util.Vector;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
public class PandaCanvas extends Canvas{
// MIDP2.0按键数值
public static final byte AVK_UP = -1;
public static final byte AVK_DOWN = -2;
public static final byte AVK_LEFT = -3;
public static final byte AVK_RIGHT = -4;
public static final byte AVK_SELECT = -5;
public static final byte AVK_SOFT1 = -6;
public static final byte AVK_SOFT2 = -7;
public static final byte AVK_C = -8;
public static final byte AVK_BACK = -11;
public static final byte AVK_0 = 48;
public static final byte AVK_1 = 49;
public static final byte AVK_2 = 50;
public static final byte AVK_3 = 51;
public static final byte AVK_4 = 52;
public static final byte AVK_5 = 53;
public static final byte AVK_6 = 54;
public static final byte AVK_7 = 55;
public static final byte AVK_8 = 56;
public static final byte AVK_9 = 57;
public static final byte AVK_STAR = 42;
public static final byte AVK_POUND = 35;
// MIDP2.0API翻转参数
public static final int TRANS_NONE = Sprite.TRANS_NONE;
public static final int TRANS_ROT90 = Sprite.TRANS_ROT90;
public static final int TRANS_ROT180 = Sprite.TRANS_ROT180;
public static final int TRANS_ROT270 = Sprite.TRANS_ROT270;
public static final int TRANS_HORIZONTAL = Sprite.TRANS_MIRROR;
public static final int TRANS_VERTICAL = Sprite.TRANS_MIRROR_ROT180;
// 方向常量
public static final byte DIR_NONE = -1;
public static final byte DIR_UP = 0;
public static final byte DIR_LEFT = 1;
public static final byte DIR_DOWN = 2;
public static final byte DIR_RIGHT = 3;
// 云的宽度和高度
public static int CLOUDW,CLOUDH;
// 云数据
public static int[][] CLOUD;
// 屏幕宽高
public static int SCREENW,SCREENH;
// 重力加速度(修正)
public static byte G = 6;
public static Panda panda;
public PandaMIDlet m_Mid;
public Thread t;
// 线程控制开关
public boolean m_IsThreadRun = true;
// 游戏时间统计
static int m_Cnt_Time;
// 地图列数、行数、宽度、高度
public static int mapCol,mapRow,mapW,mapH;
// 地平线高度
public static int skyLine;
// 键值
int m_KeyCode;
// 关卡ID
int m_Level = 0;
// 障碍物数据
public static int[][] collides;
public static int[][] barrier;
// 云图片
public static Image img_Cloud;
public static Image img_Panda;
public static Image img_Barrier;
public PandaCanvas(PandaMIDlet mid) {
setFullScreenMode(true);
m_Mid = mid;
// 获得屏幕宽高
SCREENW = getWidth();
SCREENH = getHeight();
Camera.width = SCREENW;
Camera.height = SCREENH;
initRes();
// 游戏主线程
t = new Thread(){
public void run(){
while(m_IsThreadRun){
setOption();
panda.setMove();
repaint();
m_Cnt_Time++;
try {
sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
}
// 创建图片
public static final Image createImage(String name){
if(name == null)
return null;
Image o_Img = null;
try {
o_Img = Image.createImage(name);
} catch (IOException e) {
e.printStackTrace();
}
return o_Img;
}
// 游戏数据初始化
public void initRes(){
img_Panda = createImage("/panda.png");
img_Barrier = createImage("/barrier.png");
img_Cloud = createImage("/cloud.png");
m_Cnt_Time = 0;
panda = new Panda();
CLOUDW = img_Cloud.getWidth();
CLOUDH = img_Cloud.getHeight();
setLevel(0);
}
// 关卡数据初始化,参数代表第几关
public void setLevel(int level){
m_Level = level;
switch(level)
{
case 0:
// 加载第一关地图!
barrier = new int[][]{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1 }
};
CLOUD = new int[][]{
{-15,180},
{20,80},
{120,150},
{150,90},
{330,80},
{540,180},
{740,130},
{820,80},
{1060,130},
{1290,90},
{1360,140},
{1520,190},
};
mapCol = 100;
mapRow = 20;
mapW = mapCol*16;
mapH = mapRow*16;
skyLine = mapH - 16;
panda.x = 150;
panda.y = skyLine-panda.height;
panda.skyLine = skyLine;
panda.frame = 0;
panda.transform = TRANS_HORIZONTAL;
// 设置镜头位置
Camera.init(panda);
Camera.y = mapH - Camera.height;
// 从障碍物数据中提取碰撞数据
Vector collidesManager = new Vector();
Vector barrierManager = new Vector();
for (int i = 0; i < mapRow; i++){
for(int j=0;j<mapCol;j++){
if(barrier[i][j] != 0){
if(i*16<skyLine){
if(j>1 && j != mapCol - 1 && !collidesManager.isEmpty() && barrier[i][j-1] != 0){
int[] lastCol = (int[])collidesManager.lastElement();
lastCol[2] += 16;
collidesManager.setElementAt(lastCol,collidesManager.size()-1);
}else{
collidesManager.addElement(new int[]{j<<4,i<<4,16,16,barrier[i][j]-1});
}
}
barrierManager.addElement(new int[]{j<<4,i<<4,barrier[i][j]-1});
}
}
}
collides = new int[collidesManager.size()][5];
collidesManager.copyInto(collides);
barrier = new int[barrierManager.size()][3];
barrierManager.copyInto(barrier);
collidesManager = barrierManager = null;
System.gc();
break;
}
}
public final void drawMap(Graphics g){
for(int i=0;i<barrier.length;i++){
if(barrier[i][0] > Camera.x + Camera.width
|| barrier[i][1] > Camera.y + Camera.height
|| barrier[i][0]+16 < Camera.x
|| barrier[i][1]+16 < Camera.y)
continue;
g.drawRegion(img_Barrier,barrier[i][2]*16,0,16,16,0,barrier[i][0]-Camera.x,barrier[i][1]-Camera.y,0);
}
}
// 画云
public final void drawCloud(Graphics g){
if(CLOUD == null)
return;
int cloudX = 0;
int cloudY = 0;
for(int i=0;i<CLOUD.length;i++){
cloudX = CLOUD[i][0] - Camera.x;
cloudY = CLOUD[i][1] - Camera.y;
if(cloudX+CLOUDW < 0 || cloudX> Camera.width)
continue;
if(cloudY+CLOUDH < 0 || cloudY> Camera.height)
continue;
g.drawImage(img_Cloud,cloudX,cloudY,0);
}
}
// 触发键盘按下事件
public void keyPressed(int keyCode){
m_KeyCode = keyCode;
}
// 触发键盘松开事件
public void keyReleased(int keyCode){
m_KeyCode = 0;
// 当松开左右方向键,熊猫方向为无
switch(keyCode)
{
case AVK_LEFT:
case AVK_4:
case AVK_RIGHT:
case AVK_6:
panda.direction = DIR_NONE;
break;
}
}
// 处理按键响应
public void setOption(){
switch(m_KeyCode)
{
case AVK_LEFT:
case AVK_4:
panda.direction = DIR_LEFT;
m_KeyCode = 0;
break;
case AVK_RIGHT:
case AVK_6:
panda.direction = DIR_RIGHT;
m_KeyCode = 0;
break;
case AVK_UP:
case AVK_2:
case AVK_3:
m_KeyCode = 0;
// 如果已经跳跃,则不响应
if(panda.isJump)
break;
// 如果速度不超过最大速度的一半,则小跳,否则进行大跳
if(getAbs(panda.speedX) <= Panda.MAXSPEEDX/2)
panda.speedY = Panda.JUMPV0;
else
panda.speedY = Panda.JUMPV0*4/3;
// 跳跃数据维护
panda.isJump = true;
panda.cnt_JumpTime = 0;
break;
case AVK_0:
exit();
break;
}
}
public void paint(Graphics g){
g.setColor(0x3FBFFF);
g.fillRect(0, 0, SCREENW,SCREENH);
drawCloud(g);
drawMap(g);
panda.paint(g);
}
// 退出游戏
public final void exit(){
m_IsThreadRun = false;
m_Mid.notifyDestroyed();
}
// 取绝对值
public final int getAbs(int num){
return num >= 0 ? num : -num;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -