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

Делаем простую физику J2ME

 
 

Думаю по названию вы догадались о чем будет этот урок, но это не всё, наверно вы заметили из прошлых уроков, что в графическом классе при нажатии на кнопку игрок двигается один раз по направлению - и всё, чтобы двигать игрока пока нажата клавиша есть зацикливание (можно реализовать с помощью нового потока, но я решил сделать так).

Вот код файла Canv.java:

import javax.microedition.lcdui.*;
public class Canv extends Canvas{

public Game_Pause GP = new Game_Pause();
/*Инициализирем второй класс, который будет создавать паузу в цикле*/
public Image Player;
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 = 50;
public int PlayerY = 50;
public int g = 1;
/*Ускорение свободного падения, округлил до 10, а 10 - это слишком много для экрана
телефона, поэтому 1 :)*/
public int ftr = 1;
/*Типо сила трения, не буду писать большой код, поэтому у меня она будет действовать
даже в воздухе*/
public int f = 0;
/*Это сила, которая тянет игрока или просто его скорость (вверх или вниз)*/
public int f2 = 0;
/*То же, только для оси X*/
public int MyKey = 0;
/*Переменная для кода нажатой клавиши*/

public Canv(){
try{Player = Image.createImage("/Player.png");
} catch (Exception e) {}
}

public void paint(Graphics g){
g.setColor(255,100,0);
g.fillRect(0,0,wid,hei);
g.drawImage(Player,PlayerX,PlayerY,20);
Player_Move();
/*Зацикливаем приложение (здесь запускаем Player_Move(), а в том методе опять
запускаем paint(Graphics g))*/
}

protected void keyPressed(int KeyCode){
if(KeyCode==KeyFire){
Main.midlet.destroyApp(true);
}
/*Если клавиша не равна ОГОНЬ - то присваиваем переменной кода клавиши код
нажатой клавиши*/
MyKey = KeyCode;
/*Внимание!!! не пытайтесь нажать сразу 2 клавиши, такое возможно реализовать, но
я решил для простоты сделать так*/
}

protected void keyReleased(int KeyCode){
MyKey = 0;
/*Если пользователь отжал кнопку - то присваиваем 0 переменной кода клавиши*/
}

public void Player_Move(){
if(MyKey==KeyUp){
f-=2;
}
if(MyKey==KeyDown){
f+=2;
}
if(MyKey==KeyLeft){
f2-=2;
}
if(MyKey==KeyRight){
f2+=2;
}
f+=g;
/*Дальше учитываем силу трения*/
if(f2>0){
f2-=ftr;
}
if(f2<0){
f2+=ftr;
}
PlayerY+=f;
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;
}
GP.sl(50);
repaint();
}

}

/*Создаём класс внутри другого класса, он будет делать задержку главного
потока приложения, проще говоря будет делать паузу*/
class Game_Pause extends Thread{
public Game_Pause(){}
public void sl(int ms){
/*У класса Thread есть метод sleep(int ms), это задержка, 1с = 1000*/
try{Thread.sleep(ms);}catch(InterruptedException e){}
}
}

А в Main.java я решил стереть всё лишнее:

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.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();}

}

Теперь компилируем, запускаем, вот  результат

Исходники:

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


Есть вопросы? Спроси на нашем форуме!!
EverybodyLies280 [04.04.2013 21:51]

Это 'скорее' математика, а не физика.

Mishin870390 [04.04.2013 22:11]

ну не знаю, может я не использовал формулы, но получается нормально



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




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