1

Тема: pygame 2d платформер

Пишу 2d платформер, в бібліотеці pygame, по суті майже все є, потрібна допомога з генерацією ворогів. Які мають атакувати головного героя.

2

Re: pygame 2d платформер

Код відкритий?

3

Re: pygame 2d платформер

Можу скинути кудись, оскільки там і спрайти і монстрів почав писати окремим кодом і імпротувати в основний, але зайшов у тупік оскільки новачок і тільки почав вивчати.

4

Re: pygame 2d платформер

GitHub же.

5 Востаннє редагувалося Monolith (30.03.2019 14:35:38)

Re: pygame 2d платформер

Якщо брати чисто алгоритм, то має бути список ворогів, тобто список об'єктів ворогів. Далі в залежності від якоїсь події, добавляєте в список (вірніше, ініціалізуєте) новий об'єкт ворога. Поведінку якого прописуєте методами у класі, а викликаєте їх вже в ігровому циклі.

Найпростіший варіант, в циклі (ігоровому) перевіряти кількість ворогів (довжину списку), якщо вона менша, ніж ..., то додаєте нового ворога. А далі вже перебираючи всіх ворогів (всі елементи списку) виконуєте якісь дії: перевіряєте здоров'я, рухаєте тощо. І окремо перевіряєте всі об'єкти на екрані на колізію (зіткнення). Але це вже залежить від гри. З PyGame не працював, тому не знаю як це там влаштовано, але основний алгоритм такий.

P.S. Сподіваюся допоміг. Якщо Ваша проблема була саме в цьому. Тому що, незалежно від рушія, алгоритм подібний зостається.

Подякували: maximk3011

6

Re: pygame 2d платформер

koala написав:

GitHub же.

https://github.com/Maximk301/2dgame

Подякували: koala1

7

Re: pygame 2d платформер

Для початку - перейдіть до об'єктно-орієнтованого проектування. У вас є клас bullet; тепер:
1. Винесіть обробку подій, пов'язаних із кулями, в цей клас. Тобто замість

      for bullet in bullets:
          if bullet.x < 500 and bullet.x > 0:
              bullet.x += bullet.vel
          else:
             bullets.pop(bullets.index(bullet))

і ще кількох шматків в основному коді зробіть функції в класі snaryad (перейменуйте його краще на Bullet), а в основному циклі їх смикайте.

class Bullet:
    ...
    def move(self):
        self.x += self.vel
    def check(self):
        return self.x < 500

...
Основний цикл:

    for b in bullets:
        b.move()
        if not b.check(): ...

Це допоможе, зокрема, вам розуміти, що саме відбувається - не "координата кулі змінилася на vel одиниць", а "куля перемістилася". Так зручніше думати над кодом.
2. Створіть клас Player, винесіть у нього поведінку гравця, і смикайте так само.
Якщо цей об'єкт матиме такі самі функції, як і куля, то можна буде їх викликати в одному циклі:

for object in game_objects:
    object.move() #для кулі - просунутися, для гравця - перевірити клавіатуру і відреагувати
    if not object.check(): #для кулі - якщо не вийшла за екран, для гравця - якщо не наштовхнувся на кулю, наприклад
        ...

3. Створіть клас Enemy, і тоді стане зрозуміло, як вам його генерувати.
4. Швидше за все, вам ще знадобиться об'єкт, щоб тримати решту - Stage чи Board чи ще якось так.

Не сприймайте ці фрагменти коду як однозначно правильні - це ваша гра, вам видніше, що саме робити з об'єктами. Але  в цілому воно буде якось так.

Подякували: maximk3011