Fang flaget: En tutorial på Android's Canvas-klasse og Touch event-handler

For flere uger siden skrev jeg en tutorial, der skulle hjælpe spirende udviklere med at spille rundt med Android's multimediebiblioteker, og jeg har modtaget et godt svar fra håbefulde unge udviklere (min teenage-søn var inspiration til posten) og både undervisere. Den positive reaktion er grunden til, at jeg besluttede at skrive en anden tutorial om en lignende vene. Denne tutorial demonstrerer Android's Canvas-klasse og en enkel teknik til at tegne bitmaps på den. Vejledningen dækker også at få Touch-begivenheder fra brugeren og en rudimentær kollisionsdetekteringsalgoritme.

Der er lidt mere kode involveret i denne tutorial end dens forgænger, men kæmp ikke - intet af det er kompliceret, og i sidste ende vil du blive belønnet med et komplet (omend enkelt) elektronisk spil til at fange flaget ( figur A ). Lad os komme igang. (Hvis du foretrækker at downloade og importere hele projektet til Eclipse, kan du gribe det her.) Figur A

Instruktioner til, hvordan man opretter fange flag

Trin et: Opret et nyt Android-projekt inde i Eclipse. Der er nogle avancerede Touch-hændelsesteknikker (såsom multi-touch), der kun kan fås i senere versioner af Android SDK, men til vores spil bruger vi bare en simpel ACTION_DOWN-bevægelse. Dette betyder, at du er fri til at målrette mod ethvert SDK, der er større eller lig med 1, 6. Trin to: Find et billede, der repræsenterer flag. Opret en / drawble-mappe under dit / res-bibliotek, og kopier dit billede ind i det. Trin tre: Nu har vi brug for et layout. Rediger filen main.xml i mappen / res / layout. Layouten er ligetil med en undtagelse: Det har et element kaldet com.authorwjf.GameBoard, som vi vil oprette os selv og medtage i projektet. I henhold til Android SDK-dokumentationen kan du henvise til enhver klasse i dit layout på denne måde, så længe denne klasse udvider den indbyggede View-klasse. Nifty!
 main.xml 
 "1.0" encoding = "utf-8" ?> 

http://schemas.android.com/apk/res/android

android: orientering = "lodret"

android: layout_width = "fill_parent"

android: layout_height = "fill_parent" >

android: id = "@ + id / the_label"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: layout_gravity = "center"

android: tyngdekraft = "center"

android: textSize = "20sp"

android: layout_marginBottom = "10dip"

android: text = "Tilpasset tegning af overfladedemonstration." />

android: id = "@ + id / the_button"

android: layout_width = "wrap_content"

android: layout_height = "wrap_content"

android: layout_gravity = "center"

android: tyngdekraft = "center"

android: layout_marginBottom = "10dip"

android: text = "Skjul flaget!" />

android: layout_width = "fill_parent"

android: layout_height = "fill_parent"

android: id = "@ + id / the_canvas" />

Trin fire: Definer et enum kaldet Indikatorer i vores / src-bibliotek, før du går videre til GameBoard-klassen.
 Indicators.java 
 pakke com.authorwjf; indikatorer for offentlig enum { 

BULLSEYE,

VARMT,

VARM,

KALD ;

}
Trin fem: Vend din opmærksomhed mod GameBoard-klassen, som er hjertet i vores projekt. GameBoard-klassen udvider View-klassen og fungerer som vores lærred, hvor vi tegner. Til at begynde med, lad os koncentrere os om konstruktøren. Der er flere private variabler såvel som import, der ikke blev brugt på dette tidspunkt. Bare rolig - vi kommer til dem. For nu skal du bare være opmærksom på det faktum, at vi skaber en global forekomst af vores bitmap såvel som en pensel.
 Main.java 
 pakke com.authorwjf; 
 import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; 
 offentlig klasse GameBoard udvider Vis { 
 privat int mFlagX = -1; privat int mFlagY = -1; privat Bitmap mBitmap = null ; privat maling mPaint = null ; privat boolsk isFlagHidden = falsk ; privat int mBoundX = -1; privat int mBoundY = -1; offentlig final int LUKKER = 50; offentlig endelig int LUKKET = 100; 
 offentlig GameBoard (kontekstkontekst, AttributeSet aSet) { super (context, aSet); 

mBitmap = BitmapFactory. dekodeResource (getResources (), R.drawable. white_flag );

mPaint = ny maling ();

mPaint.setColor (farve. DKGRAY );

}

}

Gotcha! Hvis du vil henvise til en klasse i dine egne layouts, som vi har gjort, skal du implementere konstruktøren for klassen View, der indeholder parameteren AttributeSet. Hvis du ikke gør det, vil det resultere i en vag runtime-fejl, der får dig til at ridse på hovedet og skure Android-nyhedsgrupperne.

Trin seks: Opret en offentlig metode, som vores Main.java-klasse kan bruge til at skjule flaget. Vi bruger matematiske biblioteker til at oprette et tilfældigt tal mellem 0 og den maksimale visningsbredde og -højde. Jeg vil drøfte, hvordan man får udsynets bredde og højde senere. Ved denne metode skal du vide, at mBoundX indeholder visningsbredden, og mBoundY indeholder visningshøjden. I tilfælde af at du undrer dig, tvinger opkaldet til funktionen ugyldig () vores genudtrækningskode til at udføre.
 public void hideTheFlag () {mFlagX = ( int ) Matematik. loft (Matematisk tilfældig () * mBoundX); mFlagY = ( int ) Matematik. loft (Matematisk tilfældig () * mBoundY); isFlagHidden = sandt ; 

afkræfte ();

}
Se trin syv til 12 i denne Android-tutorial.

© Copyright 2021 | mobilegn.com