Веб программирование

Sprite, TiledLayer, LayerManager в J2ME

 
 

Сегодня я покажу как использовать Sprite, TiledLayer, LayerManager и что это вообще такое.

Они находятся в пакете javax.microedition.icdui.game

Мы создадим простую игру, её цель - увернуться от врага. Возьмём предыдущий проект и добавим туда врага, нормальный фон и добавим цель игры.

Код Canv.java:

import javax.microedition.lcdui.game.*;
/*Здесь находятся такие классы, как Sprite, TiledLayer, LayerManager и т.д.*/
import javax.microedition.lcdui.*;

public class Canv extends Canvas{

public Game_Pause GP = new Game_Pause();
public Sprite Player,Enemy;
/*Объявляем 2 Sprite*/
public LayerManager LM;
/*LayerManager*/
public TiledLayer TL;
/*Фон будем делать с помощью TiledLayer*/
public int wid = getWidth();
public int hei = getHeight();
public int KeyFire = getKeyCode(FIRE);
public int KeyLeft = getKeyCode(LEFT);
public int KeyRight = getKeyCode(RIGHT);
public int KeyUp = getKeyCode(UP);
public int KeyDown = getKeyCode(DOWN);
public int PlayerX = getWidth()-43,EnemyX = 5;
public int PlayerY = 5,EnemyY = 5;
/*Добавляем переменные положения врага*/
public int g = 1;
public int ftr = 1;
public int f = 0,fenemy = 0;
public int f2 = 0,f2enemy = 0;
/*Добавляем переменные силы врага*/
public int MyKey = 0;
public long Score = 0;
/*Очки игрока*/

public Canv(){
try{
LM = new LayerManager();
Player = new Sprite(Image.createImage("/Player.png"),38,38);
/*Создаём Sprite игрока, конструктор - (Картинка,Ширина Frame,Высота Frame);
Если у вас картинка например 100х100 - то можно например создать Sprite, указав высоту и ширину
Frame - 50, эта картинка разрежется на 4 части и потом можно делать так MySprite.setFrame(0);
этот код поменяет фрагмент, который показывается в Sprite на 1 из 4, ещё есть
MySprite.nextFrame();
MySprite.prevFrame();
MySprite.setVisible(false); - скроет Sprite, true - покажет
и наконец MySprite.setPosition(X,Y);
*/
TL = new TiledLayer(6,8,Image.createImage("/Sky.png"),40,40);
/*TiledLayer - это просто набор ячеек, и в каждой ячейке своя картинка
конструктор - (Кол-во столбцов,Кол-во строк,Картинка,Ширина ячейки,Высота ячейки)
Тут картинка так же, как и в Sprite режется на части, и потом можно в каждой ячейке менять картинку*/
Player.setFrame(0);
Enemy = new Sprite(Image.createImage("/Enemy.png"),38,38);
Enemy.setFrame(0);
/*Когда всё готово добавляем это всё к LayerManager*/
LM.append(Player);
LM.append(Enemy);
LM.append(TL);
LM.setViewWindow(0,0,getWidth(),getHeight());
/*Изменяем размеры видимой части LayerManager*/
Player.setPosition(PlayerX,PlayerY);
Enemy.setPosition(EnemyX,EnemyY);
createSky();
/*Вызываем метод (он ниже), который заполнит ячейки*/
} catch (Exception e) {
}
}

public void createSky()
{
 for (int row=0;row<6; row++)
    {
for (int col=0; col<8; col++)
    {
    TL.setCell(row,col,1);
    }
}
}

public void paint(Graphics g){
LM.paint(g,0,0);
/*Здеся всё просто - (Графика,X,Y)*/
g.setColor(255,0,0);
g.drawString("Очки:" + Score, 20, 5, Graphics.HCENTER|Graphics.TOP);
Player_Move();
}

protected void keyPressed(int KeyCode){
MyKey = KeyCode;
}

protected void keyReleased(int KeyCode){
MyKey = 0;
}

public void Player_Move(){
if(MyKey==KeyUp){
f-=4;
}
if(MyKey==KeyDown){
f+=4;
}
if(MyKey==KeyLeft){
f2-=4;
}
if(MyKey==KeyRight){
f2+=4;
}
if(PlayerX>EnemyX){
f2enemy+=2;
}
if(PlayerX<EnemyX){
f2enemy-=2;
}
if(PlayerY>EnemyY){
fenemy+=2;
}
if(PlayerY<EnemyY){
fenemy-=2;
}
f+=g;
fenemy+=g;
if(f2>0){
f2-=ftr;
}
if(f2<0){
f2+=ftr;
}
/*То же самое, только для врага*/
if(f2enemy>0){
f2enemy-=ftr;
}
if(f2enemy<0){
f2enemy+=ftr;
}
PlayerY+=f;
EnemyY+=fenemy;
if(PlayerY>hei-38){
PlayerY=hei-38;
f=0;
}
if(PlayerY<0){
PlayerY=0;
f=0;
}
PlayerX+=f2;
if(PlayerX<0){
PlayerX=0;
f2=0;
}
if(PlayerX>wid-38){
PlayerX=wid-38;
f2=0;
}
/*То же самое, только для врага*/
if(EnemyY>hei-38){
EnemyY=hei-38;
fenemy=0;
}
if(EnemyY<0){
EnemyY=0;
fenemy=0;
}
EnemyX+=f2enemy;
if(EnemyX<0){
EnemyX=0;
f2enemy=0;
}
if(EnemyX>wid-38){
EnemyX=wid-38;
f2enemy=0;
}
if(Player.collidesWith(Enemy,true)){
/*Столкновения, MySprite.cillidesWith(MySprite2,truefalse) 2 аргумент говорит сравнивать попиксельно
или просто квадратами (кто из Visual Basic 6 - тот знает как неудобно делать там игру, потому что
без намудрённых функций там нельзя нормально вычислить столкносение например треугольников (в Image))
и эта функция вернёт truefalse, думаю понятно почему*/
PlayerX = getWidth()-43;
PlayerY = 5;
EnemyX = 5;
EnemyY = 5;
f=0;
f2=0;
fenemy = 0;
f2enemy = 0;
Score = 0;
/*Типо игрок проиграл жизнь, и возвращаем его обратно*/
}
Enemy.setPosition(EnemyX,EnemyY);
Player.setPosition(PlayerX,PlayerY);
/*Перемещаем Sprite*/
Score+=1;
/*Прибавляем очки*/
GP.sl(50);
repaint();
}

}

class Game_Pause extends Thread{
public Game_Pause(){}
public void sl(int ms){
try{Thread.sleep(ms);}
catch(InterruptedException e){}
}
}

Скачиваем картинки ниже или рисуем свои (Player.png,Enemy.png,Sky.png) и кидаем их в папку res нашего проекта

Картинки игрока и врага из моей игры M-lab на моём сайте

Скачать файл [3889 кб]

Код Main.java (здесь я изменил всего лишь 2 строки, и они не важны для игрового процесса, поэтому можете не переписывать, эти строки в startApp):

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class Main extends MIDlet implements CommandListener{

public Canv ca;
public Display d;
public Form f;
public static Main midlet;
public Command FormCmd;
public Command ExitCmd;
public Command CanvCmd;

public Main(){
midlet=this;
}

public void startApp() {
if(d == null){
FormCmd = new Command("Пауза", Command.ITEM, 1);
CanvCmd = new Command("В игру!", Command.ITEM, 1);
ExitCmd = new Command("Выход", Command.EXIT, 2);
f = new Form("Физика");
f.append("Цель этой игры - не дать противнику докоснуться до вас и продержаться как можно дольше.");
f.addCommand(CanvCmd);
f.addCommand(ExitCmd);
f.setCommandListener(this);
d = Display.getDisplay(this);
d.setCurrent(f);
}
}

public void commandAction(Command c,Displayable d2){
if(c==CanvCmd){
if(ca==null){
ca = new Canv();
ca.addCommand(FormCmd);
ca.addCommand(ExitCmd);
ca.setCommandListener(this);
}
d.setCurrent(ca);
}

if(c==FormCmd){
d.setCurrent(f);
}

if(c==ExitCmd){
destroyApp(true);
}

}

public void pauseApp() {
}

public void destroyApp(boolean u) {
notifyDestroyed();
}

}

Всё! Компилируем, запускаем, результат:

Скачать исходник [19.5 кб]


Есть вопросы? Спроси на нашем форуме!!
Нет комментариев

Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.