actor.java~1~
来自「基于J2ME的手机游戏软件。可以控制游戏人物在地图上上下左右行走;可以在地图上放」· JAVA~1~ 代码 · 共 539 行
JAVA~1~
539 行
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Canvas;
public class Actor implements Runnable
{
public static final int REMAIN_CYC = 40;
public static final int MAX_POWER = 10;
public static final int MAX_BOMB_NUM = 10;
public static final int UP = Canvas.UP;
public static final int DOWN = Canvas.DOWN;
public static final int LEFT = Canvas.LEFT;
public static final int RIGHT = Canvas.RIGHT;
public static final int FIRE = Canvas.FIRE;
public static final int DIR_STATIC = 0;
public static final int DIR_UP = 1;
public static final int DIR_DOWN = 2;
public static final int DIR_LEFT = 3;
public static final int DIR_RIGHT = 4;
public static final int STATE_INIT = 1;
public static final int STATE_PLAYING = 2;
public static final int STATE_END = 3;
private int posX;
private int posY;
private int step;
private int width;
private int height;
private World world;
private boolean live;
private boolean disuse;
private int direction;
private ImageSet imageSet;
private Sprite sprite;
private boolean isPause;
private int state;
private int power;
private int bombNum;
private int bodyRemainCyc;
public Actor(World world,int x,int y)
{
this.world = world;
step = 4;
width = 24;
height = 32;
imageSet = world.getImageSet();
sprite = new Sprite(imageSet,world.ACTOR_STATIC,0);
isPause = false;
power = 1;
bombNum = 1;
init(x,y);
state = STATE_INIT;
}
public void init(int x,int y)
{
posX = x;
posY = y;
live = true;
disuse = false;
direction = DIR_STATIC;
sprite.setCurrentState(world.ACTOR_STATIC,true);
bodyRemainCyc = REMAIN_CYC;
}
public void start()
{
if(state == STATE_INIT || state == STATE_END)
{
Thread t = new Thread(this);
t.start();
// System.out.println("k");
}
state = STATE_PLAYING;
}
private void swerve(int dir) //平滑转向
{
int x = posX;
int y = posY;
int tileX_1 = -1;
int tileY_1 = -1;
int tileX_2 = -1;
int tileY_2 = -1;
// int[][] bufMap = world.getMap();
switch(dir)
{
case UP:
y = y - step;
tileY_1 = x / world.getTileWidth();
tileX_1 = y / world.getTileHeight();
tileY_2 = (x + width) / world.getTileWidth();
tileX_2 = y / world.getTileHeight();
if(world.canAcross(tileX_1,tileY_1,true)
&& !world.canAcross(tileX_2,tileY_2,true)
&& (posX + width / 2) < tileY_2 * world.getTileWidth())
{
left();
}
else if(!world.canAcross(tileX_1,tileY_1,true)
&& world.canAcross(tileX_2,tileY_2,true)
&& (posX + width / 2) > tileY_1
* world.getTileWidth() + world.getTileWidth())
{
right();
}
break;
case DOWN:
y = y + step;
tileY_1 = x / world.getTileWidth();
tileX_1 = (y + height) / world.getTileWidth();
tileY_2 = (x + width) / world.getTileWidth();
tileX_2 = (y + height) / world.getTileHeight();
if(world.canAcross(tileX_1,tileY_1,true)
&& !world.canAcross(tileX_2,tileY_2,true)
&& (posX + width / 2) < tileY_2 * world.getTileWidth())
{
left();
}
else if(!world.canAcross(tileX_1,tileY_1,true)
&& world.canAcross(tileX_2,tileY_2,true)
&& (posX + width / 2) > tileY_1
* world.getTileWidth() + world.getTileWidth())
{
right();
}
break;
case LEFT:
x = x - step;
tileY_1 = x / world.getTileWidth();
tileX_1 = y / world.getTileHeight();
tileY_2 = x / world.getTileWidth();
tileX_2 = (y + height) / world.getTileHeight();
if(world.canAcross(tileX_1,tileY_1,true)
&& !world.canAcross(tileX_2,tileY_2,true)
&& (posY + height / 2) < tileX_2 * world.getTileHeight())
{
up();
}
else if(!world.canAcross(tileX_1,tileY_1,true)
&& world.canAcross(tileX_2,tileY_2,true)
&& (posY + height / 2) > tileX_1
* world.getTileHeight() + world.getTileHeight())
{
down();
}
break;
case RIGHT:
x = x + step;
tileY_1 = (x + width) / world.getTileWidth();
tileX_1 = y / world.getTileHeight();
tileY_2 = (x + width) / world.getTileWidth();
tileX_2 = (y + height) / world.getTileHeight();
if(world.canAcross(tileX_1,tileY_1,true)
&& !world.canAcross(tileX_2,tileY_2,true)
&& (posY + height / 2) < tileX_2 * world.getTileHeight())
{
up();
}
else if(!world.canAcross(tileX_1,tileY_1,true)
&& world.canAcross(tileX_2,tileY_2,true)
&& (posY + height / 2) > tileX_1
* world.getTileHeight() + world.getTileHeight())
{
down();
}
break;
}
}
public void cycle()
{
if(live)
{
sprite.cycle();
}
else if(!disuse)
{
bodyRemainCyc--;
if(bodyRemainCyc < 0)
{
disuse = true;
}
// System.out.println(bodyRemainCyc);
}
}
public void render(Graphics gra)
{
// gra.setColor(0xff00ff);
// gra.fillRect(posX - world.getViewX(),posY - world.getViewY(),width,height);
if(live)
{
sprite.draw(gra,posX - world.getViewX()
,posY - world.getViewY()
,Graphics.TOP|Graphics.LEFT);
gra.setColor(0xff0000);
gra.drawRect(posX - world.getViewX(),posY - world.getViewY()
,width - 1,height - 1);
}
else if(!disuse)
{
imageSet.draw(gra,world.ACTOR_DEAD,0,posX - world.getViewX()
,posY - world.getViewY()
,Graphics.TOP|Graphics.LEFT);
}
}
public void up()
{
if(!collidesDetect(posX,posY - step))
{
posY = posY - step;
}
else
{
swerve(UP);
}
}
public void down()
{
if(!collidesDetect(posX,posY + step))
{
posY = posY + step;
}
else
{
swerve(DOWN);
}
}
public void right()
{
if(!collidesDetect(posX + step,posY))
{
posX = posX + step;
}
else
{
swerve(RIGHT);
}
}
public void left()
{
if(!collidesDetect(posX - step,posY))
{
posX = posX - step;
}
else
{
swerve(LEFT);
}
}
public void fire()
{
putBomb(world.getMap());
}
public int getX()
{
return posX;
}
public int getY()
{
return posY;
}
public void setX(int x)
{
posX = x;
}
public void setY(int y)
{
posY = y;
}
public int getStep()
{
return step;
}
public void dead()
{
live = false;//释放ACTOR线程
}
//Collides detect with map[][]
private boolean collidesDetect(int x,int y)
{
int x1 = x;
int y1 = y;
int x2 = x1 + width - 1;
int y2 = y1;
int x3 = x1 + width - 1;
int y3 = y1 + height - 1;
int x4 = x1;
int y4 = y1 + height - 1;
int tileX = -1;
int tileY = -1;
int tileH = world.getTileHeight();
int tileW = world.getTileWidth();
//detected up-left
tileX = y1 / tileH;
tileY = x1 / tileW;
if(!world.canAcross(tileX,tileY,true))
{
// System.out.println("1");
return true;
}
tileX = y2 / tileH;
tileY = x2 / tileW;
if(!world.canAcross(tileX,tileY,true))
{
// System.out.println("2");
return true;
}
tileX = y3 / tileH;
tileY = x3 / tileW;
if(!world.canAcross(tileX,tileY,true))
{
// System.out.println("3");
return true;
}
tileX = y4 / tileH;
tileY = x4 / tileW;
if(!world.canAcross(tileX,tileY,true))
{
// System.out.println("4");
return true;
}
return false;
}
public void keyPressed(int key)
{
if(live && !isPause && world.getDrawState() == world.DRAW_STATE_GAME)
{
switch(key)
{
case UP:
direction = DIR_UP;
sprite.setCurrentState(world.ACTOR_RUN_UP,true);
break;
case DOWN:
direction = DIR_DOWN;
sprite.setCurrentState(world.ACTOR_RUN_DOWN,true);
break;
case RIGHT:
direction = DIR_RIGHT;
sprite.setCurrentState(world.ACTOR_RUN_RIGHT,true);
break;
case LEFT:
direction = DIR_LEFT;
sprite.setCurrentState(world.ACTOR_RUN_LEFT,true);
break;
case FIRE:
fire();
break;
}
}
}
public void keyReleased(int key)
{
if(live && !isPause)
{
switch(key)
{
case UP:
if(direction == DIR_UP)
{
direction = DIR_STATIC;
sprite.setCurrentState(world.ACTOR_STATIC,true);
}
break;
case DOWN:
if(direction == DIR_DOWN)
{
direction = DIR_STATIC;
sprite.setCurrentState(world.ACTOR_STATIC,true);
}
break;
case RIGHT:
if(direction == DIR_RIGHT)
{
direction = DIR_STATIC;
sprite.setCurrentState(world.ACTOR_STATIC,true);
}
break;
case LEFT:
if(direction == DIR_LEFT)
{
direction = DIR_STATIC;
sprite.setCurrentState(world.ACTOR_STATIC,true);
}
break;
}
}
}
public void run()
{
while(live)
{
if(!isPause)
{
if(direction != DIR_STATIC)
{
switch(direction)
{
case DIR_UP:
up();
break;
case DIR_DOWN:
down();
break;
case DIR_LEFT:
left();
break;
case DIR_RIGHT:
right();
break;
}
}
try
{
Thread.sleep(50);
}
catch(InterruptedException ie)
{
System.out.println("error!");
}
}
if(isPause)
{
try
{
Thread.sleep(1000);
}
catch(InterruptedException ie)
{
}
}
}
state = STATE_END;
// System.out.println("s");
}
public void pause()
{
isPause = true;
}
public void resume()
{
isPause = false;
}
private void putBomb(int[][] map)
{
if(world.getBombNum() < bombNum)
{
int tileY = (posX + width / 2) / world.getTileWidth();
int tileX = (posY + height / 2) / world.getTileHeight();
if(world.canAcross(tileX,tileY,false))
{
world.addBomb(tileY * world.getTileHeight(),tileX * world.getTileWidth(),power);
// System.out.println(tileX + " " + tileY);
// System.out.println(posX + " " + posY);
}
}
}
public int getWidth()
{
return width;
}
public int getHeight()
{
return height;
}
public boolean isLive()
{
return live;
}
public void setLive()
{
live = true;
}
public boolean isDisuse()
{
return disuse;
}
public void addPower()
{
if(power < MAX_POWER)
{
power++;
}
}
public void addBombNum()
{
if(bombNum < MAX_BOMB_NUM)
{
bombNum++;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?