В этом вебинаре вы узнаете как создавать настоящие трехмерные игры с момощью современной реализации Mobile Java JSRs на телефонах Nokia Series 40 семейства Asha. Мы ознакомим с деталями процесса создания 3D игр: планирование и построение игровых уровней; освещение и уровень реализма; сравнение создания игровых персонажей вручную и с помощью пакетов трехмерного моделирования; анимация и поведение игровых персонажей; решения менеджмента памяти и текстур; стратегии пользовательского ввода; оптимизирование исполнения программ для различных ориентаций экранов и моделей телефонов. Обзор скорости трехмерной графики на различных телефонах Nokia Series 40 семейства Asha.
Il pattern mvvm come strutturare al meglio il vostro progetto
Введиние в разработку 3D игр для Nokia Asha телефонов
1. Series 40 Developer Training
Введение в разработку 3D игр для
Nokia Asha телефонов
Michael Samarin, Ph.D
Director,
Developer Training and Evangelism
Futurice Oy
2. Восстановить
интерес к
Привлечь Mobile Java
Обзор 3D
внимание к 3D Краткий
Примеров в
3D API для JSR-184 JSR-184
NetBeans и
Nokia (M3G) (M3G)
Nokia SDK
Series 40 для тур
1.1 for Java
(Asha) создания
игр
3. Series 40
» 675 Миллионов устройств
» 3.9 Миллионов скачиваний ежедневно
» Ценовые категории 35 – 140 Евро
» Игровые студии с которыми придется соревноваться: EA,
Gameloft, Rovio, India Games
8. › Объектно-Ориентированное 3D
› Основано на Scene Graph
JSR-184 › Один из MIDP JSR
› Очень компактное API
M3G › Быстрый цикл разработки
› Оптимизировано для небольшого
объема памяти и бюджетных CPU
› Отличная реализация на Series 40
10. Компактное API, всего 30 классов
AnimationController IndexBuffer RayIntersection
AnimationTrack KeyframeSequence SkinnedMesh
Appearance Light Sprite3D
Background Loader Texture2D
Camera Material Transform
CompositingMode Mesh Transformable
Fog MorphingMesh TriangleStripArray
Graphics3D Node VertexArray
Group Object3D VertexBuffer
Image2D PolygonMode World
11. › Immediate mode
› Аналогичен по идеологии
OpenGL
› Retained mode
Режимы › Основан на Scene Graph
(modes) › Весь Scene Graph может быть
сохранен в / загружен из файла
› Полноценно описан M3G
формат
› Режимы могут быть свободно
использоваться
одновременно
12. Scene Graph
Background Mesh
Group Morphing Mesh
World Skinned Mesh
Sprite 3D
Group
Sprite 3D User Object
Group Camera
Light
13. › World
› Задний план (Background)
› Morphing and Skinned Mesh
Наиболее › Анимированная геометрия
Интересные объектов
Scene Graph
› Mesh
› 3D Геометрия видимых объектов
Элементы › Sprite 3D
› 2D изображения в 3D
пространстве
14. public class SimpleWorld extends MIDlet {
Canvas3D canvas3D;
public void startApp() {
canvas3D = new Canvas3D();
Display.getDisplay(this).setCurrent(canvas3D);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
15. public class Canvas3D extends Canvas
implements Runnable {
public Canvas3D(){
}
public void paint(Graphics g) {
}
public void run() {
}
}
16. public class Canvas3D extends Canvas
implements Runnable {
private Thread thread;
public Canvas3D(){
private long startTime;
}
private Graphics3D graphics3D;
public void paint(Graphics g) {
private World world;
}
private Camera camera;
public void run() {
private boolean running = false;
}
}
17. setFullScreenMode(true);
thread = newThread(this);
public class Canvas3D extends Canvas
startTime= System.currentTimeMillis()
implements Runnable {
graphics3D= Graphics3D.getInstance();
public Canvas3D(){
world = new World();
}
camera = new Camera();
public void paint(Graphics g) {
floataspect = (float) getWidth()/ (float) getHeight();
}
camera.setPerspective(30.0f,aspect, 1.0f, 1000.0f);
public void run() { world.addChild(camera);
} world.setActiveCamera(camera);
} running = true;
thread.start();
18. public class Canvas3D extends Canvas
implements Runnable {
graphics3D.bindTarget(g);
public Canvas3D(){
world.animate(
}
(int)(System.currentTimeMillis() -
public void paint(Graphics g) { startTime));
} graphics3D.render(world);
public void run() { graphics3D.releaseTarget();
}
}
19. public class Canvas3D extends Canvas
implements Runnable {
public Canvas3D(){ while (running){
} repaint();
public void paint(Graphics g) { Thread.sleep(20);
} }
public void run() {
}
}
22. // Create vertex data.
VertexBuffer cubeVertexData = new VertexBuffer();
cubeVertexData.setDefaultColor(0x000000FF);
VertexArray vertexPositions =
new VertexArray(VERTEX_POSITIONS.length / 3, 3, 1);
vertexPositions.set(0, VERTEX_POSITIONS.length / 3,VERTEX_POSITIONS);
cubeVertexData.setPositions(vertexPositions, 1.0f, null);
// Create the triangles that define the cube; the indices point to
// vertices in VERTEX_POSITIONS.
TriangleStripArray cubeTriangles = new TriangleStripArray(
TRIANGLE_INDICES, new int[]{TRIANGLE_INDICES.length});
23. Material material = new Material();
material.setVertexColorTrackingEnable(true);
Appearance appearance = newAppearance();
appearance.setMaterial(material);
// Create a Mesh that represents the cube.
Mesh cubeMesh = new Mesh(cubeVertexData, cubeTriangles, appearance);
cubeMesh.setOrientation(20.0f, 1.0f, 2.0f, 3.0f);
cubeMesh.setUserID(1);
world.addChild(cubeMesh);