ABCene for Android-spillutvikling: Forbered lerretet

I Google Play er 23 av de 25 beste applikasjonene for Android-telefoner og nettbrett spill (i skrivende stund). Så det er bare fornuftig at hvis du er i eller tenker på å komme inn på mobilområdet, kan du vurdere å prøve deg på å skrive underholdningsprogramvare.

Selv for en erfaren programvareingeniør, kan koding av et spill være litt skremmende. Det er ikke at det å skrive spill er vanskeligere enn å utvikle andre typer applikasjoner, det er bare annerledes. Spillprogrammering har sine egne teknikker, paradigmer og ordforråd - du vil høre spillutviklere snakke om sprites, bildefrekvenser, verdenskoordinater og piksel-perfekt kollisjonsdeteksjon.

I fjor, da jeg sammen med sønnen min skrev mitt første spill, fant jeg meg selv i å kamma Internett og forum for enkle opplæringsprogrammer som dekket det grunnleggende. Det er en overveldende mengde informasjon der ute, men programmering av spill er ofte spesifikk for en plattform og / eller verktøy. Jeg bestemte meg for å skrive en serie for TechRepublic-lesere som introduserer de viktigste konseptene for kodingsspill på Android-plattformen, og resulterer i et nesten komplett spill som demonstrerer teknikkene som er diskutert.

Dette er det første innlegget i denne femdelte serien. Kildekoden i hvert avdrag vil bygge på den fra forrige innlegg. Du vil kunne følge med på hver opplæring eller laste ned prosjektet og importere det direkte til Eclipse. Som med å lære noe nytt, må vi gå før vi kan fly. Derfor, mens koden på slutten av del en av denne opplæringen vil kjøres, vil den ikke være veldig underholdende. Frykt aldri, den kommer dit. I mellomtiden nedenfor er et sniktitt av det ferdige spillet.

Figur A

Dette er et skjermbilde av vårt ferdige spill. Målet er å justere tallerkenens fart for å unngå å bli smadret til asteroiden. Mens det er forenklet, inneholder prosjektet alle de viktige aspektene ved et videospill: et lerret, sprites, animasjon, kollisjonsdeteksjon og brukerinput.

Hvis du ikke har gjort noen Android-programmering, er det greit også. Det er mange verktøy tilgjengelig for å skrive mobilspill, og i et senere innlegg vil jeg diskutere noen av alternativene. Mine viktigste grunner for å velge Android-lerret og standard SDK er to ganger. For det første er teknikkene ikke så kompliserte som å skremme bort en nybegynner. (Mens OPENGL er mer utøvende, er det bare å få noe til å vises på skjermen ofte nok til å knuse en spirende spillutvikler.) For det andre er alle verktøyene gratis og kan lastes ned og konfigureres under Mac OS, Linux og Microsoft Windows. Jeg er en stor fan av Corona SDK og Unity, men begge koster penger å komme i gang og kun kjøre under visse operativsystemer.

Hvis dette er første gang du leser TechRepublics Android App Builder-blogg, har vi en nybegynnerguide for Android-utvikling. Du vil også se på Googles offisielle dokumentasjon for installasjon og konfigurering av utviklingsmiljøet ditt.

Forberede lerretet

1. Lag et nytt Android-prosjekt i Eclipse. Siden vi senere vil bruke noen av bevegelsesdetektorinngangene som ikke var en del av 1.0 SDK, ønsker vi å sikre at minimumsversjonen av målrettet Android er 2.1 (Eclair) eller bedre. Husk å gi nytt navn til oppstartsaktiviteten til Main.java og den tilhørende utformingen til main.xml.

2. Endre AndroidManifest.XML-filen. Spesielt skal vi legge til en egenskap til aktiviteten vår som vil føre til at enheten ignorerer orienteringsendringer og alltid tvinger skjermen til portrettmodus.

AndroidManifest.xml

 "Http://schemas.android.com/apk/res/android" 
 package = "com.authorwjf.gamedevtut" 
 android: versionCode = "1" 
 android: versionName = "1.0" > 
 android: minSdkVersion = "8" 
 android: targetSdkVersion = "15" /> 
 android: icon = "@ drawable / ic_launcher" 
 android: label = "@ string / app_name" 
 android: theme = "@ style / AppTheme" > 
 android: screenOrientation = "portrait" android: configChanges = "orientering | tastatur skjult " 
 android: name = ".Main" 
 android: label = "@ string / title_activity_main" > 
 "android.intent.action.MAIN" /> 
 "android.intent.category.LAUNCHER" /> 

3. Definer oppsettet for applikasjonen vår. Finn main.xml i mappen / res / layout. For det meste, hvis du har gjort noen Android-programmering, bør du gjenkjenne layoutkomponentene. Jeg opprettet en standard lineær layout ved hjelp av vanlige Android UI-widgets med ett unntak. Merk at det aller siste elementet i oppsettet er definert som et GameBoard; dette er vår egen tilpassede visning og hjertet av å trekke spillet vårt på skjermen. Foreløpig bør du sørge for at hvis du ikke brukte det samme pakkenavnet som jeg gjorde (com.authorwjf.drawing) at du peker det på pakken din.

main.xml

 "Http://schemas.android.com/apk/res/android" 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" 
 android: orientering = "vertikal" > 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" 
 android: layout_gravity = "topp | sentrum" 
 android: text = "ABC's of Android Game Dev" /> 
 android: id = "@ + id / the_button" 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" 
 android: layout_gravity = "sentrum" 
 android: gravitasjon = "sentrum" 
 android: enabled = "falsk" 
 android: text = "Reset" /> 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" 
 android: layout_gravity = "sentrum" 
 android: text = "Sprite Speed ​​(?, ?)" 
 android: id = "@ + id / the_label" /> 
 android: layout_width = "wrap_content" 
 android: layout_height = "wrap_content" 
 android: layout_gravity = "sentrum" 
 android: text = "Last Collision XY (?, ?)" 
 android: id = "@ + id / the_other_label" /> 
 android: layout_width = "fill_parent" 
 android: layout_height = "fill_parent" 
 android: layout_margin = "20dip" 
 android: id = "@ + id / the_canvas" /> 

4. Flytt til vår / src-katalog og lag en ny .drawing-pakke. I mitt tilfelle er pakken com.authorwjf.drawing. I denne pakken kan du legge til en ny klassefil og kalle den GameBoard.java; denne nye klassefilen vil håndtere all tegning på lerretet vårt. I sin første inkarnasjon maler GameBoard.java ganske enkelt en svart bakgrunn og befolker et stjernefelt med tilfeldige pulserende stjerner.

GameBoard.java

 pakke com.authorwjf.drawing; 
 importer java.util.ArrayList; 
 import java.util.List; 
 importer java.util.Random; 
 import android.content.Context; 
 import android.graphics.Canvas; 
 import android.graphics.Color; 
 import android.graphics.Paint; 
 import android.graphics.Point; 
 import android.util.AttributeSet; 
 import android.view.View; 
 public class GameBoard utvider View { 
 privat maling; 
 privat liste starField = null ; 
 privat int starAlpha = 80; 
 privat int starFade = 2; 
 privat statisk endelig int NUM_OF_STARS = 25; 
 synkronisert offentlig tomrom resetStarField () { 
 starField = null ; 
 } 
 public GameBoard (Context context, AttributeSet aSet) { 
 super (kontekst, aSet); 
 // Det er best å ikke lage noen nye objekter i trekningen 
 // initialisere dem som klassevariabler her 
 p = ny maling (); 
 } 
 private void initializeStars ( int maxX, int maxY) { 
 starField = new ArrayList (); 
 for ( int i = 0; i < NUM_OF_STARS ; i ++) { 
 Tilfeldig r = ny Tilfeldig (); 
 int x = r.nextInt (maxX-5 + 1) +5; 
 int y = r.nextInt (maxY-5 + 1) +5; 
 starField.add ( nytt punkt (x, y)); 
 } 
 } 
 @Overstyring 
 synkronisert offentlig tomrom onDraw (Canvas canvas) { 
 // lage et svart lerret 
 p.setColor (farge. SVART ); 
 p.setAlpha (255); 
 p.setStrokeWidth (1); 
 canvas.drawRect (0, 0, getWidth (), getHeight (), p); 
 // initialiser starfield om nødvendig 
 if (starField == null ) { 
 initialisereStars (canvas.getWidth (), canvas.getHeight ()); 
 } 
 // tegne stjernene 
 p.setColor (farge. CYAN ); 
 p.setAlpha (starAlpha + = starFade); 
 // visne dem ut og inn 
 if (starAlpha> = 252 || starAlpha <= 80) starFade = starFade * -1; 
 p.setStrokeWidth (5); 
 for ( int i = 0; i < NUM_OF_STARS ; i ++) { 
 canvas.drawPoint (starField.get (i) .x, starField.get (i) .y, p); 
 } 
 } 
 } 

5. Endre filen /src/Main.java. Hovedklassen-filen belastes med å oppdatere koordinatene til alle brukerobjekter som vil bli trukket til skjermen av GameBoard-klassen, håndtere brukerinndata og bildefrekvens. Ved periodisk å legge ut en ugyldig på lerretet tvinger Main.java lerretet til å tegne om innholdet for å gjenspeile eventuelle oppdateringer i handlingen. Tenk på Main.java som hjernen bak spillet vårt.

Main.java

 pakke com.authorwjf.gamedevtut; 
 import com.authorwjf.drawing.GameBoard; 
 import com.authorwjf.gamedevtut.R; 
 import android.os.Bundle; 
 import android.os.Handler; 
 import android.app.Aktivitet; 
 import android.view.View; 
 import android.view.View.OnClickListener; 
 import android.widget.Button; 
 public class Main utvider aktivitetsredskaper OnClickListener { 
 private Handler frame = new Handler (); 
 // Del rammen med 1000 for å beregne hvor mange ganger i sekundet skjermen vil oppdatere. 
 privat statisk endelig int FRAME_RATE = 20; // 50 bilder per sekund 
 @Overstyring 
 public void onCreate (Bundle savedInstanceState) { 
 super .onCreate (savedInstanceState); 
 setContentView (R.layout. main ); 
 Handler h = new Handler (); 
 ((Knapp) findViewById (R.id. The_button )). SetOnClickListener ( dette ); 
 // Vi kan ikke initialisere grafikken umiddelbart fordi layout manager 
 // trenger å løpe først, og dermed kaller vi tilbake om et sekund. 
 h.postDelayed ( new Runnable () { 
 @Overstyring 
 public void run () { 
 initGfx (); 
 } 
 }, 1000); 
 } 
 synkronisert offentlig tomrom initGfx () { 
 ((GameBoard) findViewById (R.id. The_canvas )). ResetStarField (); 
 ((Knapp) findViewById (R.id. The_button )). SetEnabled ( true ); 
 // Det er lurt å fjerne eksisterende tilbakeringinger som du vil beholde 
 // dem fra utilsiktet stabling. 
 frame.removeCallbacks (frameUpdate); 
 frame.postDelayed (frameUpdate, FRAME_RATE ); 
 } 
 @Overstyring 
 synkronisert offentlig tomrom onClick (View v) { 
 initGfx (); 
 } 
 private Runnable frameUpdate = new Runnable () { 
 @Overstyring 
 synkronisert offentlig tomgangskjøring () { 
 frame.removeCallbacks (frameUpdate); 
 // gjøre eventuelle oppdateringer til skjermobjekter her 
 // påkalle deretter trekningen ved å ugyldige lerretet 
 ((GameBoard) findViewById (R.id. The_canvas )). Ugyldig (); 
 frame.postDelayed (frameUpdate, FRAME_RATE ); 
 } 
 }; 
 } 

Prosjektet skal være klart til å kompilere og laste til enheten eller emulatoren din. Det vil trekke stjernefeltet vårt og pulse stjernene inn og ut. Ved å trykke på reset-knappen får appen til å velge nye tilfeldige koordinater for stjernene. Hvis du ikke har mye erfaring med Android-utvikling, er simulatoren smertefullt treg, så ikke bekymre deg hvis stjernenes animerte effekt ikke er så snappy som du ønsker. Kjør den på en faktisk telefon, og jeg tror du vil være fornøyd med resultatene.

Kom tilbake til Android App Builder-bloggen for del to i denne serien, som vil fokusere på sprites.

© Copyright 2021 | pepebotifarra.com