среда, 19 августа 2015 г.

Пишем игру для Андроид

Статья пятая. Предварительные настройки и создание лунной базы.

   Вообще-то, планировалось отработать столкновение астероида с базой, но тут я вспомнил, что у нас пока нет самой базы. Астероид летает на голубом фоне, и сталкиваться ему пока не с чем.

   Поэтому было решено создать две картинки лунной базы, которые будут являться фоном.


    Теперь у нас есть, что защищать.

  Чтобы иметь возможность выбирать картинку, на главном окне покажем кнопку настроек приложения. Кнопку запуска игры придется сместить правее в 9 квадрат разбивки, а кнопку настройки в 7 квадрат.
   На эмуляторе теперь это выглядит так.

   Создадим новое активити и назовем его Prefs. Благодаря ему мы сможем увидеть настройки приложения и сохранять их.

Prefs.java
package com.adc2017gmail.moonbase;
import android.os.Bundle;import android.preference.PreferenceActivity;
public class Prefs extends PreferenceActivity
{
    
@Override
    
protected void onCreate(Bundle savedInstanceState)
    {
        
super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.
setting);
    }
}

   Как мы видим, в методе onCreate мы добавляем настройки из ресурса setting.
Необходимо в папке res создать новую папку xml, в которую поместить файл разметки
setting.xml


setting.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <ListPreference

        android:key="@string/background"

        android:title="Background"

        android:summary="Choose a background"

        android:defaultValue="1"

        android:entries="@array/listArray"

        android:entryValues="@array/listValues"

        android:dialogTitle="choose a background" />



</PreferenceScreen>
 
Визуально на телефоне это будет выглядеть так.


Нажав на стрелочку, переходим на новое окно, где можем сделать выбор.


   Мы задаем название настройки android:title="Background".
Поясняем, что делает настройка (android:summary="Choose a background"), выбираем задний фон.
   Задаем ключ доступа к настройке (android:key="@string/background").
Делаем ссылку на список настроек (android:entries="@array/listArray") и их значений (android:entryValues="@array/listValues"). Список настроек виден пользователю.
 
   Создадим эти списки. Для этого в папке values создайте файл array.xml. 
Вот его содержимое
array.xml
<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string-array name="listArray">

        <item>Cosmos 1</item>

        <item>Cosmos 2</item>



    </string-array>



    <string-array name="listValues">

        <item>1</item>

        <item>2</item>



    </string-array>

</resources>
 
   Теперь необходимо в активити GameView обратиться к нашим настройкам. Это мы сделаем с помощью метода
private void getPrefs() {

    // Get the xml/preferences.xml preferences

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());



    ListPreference = prefs.getString("background", "1");



}
   Как мы видим, в переменную ListPreference заносится значение строки, которая выбрана в настройках. Чтобы считать это значение мы вводим ключ ("background") и значение по умолчанию ("1").

Потом делаем загрузки нужной картинки в зависимости от настроек.
getPrefs();

 if(ListPreference.equals("1")){

     mBackground = context.getResources().getDrawable(R.drawable.cosmos1);

 }

else{

     mBackground = context.getResources().getDrawable(R.drawable.cosmos2);

 }

Как всё это на данный момент работает можно посмотреть на видео

https://youtu.be/i_Bi_TJGS1A

Здесь можно скачать файлы картинок кнопки настройки и лунных баз.

Файлы приложения, которые изменились на данный момент
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.adc2017gmail.moonbase" >



    <application

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MainActivity"

            android:label="@string/app_name"

            android:screenOrientation="portrait" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />



                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <activity

            android:name=".SecondActivity"

            android:label="@string/title_activity_second"

            android:screenOrientation="portrait" >

        </activity>

        <activity

            android:name=".Prefs"

            android:label="@string/title_activity_prefs"

            android:screenOrientation="portrait">

        </activity>

    </application>



</manifest>

GameVeiw.java
package com.adc2017gmail.moonbase;



import android.content.Context;

import android.content.SharedPreferences;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.drawable.Drawable;

import android.preference.PreferenceManager;

import android.view.SurfaceHolder;

import android.view.SurfaceView;



import java.util.Random;





public class GameView extends SurfaceView implements SurfaceHolder.Callback {





    private final Drawable mAsteroid;

    private final Drawable mBackground;



    private int widthAsteroid;

    private int heightAsteroid;

    private int leftAsteroid;

    private int rightAsteroid;

    private int topAsteroid;

    private int yAsteroid = -30;

    private int bottomAsteroid;

    private int centerAsteroid;

    private int height;

    private int width;

    private int speedAsteroid = 5;

    private int xAsteroid = 30;



    private MainThread thread;

    private String ListPreference;



    public GameView(Context context) {

        super(context);



        // adding the callback (this) to the surface holder to intercept events

        getHolder().addCallback(this);



        // create mAsteroid where adress picture  asteroid

        mAsteroid = context.getResources().getDrawable(R.drawable.asteroid);



        getPrefs();

        if(ListPreference.equals("1")){

            mBackground = context.getResources().getDrawable(R.drawable.cosmos1);

        }

       else{

            mBackground = context.getResources().getDrawable(R.drawable.cosmos2);

        }





        // create the game loop thread

        thread = new MainThread(getHolder(), this);

    }





    @Override

    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {

    }



    @Override

    public void surfaceCreated(SurfaceHolder holder) {



        thread.setRunning(true);

        thread.start();

    }







    @Override

    public void surfaceDestroyed(SurfaceHolder holder) {



        thread.setRunning(false);



        boolean retry = true;

        while (retry) {

            try {

                thread.join();

                retry = false;

            }

            catch (InterruptedException e) {

                // try again shutting down the thread

            }

        }



    }





    public void render(Canvas canvas) {



        canvas.drawColor(Color.argb(255, 2, 19, 151));



        height = canvas.getHeight();

        width = canvas.getWidth();



//set the background

        mBackground.setBounds(0,0, width, height);

       mBackground.draw(canvas);





        //Work with asteroid

            widthAsteroid = 2 * width / 13;//set width asteroid

            heightAsteroid = widthAsteroid;

            leftAsteroid = xAsteroid;//the left edge of asteroid

            rightAsteroid = leftAsteroid + widthAsteroid;//set right edge of asteroid

            topAsteroid = yAsteroid;

            bottomAsteroid = topAsteroid + heightAsteroid;

            centerAsteroid = leftAsteroid + widthAsteroid / 2;



            mAsteroid.setBounds(leftAsteroid, topAsteroid, rightAsteroid, bottomAsteroid);

            mAsteroid.draw(canvas);



    }







    public void update() {



        if (yAsteroid > height) {

            yAsteroid = 0;



        // find by random function Asteroid & speed Asteroid

            Random rnd = new Random();

            xAsteroid = rnd.nextInt(width - widthAsteroid);

            speedAsteroid = 5+ rnd.nextInt(10);

        } else {



            yAsteroid +=speedAsteroid;

        }

    }

    private void getPrefs() {

        // Get the xml/preferences.xml preferences

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());



        ListPreference = prefs.getString("background", "1");



    }





}



MainActivity.java
package com.adc2017gmail.moonbase;



import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.MenuItem;

import android.view.View;

import android.widget.ImageButton;





public class MainActivity extends Activity {



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



        final ImageButton imgbtn8 = (ImageButton)findViewById(R.id.btn9);



        imgbtn8.setOnClickListener(new View.OnClickListener() {



            public void onClick(View v) {



                imgbtn8.setImageResource(R.drawable.btn2);

                Intent intent8 = new Intent(MainActivity.this, SecondActivity.class);

                startActivity(intent8);

            }

        });



        //Work btn Setting

        ImageButton btn_settings = (ImageButton) findViewById(R.id.btn7);

        btn_settings.setOnClickListener(new View.OnClickListener(){

                                            @Override

                                            public void onClick(View v) {



                                                // TODO Auto-generated method stub

                                                Intent intent3 = new Intent(MainActivity.this, Prefs.class);

                                                startActivity(intent3);





                                            }

                                        }

        );

    }





    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle action bar item clicks here. The action bar will

        // automatically handle clicks on the Home/Up button, so long

        // as you specify a parent activity in AndroidManifest.xml.

        int id = item.getItemId();



        //noinspection SimplifiableIfStatement

        if (id == R.id.action_settings) {

            return true;

        }



        return super.onOptionsItemSelected(item);

    }

}
 
 
activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity"

    android:background="@android:color/black">

    />



    <ImageView

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:id="@+id/imageView1"

        android:layout_gravity="center"

        android:scaleType="fitXY"

        android:src="@drawable/moon_base"

        android:contentDescription="@string/bg"

        />

    <TableLayout

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:stretchColumns="*"

        >

        <TableRow

            android:layout_weight="1"

            android:gravity="center">

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn1" />



            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn2" />

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn3" />

        </TableRow>

        <TableRow

            android:layout_weight="1"

            android:gravity="center">

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn4" />

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn5" />

                />

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn6" />

                />



        </TableRow>

        <TableRow

            android:layout_weight="1"

            android:gravity="center">

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn7"

                android:src="@drawable/btn_setting"

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

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn8" />

            <ImageButton

                android:layout_width="fill_parent"

                android:layout_height="fill_parent"

                android:background="@android:color/transparent"

                android:scaleType="center"

                android:adjustViewBounds="true"

                android:padding="10dp"

                android:contentDescription="@string/btn9"

                android:src="@drawable/btn1"

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

                />



        </TableRow>



    </TableLayout>

</FrameLayout>
 


Комментариев нет:

Отправить комментарий