📄 panda.java
字号:
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class Panda{
public static final byte CLIPW = 54,CLIPH = 30;
public static final byte[][] IMGCLIP = {
{0,0,24,29},
{24,0,24,29},
{48,0,24,29},
{72,0,32,29},
{0,29,39,30},
{39,29,30,30},
};
// 横向加速度,横向摩擦系数,横向最高速
public static final int AX = 2,RUB = 1,MAXSPEEDX = AX*8;
// 跳跃初速度
public static final byte JUMPV0 = -30;
// 坐标和宽高
int x,y,width = 12,height = 30;
// 方向
byte direction;
// 横向速度,纵向速度
int speedX,speedY;
// 是否已起跳
boolean isJump;
// 在空中滞留时间,用来计算抛物线
int cnt_JumpTime;
// 目前所处地平线
int skyLine;
// 跳台左边界和右边界
int leftX = -1,rightX = -1;
int frame;
int transform;
static Image img;
public Panda() {
img = PandaCanvas.img_Panda;
}
// 维护移动数据
public final void setMove(){
// 如果已起跳,则处理碰撞,计算坐标
if(isJump){
cnt_JumpTime ++;
speedY += PandaCanvas.G;
if(!isVCollidesWithBarrier()){
if(y >= PandaCanvas.skyLine-height-speedY){
y = PandaCanvas.skyLine-height;
skyLine = y + height;
leftX = -1;
rightX = -1;
isJump = false;
cnt_JumpTime = 0;
}else
y += speedY;
}
}
// 不写这一句在一格空缺的障碍物上掉不下来,至于为什么我也没搞清楚,是调试出来的
isHCollidesWithBarrier();
// 根据横向的方向,处理碰撞,计算坐标
switch(direction)
{
case PandaCanvas.DIR_NONE:
frame = 0;
if(speedX >= RUB*AX){
speedX -= RUB*AX;
if(isHCollidesWithBarrier())
break;
}else if(speedX <= -RUB*AX){
speedX += RUB*AX;
if(isHCollidesWithBarrier())
break;
}
break;
case PandaCanvas.DIR_LEFT:
frame = PandaCanvas.m_Cnt_Time%3;
if(speedX > -MAXSPEEDX)
speedX -= AX;
transform = PandaCanvas.TRANS_NONE;
if(isHCollidesWithBarrier())
break;
break;
case PandaCanvas.DIR_RIGHT:
frame = PandaCanvas.m_Cnt_Time%3;
if(speedX < MAXSPEEDX)
speedX += AX;
transform = PandaCanvas.TRANS_HORIZONTAL;
if(isHCollidesWithBarrier())
break;
break;
}
if(speedX < 0){
if(x <= -speedX)
x = 0;
else
x += speedX;
}else if(speedX > 0){
if(x >= PandaCanvas.mapW-width-speedX)
x = PandaCanvas.mapW-width;
else
x += speedX;
}
// 摄象机跟随
Camera.setFollow(this);
}
// 纵向碰撞处理
public final boolean isVCollidesWithBarrier(){
if(speedY != 0){
if(speedY < 0){
for(int i=0;i<PandaCanvas.collides.length;i++){
if(x + width < PandaCanvas.collides[i][0] || x > PandaCanvas.collides[i][0]+PandaCanvas.collides[i][2])
continue;
if(y < PandaCanvas.collides[i][1]+PandaCanvas.collides[i][3])
continue;
if(y + speedY <= PandaCanvas.collides[i][1]+PandaCanvas.collides[i][3]){
y = PandaCanvas.collides[i][1]+PandaCanvas.collides[i][3];
speedY = -speedY/2;
cnt_JumpTime = 0;
return true;
}
}
}else{
for(int i=0;i<PandaCanvas.collides.length;i++){
if(x + width < PandaCanvas.collides[i][0] || x > PandaCanvas.collides[i][0]+PandaCanvas.collides[i][2])
continue;
if(y + height > PandaCanvas.collides[i][1])
continue;
if(y + height + speedY >= PandaCanvas.collides[i][1]){
y = PandaCanvas.collides[i][1] - height;
skyLine = y + height;
leftX = PandaCanvas.collides[i][0];
rightX = PandaCanvas.collides[i][0]+PandaCanvas.collides[i][2];
cnt_JumpTime = 0;
speedY = 0;
isJump = false;
return true;
}
}
}
}
return false;
}
// 横向碰撞处理
public final boolean isHCollidesWithBarrier(){
if(speedX != 0){
if(speedX > 0){
for(int i=0;i<PandaCanvas.collides.length;i++){
if(y + height < PandaCanvas.collides[i][1] || y > PandaCanvas.collides[i][1]+PandaCanvas.collides[i][3])
continue;
if(x+width > PandaCanvas.collides[i][0])
continue;
if(x+width+speedX >= PandaCanvas.collides[i][0]){
x = PandaCanvas.collides[i][0] - width - 1;
speedX = 0;
if(speedY < 0)
speedY = 0;
return true;
}
}
}else{
for(int i=0;i<PandaCanvas.collides.length;i++){
if(y + height < PandaCanvas.collides[i][1] || y > PandaCanvas.collides[i][1]+PandaCanvas.collides[i][3])
continue;
if(x < PandaCanvas.collides[i][0]+PandaCanvas.collides[i][2])
continue;
if(x+speedX <= PandaCanvas.collides[i][0]+PandaCanvas.collides[i][2]){
x = PandaCanvas.collides[i][0]+PandaCanvas.collides[i][2] + 1;
speedX = 0;
if(speedY < 0)
speedY = 0;
return true;
}
}
}
}
if(leftX != -1 && rightX != -1 && !isJump){
if(x+width < leftX || x > rightX){
isJump = true;
}
}
return false;
}
public final void paint(Graphics g){
g.drawRegion(img,IMGCLIP[frame][0],IMGCLIP[frame][1],IMGCLIP[frame][2],IMGCLIP[frame][3],transform,x-5-Camera.x,y-Camera.y,0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -