Пишем игру для Андроид
Статья пятая. Предварительные настройки и создание лунной базы.
Поэтому было решено создать две картинки лунной базы,
которые будут являться фоном.
Теперь у нас есть, что защищать.
Чтобы иметь возможность выбирать картинку, на главном окне
покажем кнопку настроек приложения. Кнопку запуска игры придется сместить
правее в 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);
}
}
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>
Комментариев нет:
Отправить комментарий