EDEN

Tworzysz grę i chcesz się poszczycić postępami lub zasięgnąć opinii o niej? Pisz śmiało
Awatar użytkownika
Woobuz
Posty: 270
Rejestracja: 16 wrz 2012, 12:47
Lokalizacja: Bielsko Biała
Kontaktowanie:

EDEN

Postautor: Woobuz » 11 mar 2018, 22:07

Witajcie, Tromanowicze. Długo się nie odzywałem na forum, ale to z racji tego, że miałem sporo na głowie (sesja i te sprawy :P ). Ostatnio znajduję więcej czasu, więc pomyślałem, że stworzę na szybko jakąś gierkę.

Ale do rzeczy, gierka nosi tytuł EDEN (najpewniej będzie to zmienione), jest to pewne połączenie strategii i gry idle. Niedawno do gry wprowadziłem losowe generowanie terenu, w planach jest dodanie wielu innych funkcji i rzecz jasna zmiana grafiki, bo tutaj jest tymczasowa.

Problem zaczyna pojawiać się przy programowaniu wszystkiego w kostkach, bo robi się totalny bałagan. Dlatego potrzebuję pomocy ze strony tutejszych programistów Pythona, aby pomogli mi napisać kod, który będzie działał jak kostki. Chodzi mi jedynie o wytłumaczenie pewnych rzeczy w kodzie Pythona, gdyż wygląda on inaczej, niż np. w takiej Javie.


Poniżej podsyłam wam link do prezentacji gry oraz do pobrania z dysku google. Oczywiście jeżeli macie jakieś zastrzeżenia, rady, to piszcie śmiało.



https://drive.google.com/file/d/11UJbwJdFiFh3unvb0_7-3GA3DyiO9HTt/view?usp=sharing

Co do sterowania, pod Tabem macie informacje, poza tym generowanie terenu macie pod Num5. Miłego testowania.


Pozdrawiam ;)
"Bo w każdym z nas jest Chaos i Ład, Dobro i Zło. Ale nad tym można i trzeba zapanować. Trzeba się tego nauczyć."

Awatar użytkownika
maniek
Administrator
Posty: 619
Rejestracja: 18 lip 2012, 11:03

Re: EDEN

Postautor: maniek » 12 mar 2018, 9:02

Jeśli chodzi o strategie to nie jest mój ulubiony typ gry, ale fajnie to low-poly wygląda. Jeśli potrzebujesz pomocy w Pythonie to dawaj konkrety, postaram się pomóc
Nowy serwis z fajnymi, imprezowymi, niedrogimi koszulkami - http://fajne-koszulki.com.pl

Awatar użytkownika
Woobuz
Posty: 270
Rejestracja: 16 wrz 2012, 12:47
Lokalizacja: Bielsko Biała
Kontaktowanie:

Re: EDEN

Postautor: Woobuz » 27 mar 2018, 12:33

Przede wszystkim chciałbym dowiedzieć się, jak ustawiać wartości dla Property w Pythonie. I według ich wartości ustawiać Visibility dla konkretnego obiektu. Na tej zasadzie działa system w EDENie.


Przykład:

Jeśli kliknę w obiekt Cube, to jego property PROP (typu integer) zmieni wartość z 0 na 1. Jeśli PROP ma wartość 1, to dla obiektu, który jest sparentowany z A (tutaj małpka), ustawia się widoczność. Jeśli PROP ma inną wartość, to obiekt sparentowany jest niewidoczny.


Obrazek


Po opanowaniu tego, chciałbym nauczyć się operacji na liczbach, typu: jeśli PROP ma wartość 1, to co 60 ticków (sekundę) wartość property GRAIN powiększa się o 10. Czyli farma produkuje co sekundę 10 jednostek zboża.
"Bo w każdym z nas jest Chaos i Ład, Dobro i Zło. Ale nad tym można i trzeba zapanować. Trzeba się tego nauczyć."

Awatar użytkownika
maniek
Administrator
Posty: 619
Rejestracja: 18 lip 2012, 11:03

Re: EDEN

Postautor: maniek » 27 mar 2018, 15:25

Rozumiem, że powyższy screen obrazuje to co napisałeś i działa na kostkach?? I chciałbyś to samo w Pythonie?? Jeśli tak to wyślij mi ten plik..
Nowy serwis z fajnymi, imprezowymi, niedrogimi koszulkami - http://fajne-koszulki.com.pl

Awatar użytkownika
Woobuz
Posty: 270
Rejestracja: 16 wrz 2012, 12:47
Lokalizacja: Bielsko Biała
Kontaktowanie:

Re: EDEN

Postautor: Woobuz » 27 mar 2018, 21:22

http://hostuje.net/file.php?id=d8efb5533ed0f54dbe8eabe7575275f1

Proszę bardzo. Zmieniłem jedynie Assign na Add, żeby ta zmiana była widoczna.
"Bo w każdym z nas jest Chaos i Ład, Dobro i Zło. Ale nad tym można i trzeba zapanować. Trzeba się tego nauczyć."

Awatar użytkownika
maniek
Administrator
Posty: 619
Rejestracja: 18 lip 2012, 11:03

Re: EDEN

Postautor: maniek » 28 mar 2018, 8:48

A czy te obiekty mogą być sparentowane ?
Nowy serwis z fajnymi, imprezowymi, niedrogimi koszulkami - http://fajne-koszulki.com.pl

Awatar użytkownika
Woobuz
Posty: 270
Rejestracja: 16 wrz 2012, 12:47
Lokalizacja: Bielsko Biała
Kontaktowanie:

Re: EDEN

Postautor: Woobuz » 28 mar 2018, 19:12

Nawet muszą. System działa tak, że empty cube na scenie 1 spawnuje cube'a z teksturą i ten cube ma podpięte inne obiekty (poprzez property z cube'a dostają informację, który ma być widoczny)
"Bo w każdym z nas jest Chaos i Ład, Dobro i Zło. Ale nad tym można i trzeba zapanować. Trzeba się tego nauczyć."

Awatar użytkownika
maniek
Administrator
Posty: 619
Rejestracja: 18 lip 2012, 11:03

Re: EDEN

Postautor: maniek » 30 mar 2018, 1:50

Tak na szybko :

http://troman.pl/files/users/2/woobuz_eden.blend

Totalne minimum jeśli chodzi o kostki logiki : tylko Always, Mouse Over i Controller Python. Obyło się nawet bez property :)
Jeśli chcesz wyjaśnienia to pisz :

Kod: Zaznacz cały

import bge

cont = bge.logic.getCurrentController()
own = cont.owner
mouseOverSensor = own.sensors['mouseOver']

mouse = bge.logic.mouse
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED

if mouseOverSensor.positive :
    bge.logic.globalDict['visible_prop'] = bge.logic.globalDict.get('visible_prop')
           
    if mouse.events[bge.events.LEFTMOUSE] == JUST_ACTIVATED:

        children = own.children
           
        for child in children :
            if not bge.logic.globalDict['visible_prop'] :
                child.visible = False
            else :
                child.visible = True
               

        if not bge.logic.globalDict['visible_prop'] :
            bge.logic.globalDict['visible_prop'] = 1
        else :
            bge.logic.globalDict['visible_prop'] = 0
   
Nowy serwis z fajnymi, imprezowymi, niedrogimi koszulkami - http://fajne-koszulki.com.pl

Awatar użytkownika
Woobuz
Posty: 270
Rejestracja: 16 wrz 2012, 12:47
Lokalizacja: Bielsko Biała
Kontaktowanie:

Re: EDEN

Postautor: Woobuz » 30 mar 2018, 2:44

Dwie rzeczy mnie ciekawią. Czym jest to JUST_ACTIVATED (pytam o część KX - czego to dotyczy) i na jakiej zasadzie działa ten kod:

Kod: Zaznacz cały

for child in children :
            if not bge.logic.globalDict['visible_prop'] :
                child.visible = False
            else :
                child.visible = True
               

        if not bge.logic.globalDict['visible_prop'] :
            bge.logic.globalDict['visible_prop'] = 1
        else :
            bge.logic.globalDict['visible_prop'] = 0


Z całości kodu potrafię wywnioskować, że jeśli kursor jest nad rodzicem, to 'visible prop' jest aktywne i dzieją się na tym operacje.

Ale jak? Czym w ogóle jest globalDict? I jak działa to "if not/else"? Co sprawdza program i interpretuje to jako "if not"?
I jak działa ta druga część z 0 i 1? Sprawdziłem ją, usuwając kod i zauważyłem, że nie mogę już ustawić widzialności ponownie. Tylko jak program interpretuje te zera i jedynki jako wartość dla widzialności i niewidzialności? :shock:
"Bo w każdym z nas jest Chaos i Ład, Dobro i Zło. Ale nad tym można i trzeba zapanować. Trzeba się tego nauczyć."

Awatar użytkownika
maniek
Administrator
Posty: 619
Rejestracja: 18 lip 2012, 11:03

Re: EDEN

Postautor: maniek » 30 mar 2018, 10:42

Ogólnie moim zamierzeniem, było maksymalne przeniesienie funkcjonalności do skryptu, aby w samym Blenderze jak najmniej "Klikać". I tak w Blenderze musisz sparentować obiekty, dodać dwa sensory Always i Mouse, oraz Controller z podpiętym skryptem

KX_INPUT_JUST_ACTIVATED to jest jeden ze statusów klawisza, masz ich 4 :
KX_INPUT_NONE - wykonywanie poleceń skryptu, kiedy klawisz nie jest wciśnięty
KX_INPUT_JUST_ACTIVATED - wykonywanie poleceń skryptu, w momencie kliknięcia klawisza
KX_INPUT_ACTIVE - wykonywanie poleceń skryptu, kiedy klawisz jest przytrzymany
KX_INPUT_JUST_RELEASED - wykonywanie poleceń skryptu, w momencie odkliknięcia klawisza

Rzeczywiście tutaj zrobiłem odwrotnie - dla 0 obiekt jest widoczny, dla 1 niewidoczny. Użyłem globalDict, żeby nie wyklikiwać Property ręcznie w Blenderze, żeby przechowywać tą zmienną globalnie i pamiętać jej wartość.
Użycie samej zmiennej w Pythonie np.: visible_prop = 0 nie sprawdzi się, ponieważ w kolejnym przebiegu skryptu visible_prop znowu otrzyma wartość 0 i nie przechowuje poprzedniego stanu.

Konstrukcja if not sprawdza czy bge.logic.globalDict['visible_prop'] w ogóle istnieje(w pierwszym przebiegu skryptu nie istnieje - później następuje jej przypisanie)/ma wartość False/ma wartość 0 - wtedy ukrywam obiekty, w przeciwnym przypadku (else - kiedy istnieje/ma wartość True/ma wartość większą niż 0) wyświetlam te obiekty na powrót.

Nastepnie przypisuję odpowiednią wartość do bge.logic.globalDict['visible_prop'] odpowiednią wartość, aby po każdym kliknięciu myszki miała raz wartość 0 lub 1

Mam nadzieję, że coś wyjaśniłem ;)
Nowy serwis z fajnymi, imprezowymi, niedrogimi koszulkami - http://fajne-koszulki.com.pl


Wróć do „Gry w trakcie realizacji”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości