Tečaj
izdelave iger za mobilne telefone

:: Predavatelj: Žiga Hajduković. e-mail. .
:: Organizator: Dane Šoba. e-mail. Študentska organizacija FRI (ŠOFRI).

:: Domača stran tečaja: www.tetris1d.org/game/dev/tecaj/.
:: game/dev.si forum: www.tetris1d.org/game/dev/forum_si/.

:: Študentski info sistem FRI: http://www.student-info.net/fri/.

Novice

Čestitam vsem sodelujočim v velikem nagradnem tekmovanju za najboljšo mobilno igro, ki jo je sponzoriralo priznano podjetje Cocoasoft!
V zelo kratkem času vam je uspelo prekositi same sebe in ustvariti igre, ki so presegle vsa pričakovanja!
Objavili smo galerijo vseh sodelujočih iger, kjer si lahko ogledate posnetke akcije iz samih iger, pa tudi fotografije iz podelitve bogatih nagrad!
Ne pozabite na gd.si forum, kjer si bomo še naprej izmenjevali mnenja in pomagali drug drugemu na poti k izdelovanju najboljših mobilnih iger!

Lekcija 05

lekcija 04 :: domov :: lekcija 06

Epsilon 04

Epsilon 04 eclipse workspace project (sfx)

Epsilon 04 wap download

Odpri povezavo:

	http://www.tetris1d.org/gdwap/	
na svojem mobilnem telefonu in si naloži Epsilon_04.

Izvorna koda

Game.java (izvorna datoteka)

GameCanvas.java (izvorna datoteka)

GameSprite.java (izvorna datoteka)

Level.java (izvorna datoteka)

Grafika

Slika 1. Intro image

Slika 2. Background

Slika 3. Player

Slika 4. Izstrelki

Slika 5. Enemy sprite 1

Slika 6. Enemy sprite 2

Slika 7. Enemy sprite 3

Slika 8. Enemy sprite 4, gun turret

Slika 9. Eksplozija

Slika 10. Tileset

Slika 11. Boss, stage1

Slika 12. Boss, stage2
Stage 1

Datoteka stage1.txt:


	public static final byte SPRITE_ID_PLAYER = 0;			// 'P'
	public static final byte SPRITE_ID_ENEMY1_SHOOTING = 1;		// 'A'
	public static final byte SPRITE_ID_ENEMY1 = 2;			// 'a'
	public static final byte SPRITE_ID_ENEMY2_SHOOTING = 3;		// 'V'
	public static final byte SPRITE_ID_ENEMY2 = 4;			// 'v'
	public static final byte SPRITE_ID_ENEMY3 = 5;			// 'O'
	public static final byte SPRITE_ID_ENEMY3_SINUS = 6;		// 's'
	public static final byte SPRITE_ID_ENEMY3_SINUS_SHOOTING = 7;	// 'S'
	public static final byte SPRITE_ID_ENEMY4_SHOOTING = 8;		// 'T'
	public static final byte SPRITE_ID_BOSS1 = 9;			// 'B'
	public static final byte SPRITE_ID_BOSS2 = 10;			// 'C'


OOOOOOOOOOOOOOOO;                ;
OOvvvvvvvvvvvvOO;                ;
O/            \O;                ;
>              <;       B        ;
>              <;                ;
>              <;                ;
>              <;                ;
>              <;                ;
OL            JO;                ;
OGL          JGO;                ;
OOGL        JGOO;     V   V      ;
\OOGL      JGOO/;                ;
 \OG/      \GO/ ;                ;
  \/        \/  ;                ;
                ;                ;
       JL       ;     A   A      ;
      JOOL      ;                ;
L     <OOG      ;   O   O   O    ;
>     <GG>     J;                ;
/     <OO>     <;                ;
      GOO>     \;                ;
      \GG/      ;   V       V    ;
       \/       ;                ;
               J;                ;
    J^^L      JO;                ;
   JOvvOL     \O;                ;
  JG/  O>      \;      A A       ;
  <>  J>/      J;    A     A     ;
  J/  <G      JO;                ;
 J>  JO/     JOG;                ;
J/  JO/     JOGO;                ;
GO^^^/      OOOG;                ;
GOGG/       OOGO;                ;
OGOO        OGOO;     O    O     ;
vvvv        Ovvv;                ;
                ;                ;
  JL        JL  ;      V  V      ;
 JOOL      JOOL ;                ;
JOOGO      OGOOL;                ;
OOGO>      <OGOO; O            O ;
\GOGO      OGOG/;                ;
 OOO>      <OOO ;   O        O   ;
 vvvv      vvvv ;                ;
 OOOO      OOOO ;     O    O     ;
 \vv/      \vv/ ;                ;
                ;  O          O  ;
L              J;                ;
>             <O;                ;
/              \;                ;
                ;      a  a      ;
       JL       ;                ;
      JOOL      ;                ;
L     <OOG      ;  v          v  ;
>     <GG>     J;    v      v    ;
/     <OO>     <;      v  v      ;
      GOO>     \;                ;
      \GG/      ;                ;
       \/       ;                ;
               J;                ;
    J^^L      JO;                ;
   JOOOOL     \O;                ;
  JOOGOO>      \;                ;
  <OOOGO/      J;       P        ;
  JOOOOG      JO;                ;

Stage 2

Datoteka stage2.txt:

 J^L        J^L ;                ;
 <G>        <G> ;  T          T  ;
 \v/        \v/ ;       C        ;
                ;                ;
 J^L        J^L ;                ;
 <G>        <G> ;  T          T  ;
 \v/        \v/ ;                ;
                ;       s        ;
                ;    S     S     ;
      J^L       ;       s        ;
     JOGOL      ;    S  T  S     ;
   ^^OGOGO^^    ;      T T       ;
   GO>   <OG    ;   T       T    ;
   \OO^^^OO/    ;                ;
    \vOGOv/     ;    A  T  A     ;
      \v/       ;                ;
                ;   S   S   S    ;
                ;                ;
                ;                ;
                ;                ;
                ;     v   v      ;
  J^L     J^L   ;                ;
^^OGO^^^^^OGO^^^;   T       T    ;
vvvvvvOGOvvvvvvv;       T        ;
      \v/       ;                ;
                ;  S         S   ;
                ;    s     s     ;
   J^L          ;       S        ;
   <G>          ;    T           ;
   \v/    J^L   ;                ;
          <O>   ;       s        ;
          \v/   ;                ;
                ;    s     s     ;
  J^L           ;                ;
  <O>           ;                ;
  \v/      J^L  ;                ;
           <G>  ;            T   ;
           \v/  ;                ;
                ;  V V       V V ;
                ;                ;
       JL       ;                ;
^^^^^^^GG^^^^^^^;       TT       ;
vvvGGvvvvvvGGvvv;   TT      TT   ;
   \/      \/   ;                ;
                ;  a          a  ;
                ;                ;
                ; a            a ;
                ;     S    S     ;
                ;                ;
^^^L        J^^^;                ;
OOG>        <GOO;  T          T  ;
vvv/        \vvv;                ;
                ;     s    s     ;
                ;                ;
       J^L      ;                ;
       OGO      ;        T       ;
       \v/      ;                ;
                ;                ;
                ;                ;
    J^L         ;                ;
    <O>         ;                ;
    \v/         ;       P        ;
                ;                ;

Optimizacija in učinkovito programiranje

Pod pojmom optimizacija se običajno skriva izboljšanje hitrosti, kar bomo podrobneje pogledali tudi mi. Pri telefonih pa ta pojem pomeni tudi prilagajanje sposobnostim in lastnostim naprave (npr. drugačna razporeditev tipk, boljše sposobnosti predvajanja zvoka, velikost ekrana)

Pri hitrosti pa velja dobro znano prvo pravilo: 10% kode se izvaja 90% časa, zato je prava umetnost optimizacije poiskati tistih 10%, ne pa optimizirati ostalih 90% kode. Pogledali si bomo nekaj metod, ki pomagajo pri sami optimizaciji kode, ne bodo pa povzročile revolucionarnih sprememb, če je že sam algoritem v zasnovi počasen. Drugo pravilo optimizacije je, da najprej poskušaj na novo zasnovati algoritem, šele nato se loti podrobnejših optimizacij.

Hitrost
Poglejmo si nekaj tipičnih metod za izboljšanje hitrosti J2ME kode:
Delovni pomnilnik (Heap)

Bolj pomembna od optimizacije hitrosti je optimizacija porabe delovnega spomina, saj tu obstaja vprašanje delovanja. Npr. Nokia telefoni serije 40 imajo običajno 200kb delovnega pomnilnika v svojih "najcenejših" izvedbah Nekaj nasvetov:

Velikost paketa (JAR Size)

Tudi velikost JAR paketa povzroči vprašanje o delovanju, saj imajo nekateri telefoni fiksne omejitve za velikost le tega. Npr. na Nokiah serije 40 ta omejitev znaša 64kb.

Merjenje časa oz. Profiling

Kot smo že omenili je pomembno najti tistih 10% kode, ki je najbolj "problematičnih". To si ponavadi zelo olajšamo z uporabo "Profiler" orodij. Ker nam tako orodje ni na voljo (je, za emulatorje, kar nam ne pomaga v realnosti).

Zato uporabimo funkcijo System.currentTimeMillis(); in merimo čas funkcij npr. takole:

  long startTime = System.currentTimeMillis();
  doSomething(); // the thing you want to time
  long timeTaken = System.currentTimeMillis() – startTime;

Bodi pozoren na to, da je test dovolj dolg, da preseže "resolucijo" procesorjeve ure, ki je tipično 10-16ms na telefonih.

Mreža

Nekaj podatkov o uporabi HTTP in Socket povezav:

Občutek hitrosti!

Zelo pomemben je za uporabnika že samo občutek hitrosti! To lahko dosežemo na več načinov, čeprav je v resnici naš midlet lahko (tudi zaradi tega) počasnejši:

Memory fragmentation

Novosti

Visible property dodan v GameSprite class, za optimizacijo paint in update. Zaenkrat aktivirano za enemy sprite-e.

Dodan števec Frames Per Second, viden ob pritisku na tipko * (KEY_STAR).

Omogočene tipke 1, 3, 7 in 9 za diagonalno premikanje.

Dodan SHIFT_FACTOR in uporabljen na vseh pozicijah (x,y) in hitrostih (vx,vy) sprite-ov ter na tiles_scroll x,y ter vy.

Level.paint() uporabljeno "shift-anje" namesto množenja in deljenja (* in /).

Spremljanje porabe časa (profiling) določenih klicev večjih funkcij, ki se izvajajo v paint(). Za vklop prikaza časov pritisni tipko * (KEY_STAR).

Novi menu ekrani:

GAME_OVER ekran se uporablja za situacijo, ko igralec izgubi igro!

Novi tipi nasprotnikov:

Generator za sin[] array si lahko naložite tukaj: Java sin[] generator :: (c) zigah.2005

Dodan nuke efekt (tipka KEY_NUM0 med igro), ki uniči vse nasprotnike na ekranu. Igralec ima na voljo 3 nuke-e, količino preostalih pa mu kaže indikator spodaj desno, Ob sprožitvi se zgodi tudi eksploziven efekt z ozadjem (zasluge za idejo pripadajo organizator-ju Dane-tu : ) ).

Dodana glasba s pomočjo MMAPI-ja, za telefone, ki ga podpirajo.
Podporo igranju glasbe v ozadju sestavljajo tri nove funkcije: playMusic(), loadMusic() in stopMusic()
Dodan je klic na stopMusic() ob hideNotify()
Dodan je showNotify(), za ponovno sprožitev igranja glasbe.

Space-shooter-vertical-scroller material

Epsilon, dodatna grafika (by geci)

Grafika za igro Axion Space, Cocoasoft

Naloge

  1. Poskusi uvesti "pickup" bonus-e, ki jih lahko spustijo nekateri nasprotniki.
    Npr. extra nuke, shields up, energy up.
    Premisli o pogojih za pojavitev bonusa (na X ubitih nasprotnikov, naključni nasprotnik, samo točno določeni nasprotniki...)
    Premisli o ščitu - koliko časa bo aktiven, kako ga boš risal (naj bo podoben ultra-gate-parajoč-super-duper efektu)
  2. Dodaj stage3.txt, kak nov tip nasprotnika, novega boss-a, z večjim IQ-jem in večjim orožjem.
  3. Dodaj OUTRO ekran, morda kak slika, nekaj teksta "zgodbe", ki se ovrti čez ekran.
    Dodaj zgodbo pred vsako stopnjo. Morda kak stavek, ki se odvrti preden se naloži stopnja.


game/dev.si :: predlogi ? pišite: Žiga Hajduković