Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
#1

Сохранение и загрузка - Android

22.09.2015, 10:44. Просмотров 471. Ответов 23
Метки нет (Все метки)

Здравствуйте!

Я пишу игру на базе андроид.
Вот возникло несколько вопросов(прошу не троллить и не отправлять в гугл...я новичек в этой сфере):

1. Каким образом сделать автосохранение прогресса в игре, после каждого пройденного уровня.

2. Как создать меню выбора уровня типа как в игре "100 дверей", и чтобы второй уровень не был доступен, пока не пройдешь первый.

3. Интересуют подробности добавления сплэш-картинки при запуске игры

P.S.:
Язык: Java
Софт: Android Studio + AIDE
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2012 / 1754 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
22.09.2015, 11:01     Сохранение и загрузка #2
задавай вопросы конкретнее, потому что эти очень широкие и неопределенные
смахивает на "напишите за меня, я гуглить ничего не собираюсь"
RedGuy
1 / 2 / 0
Регистрация: 25.08.2015
Сообщений: 60
22.09.2015, 11:17     Сохранение и загрузка #3
magicboy, Ты основу уровня сделай хотя бы сделай,можно поискать в гугле авто сохранение(там этого очень много),и скажи переменные уровня,тогда и поможем
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
22.09.2015, 11:34     Сохранение и загрузка #4
Цитата Сообщение от magicboy Посмотреть сообщение
Как создать меню выбора уровня типа как в игре "100 дверей", и чтобы второй уровень не был доступен, пока не пройдешь первый.
Это ж элементарно, логика 5-го класса, if-else читали?
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 11:38  [ТС]     Сохранение и загрузка #5
Есть готовое меню, есть готовые уровни, мне нужно между ними сделать меню выбора уровня,. Но я знаю как каждой кнопке присвоить загрузку уровня, но я не знаю как сделать, чтоб загрузка второго уровня была недоступна, пока первый не пройдешь

Добавлено через 4 минуты
Это ж элементарно, логика 5-го класса, if-else читали?
Знаком с ними но как в реале осуществить, пока не представляю
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
22.09.2015, 11:45     Сохранение и загрузка #6
Цитата Сообщение от magicboy Посмотреть сообщение
Знаком с ними
это уже полдела)
После прохождения первого уровня метим его как пройденный (как метить это уже другой вопрос).
При отображении активити с уровнями, проверяем метки уровней, если 1-й уровень = true, то 2-й делаем visible.
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 12:04  [ТС]     Сохранение и загрузка #7
это уже полдела)
После прохождения первого уровня метим его как пройденный (как метить это уже другой вопрос).
При отображении активити с уровнями, проверяем метки уровней, если 1-й уровень = true, то 2-й делаем visible.
Вооот, уже хоть что-то...сейчас я поковыряюсь, попробую, и потом в этой теме отпишу результат
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
22.09.2015, 12:23     Сохранение и загрузка #8
Цитата Сообщение от magicboy Посмотреть сообщение
Я пишу игру на базе андроид.
Много уже написал?
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 12:29  [ТС]     Сохранение и загрузка #9
Много уже написал?
Меню и 6 черновых уровня
Игра в стиле лабиринта

Добавлено через 2 минуты
Сейчас занимаюсь именно оформлением и интерфейсом
YuraAAA
22.09.2015, 12:50
  #10

Не по теме:

magicboy, держите нас в курсе))

magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 13:56  [ТС]     Сохранение и загрузка #11
Прошу прощения за мою глупость и необразованность...но все таки помогите с написанием кода:

Это класс в котором у меня прописаны события всех кнопок игры:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class MainActivity extends Activity implements OnClickListener
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
 
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);       
        setContentView(R.layout.menu);
        Music.initialize(this);
        Music.menuPlay();
    }
 
    public void onClick(View v)
    {
        switch (v.getId())
        {
            case R.id.menu_help:setContentView(R.layout.help);
                break;
            case R.id.menu_new:Music.menuPause();
                startActivity(new Intent(MainActivity.this, GameActivity.class));
                break;
            case R.id.button_back_menu1:setContentView(R.layout.menu);
                break;
            case R.id.menu_info:setContentView(R.layout.info);
                break;
            case R.id.menu_exit:setContentView(R.layout.exit);
                break;
            case R.id.exit_yes:finish();
                break;
            case R.id.exit_no:setContentView(R.layout.menu);
                break;
            case R.id.info_back:setContentView(R.layout.menu);
                break;
        }
    }
 
    public void onPause()
    {
        super.onPause();
        Music.menuPause();
    }
}
23 строка обработка нажатия кнопки "Игра"
Вместо нее я прописываю переход на меню выбора уровня:
Javascript
1
2
case R.id.menu_new:setContentView(R.layout.load_lvl_menu);
                break;

load_lvl_menu.xml

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
 
    <Button
        android:layout_height="wrap_content"
        android:text="1"
        android:layout_width="wrap_content"
        android:id="@+id/loadlvl1"
        android:onClick="onClick"/>
 
    <Button
        android:layout_height="wrap_content"
        android:text="2"
        android:layout_width="wrap_content"
        android:id="@+id/loadlvl2"
        android:onClick="onClick"/>
 
    <Button
        android:layout_height="wrap_content"
        android:text="3"
        android:layout_width="wrap_content"
        android:id="@+id/loadlvl3"
        android:onClick="onClick"/>
 
    <Button
        android:layout_height="wrap_content"
        android:text="4"
        android:layout_width="wrap_content"
        android:id="@+id/loadlvl4"
        android:onClick="onClick"/>
 
    <Button
        android:layout_height="wrap_content"
        android:text="5"
        android:layout_width="wrap_content"
        android:id="@+id/loadlvl5"
        android:onClick="onClick"/>
 
    <Button
        android:layout_height="wrap_content"
        android:text="6"
        android:layout_width="wrap_content"
        android:id="@+id/loadlvl6"
        android:onClick="onClick"/>
 
</LinearLayout>
Упомянутый в предыдущем активити класс обработки самой игры:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class GameActivity extends Activity implements View.OnTouchListener
{
    private GameThread gt;
 
    public boolean onTouch(View p1, MotionEvent p2)
    {
        switch (p1.getId())
        {
            case R.id.l_rotor:if (p2.getActionMasked() == MotionEvent.ACTION_DOWN) gt.ship.leftOn();
                if (p2.getActionMasked() == MotionEvent.ACTION_UP) gt.ship.leftOff();
                break;
            case R.id.r_rotor:if (p2.getActionMasked() == MotionEvent.ACTION_DOWN) gt.ship.rightOn();
                if (p2.getActionMasked() == MotionEvent.ACTION_UP) gt.ship.rightOff();
                break;
        }
        return true;
    }
 
 
 
    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstance);
 
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);       
        setContentView(R.layout.game);
        SurfaceView sw=(SurfaceView)findViewById(R.id.game_surface);
        gt = new GameThread(getResources(), getWindowManager().getDefaultDisplay(), sw);
        Button b1=(Button)findViewById(R.id.l_rotor);
        Button b2=(Button)findViewById(R.id.r_rotor);
        b1.setOnTouchListener(this);
        b2.setOnTouchListener(this);
    }
 
    public void onPause()
    {
        super.onPause();
        gt.stopGame();
        Music.menuPlay();
        finish();
    }
 
}
И классы прорисовки лвл и обработки лвл:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
public class Level
{
    private int level;
    private LayerTiles map;
    private LayerSprite zone;
    private int[] cells={
        1,1,1,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,1,1,1,1,1,1,1,1,1
    };
    private int[] cells2={
        1,1,1,1,1,1,1,1,1,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,1,1,1,1,1,1,1,1,1
    };
    private int[] cells3={
        1,1,1,1,1,1,1,1,1,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,1,1,1,0,0,0,1,
        1,0,0,1,0,0,0,0,0,1,
        1,0,0,1,0,0,1,0,0,1,
        1,0,0,1,0,0,1,0,0,1,
        1,0,0,0,0,0,1,0,0,1,
        1,0,0,0,0,0,1,0,0,1,
        1,1,1,1,1,1,1,1,1,1
    };
    private int[] cells4={
        1,1,1,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,0,0,1,1,1,0,0,0,1,
        1,0,0,1,0,0,0,0,0,1,
        1,0,1,1,0,0,1,1,0,1,
        1,0,0,1,0,0,1,0,0,1,
        1,0,0,1,0,0,1,0,0,1,
        1,0,0,1,0,0,1,0,0,1,
        1,1,1,1,1,1,1,1,1,1
    };
    private int[] cells5={
        1,1,1,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,1,1,1,1,1,1,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,1,1,0,0,1,
        1,0,0,0,0,1,0,0,0,1,
        1,1,1,1,1,1,1,1,1,1
    };
    private int[] cells6={
        1,1,1,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,1,1,1,0,0,1,1,1,1,
        1,0,0,0,0,0,0,0,0,1,
        1,0,0,0,1,1,1,1,1,1,
        1,0,0,0,0,0,1,0,0,1,
        1,1,0,0,1,1,1,0,0,1,
        1,0,0,0,0,0,0,0,0,1,
        1,1,1,1,1,1,1,1,1,1
    };
    
 
 
 
    private Display d;
 
    public Level(Resources res, Display d)
    {
        this.d = d;
        level = 1;
        map = new LayerTiles(res, new int[]{R.drawable.tile}, cells, 10, 10);
        zone = new LayerSprite(R.drawable.zone, res);
    }
 
    public boolean collidesWith(LayerSprite ls)
    {
        return map.collidesWith(ls);
    }
 
    public boolean collidesZone(LayerSprite ls)
    {
        return zone.collidesWith(ls);
    }
 
    public void setLevel1()
    {
        level = 1;
        map.setCells(cells);
        map.setPosition((d.getWidth() / 2) - 150, (d.getHeight() / 2) - 150);
        zone.setPosition((d.getWidth() / 2) + 665, (d.getHeight() / 2) + 600);
    }
 
    public void nextLevel()
    {
        level++;
        switch (level)
        {
            case 2:map.setCells(cells2);
                break;  
            case 3:map.setCells(cells3);
                break;  
            case 4:map.setCells(cells4);
                break;  
            case 5:map.setCells(cells5);
                break;  
            case 6:map.setCells(cells6);
                break;  
        }
        map.setPosition((d.getWidth() / 2) - 150, (d.getHeight() / 2) - 150);
        zone.setPosition((d.getWidth() / 2) + 665, (d.getHeight() / 2) + 600);
    }   
 
    public void resetLevel()
    {
        map.setPosition((d.getWidth() / 2) - 150, (d.getHeight() / 2) - 150);
        zone.setPosition((d.getWidth() / 2) + 665, (d.getHeight() / 2) + 600);  
    }   
 
    public int getLevel()
    {
        return level;
    }
 
    public void move(int dx, int dy)
    {
        map.move(dx, dy);
        zone.move(dx, dy);
    }
 
    public void paint(Canvas c)
    {
        map.paint(c);
        zone.paint(c);
    }
 
}

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
public class GameThread extends Thread implements SurfaceHolder.Callback
{
 
 
    private SurfaceHolder sh;
    private Level level;
    public Ship ship;
    private LayerSprite bg;
    private Display d;
    private boolean stopping;
 
    public GameThread(Resources res, Display d, SurfaceView sv)
    {
        this.d = d;
        level = new Level(res, d);
        ship = new Ship(res);
        bg = new LayerSprite(R.drawable.bggame, res);
        stopping = false;
        sv.getHolder().addCallback(this);
    }
 
    public void run()
    {
        level.setLevel1();
        ship.setPosition((d.getWidth() / 2) - 20, (d.getHeight() / 2) - 20);
        bg.move(-400, -200);
        while (!stopping)
        {
            try
            {
                Thread.sleep(30);
            }
            catch (Exception e)
            {}
            draw();
            update();
        }
        sh.removeCallback(this);
    }
 
    public void draw()
    {
        Canvas c=sh.lockCanvas();
        c.drawColor(Color.BLACK);
        bg.paint(c);
        level.paint(c);
        ship.paint(c);
        sh.unlockCanvasAndPost(c);
    }
 
    public void drawMessage(Canvas c, String message)
    {
        Paint p=new Paint();
        p.setColor(Color.WHITE);
        p.setTextSize(40);
        p.setTextAlign(Paint.Align.CENTER);
        c.drawText(message, d.getWidth() / 2, d.getHeight() / 2, p);
    }
 
    public void update()
    {
        ship.update();
        level.move(-(int)ship.getInertionX(), (int)ship.getInertionY());
//проверка столкновения с уровнем
        if (level.collidesWith(ship))
        {
            Music.explosePlay();
            level.resetLevel();
            ship.setPosition((d.getWidth() / 2) - 20, (d.getHeight() / 2) - 20);
            ship.resetInertionAll();
            Canvas c=sh.lockCanvas();
            drawMessage(c, "Разбился");
            sh.unlockCanvasAndPost(c);
            try
            {
                Thread.sleep(2000);
            }
            catch (Exception e)
            {}
        }
//проверка успешной стыковки
        if (level.collidesZone(ship))
        {
            level.nextLevel();
            ship.setPosition((d.getWidth() / 2) - 20, (d.getHeight() / 2) - 20);
            ship.resetInertionAll();    
            Canvas c=sh.lockCanvas();
            drawMessage(c, "Уровень " + (level.getLevel() - 1) + " пройден!");
            sh.unlockCanvasAndPost(c);
            try
            {
                Thread.sleep(2000);
            }
            catch (Exception e)
            {}
        }
//проверка прохождения 6 уровня
        if (level.getLevel() > 6)
        {
            Canvas c=sh.lockCanvas();
            drawMessage(c, "Игра пройдена!");
            sh.unlockCanvasAndPost(c);
            try
            {
                Thread.sleep(3000);
            }
            catch (Exception e)
            {}
            stopping = true;
        }
        if (level.getLevel() == 3) Music.menuPlay();
    }
 
 
 
    public void stopGame()
    {
        stopping = true;
    }
 
 
    public void surfaceCreated(SurfaceHolder sh)
    {
        this.sh = sh;
        start();
    }
 
    public void surfaceChanged(SurfaceHolder sh, int i1, int i2, int i3)
    {}
 
    public void surfaceDestroyed(SurfaceHolder sh)
    {}
 
 
 
}

Помогите с написанием кода...для меню выбора уровней
Еще раз прошу прощения за корявое изъяснение цели
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
22.09.2015, 14:24     Сохранение и загрузка #12
Чего то я не понял зачем на все кнопки вешать setContentView. Что это дает?
По существу задачи: в обработке нажатия кнопки "Игра" в цикле перебирать кнопки уровней и согласно метке делать их активными или нет.
Метку прохождения уровня сохраняйте в конце кода уровня, если он пройден само собой.
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 14:53  [ТС]     Сохранение и загрузка #13
Чего то я не понял зачем на все кнопки вешать setContentView. Что это дает?
Гугл мне подсказал так обрабатывать нажатие на кнопку
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
22.09.2015, 14:57     Сохранение и загрузка #14
Цитата Сообщение от magicboy Посмотреть сообщение
Гугл мне подсказал так обрабатывать нажатие на кнопку
Плохой у вас гугл) Не очень хорошо просто менять разметку в активити, когда по идее нужно перейти на другую.
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 15:00  [ТС]     Сохранение и загрузка #15
По существу задачи: в обработке нажатия кнопки "Игра" в цикле перебирать кнопки уровней и согласно метке делать их активными или нет.
Метку прохождения уровня сохраняйте в конце кода уровня, если он пройден само собой.
Если не затруднит, можете как пример прописать на одну кнопку, а дальше я уже сам, просто еще раз повторюсь...я новичек в этом, и все что я предоставил это заслуга гугла...просто переделывал на свой лад

Добавлено через 2 минуты
Плохой у вас гугл) Не очень хорошо просто менять разметку в активити, когда по идее нужно перейти на другую.
Вы имеете ввиду что нужно создать отдельное активити и в нем уже заниматься этим?
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
22.09.2015, 15:06     Сохранение и загрузка #16
magicboy, я Вам советую начать с азов, без наезда Вы, насколько я вижу, сразу кинулись делать
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 15:19  [ТС]     Сохранение и загрузка #17
я Вам советую начать с азов, без наезда Вы, насколько я вижу, сразу кинулись делать
Как ни странно, но изучил я базовый уровень, а более углубленно решил изучать посредством создания мини игр
Как говорится "по ходу пьесы"
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
22.09.2015, 15:21     Сохранение и загрузка #18
magicboy, ну как же так, если Вы не знаете, как listener на вьюхи вешать, это, наверное, урок второй-третий.
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
22.09.2015, 15:22     Сохранение и загрузка #19
magicboy, тут хорошо написано для понимания азов. Лучше начать оттуда.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2015, 15:25     Сохранение и загрузка
Еще ссылки по теме:

Сохранение переменной Android
Сохранение данных из переменной Android
Android Сохранение данных
Android Сохранение Bitmap в галерею
Сохранение в SharedPreferences Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
magicboy
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 25
22.09.2015, 15:25  [ТС]     Сохранение и загрузка #20
ну как же так, если Вы не знаете, как listener на вьюхи вешать, это, наверное, урок второй-третий
эх...вывод сделан...пройдусь ка я по уроками буду править код...и потом методом научного тыка буду пытаться сделать все что меня интересовало
Yandex
Объявления
22.09.2015, 15:25     Сохранение и загрузка
Ответ Создать тему
Опции темы

Текущее время: 00:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru