kategoria: AMOS
[#1] Tworzenie gier
.
[#2] Re: Tworzenie dem
Witam.
Zająłem się nauką AMOSa na youtube polish retro channel. Zacząłem tworzenie plagiatu Sokobana w wersji ms-dos z 1984 roku, o którą kiedyś prosiłem na forum, jednak nikt nie chciał się tego podjąć. Początki wyszły super, jednak stworzenie samej fizyki gry to koszmar. Stworzyłem chłopka. Da się nim sterować, nie wychodzi poza krawędzie. I na tym koniec. Obawiam się, że jak zacznę wklepywać opis przesuwania paczek i zderzania się z murem, to braknie miejsca w Amosie, nie wiem zupełnie jak do tego podejść :) Co do samej gry to jestem zadowolony, bo i na A500 i na dopalonej 1200 działa tak samo płynnie po skompilowaniu. Wiem, że sam stworzyłeś Magazyn, więc może dasz jakieś rady co do fizyki gry?


Ostatnia aktualizacja: 10.07.2021 16:06:22 przez tukinem

Ostatnia aktualizacja: 10.07.2021 16:06:34 przez tukinem
[#3] Re: Tworzenie dem

@tukinem, post #2

Autor wątku niech się zdecyduje czy chce robić dema czy gry ;) Bo jeśli to drugie to chyba lepiej będzie jak przeniosę dyskusję do nowego wątku.
[#4] Re: Tworzenie dem

@tukinem, post #2

Co masz na myśli pisząc "braknie miejsca"?
[#5] Re: Tworzenie dem

@tukinem, post #2

Nie jestem pewien jak to zapisać w AMOSie, bo dawno w nim nie pisałem, inni koledzy może podpowiedzą.

1. Zacząłbym pracę od stworzenia wyliczenia kafelków w grze:

PODLOGA = 0,
ŚCIANA = 1,
SKRZYNIA = 2,
POLE DOCELOWE = 3,
SKRZYNIA ULOKOWANA = 4.

2. Następnie zadeklarowałbym typ tablicowy dwuwymiarowy (DIM), gdzie każdy element tej tablicy to rodzaj kafelka z utworzonego już wyliczenia.

3. Następnie należy znaleźć sposób na wypełnienie tej tablicy właściwymi liczbami (np. za pomocą edytora plansz, który trzeba stworzyć).

4. Teraz przechowujesz pozycję bohatera w zmiennych X i Y, które odpowiadają za współrzędne pola na którym znajduje się bohater.

5. Dodajesz funkcję do przemieszczania bohatera, która najpierw sprawdza, czy da się go przemieścić. Należy uwzględnić skrzynie. Taka funkcja pobierałaby kierunek ruchu w postaci dwóch liczb DX i DY, które przybierałyby wartości -1, 0 lub 1. Żeby wyznaczyć pole docelowe względem bohatera piszesz PLANSZA[Y + DY][X + DX].

6. Ta funkcja powinna uwzględniać lokowanie skrzyń na pola docelowe. Sprawdzasz pole na którym ma znaleźć się skrzynia. Jeśli jest to POLE DOCELOWE, ustawiasz typ na SKRZYNIA ULOKOWANA i dodajesz wartość jeden do liczby ulokowanych skrzyń (SKRZYNIE := SKRZYNIE + 1).

7. Jeżeli pchasz skrzynię, która już znajduje się na polu docelowym dodatkowo zmniejszasz tę liczbę o jeden (SKRZYNIE := SKRZYNIE - 1).

8. Jeżeli bohatera można przemieścić, jeszcze trzeba zaktualizować jego pozycję: X := X + DX; Y := Y + DY.

Tyle jeśli chodzi o podstawy fizyki gry w skrócie.

Zanim zaczniesz pisać kod w AMOSie, stwórz sobie szkic na kartce papieru i zanotuj informacje podobne do tych które Ci przekazałem. Z czasem robienie gry stanie się przyjemnością, jak już tylko zainteresujesz się metodami realizacji.

Ostatnia aktualizacja: 10.07.2021 16:32:35 przez Hexmage960
[#6] Re: Tworzenie dem

@tukinem, post #2

Polecam książkę " Programować może każdy Amos Pro w praktyce" Najpierw zapoznaj się z Amosem przez książkę. Zapoznaj się z przykładowymi programami a potem pisz grę lub demo.
1
[#7] Re: Tworzenie dem

@tukinem, post #2

braknie miejsca w Amosie

Co to znaczy?

No ale skoro masz problem z napisaniem warunku, który nie pozwoli wyjść postaci poza ekran to dobrze, że zacząłeś od AMOSa. Czy któryś ze zwolenników C/ASM uważa teraz inaczej?
[#8] Re: Tworzenie dem

@MDW, post #7

to nie chodzi o wychodzenie poza ekran, tylko o wychodzenie już na murek. Bardzo dużo funkcji trzeba zapisać jeśli plansza jest rozbudowana. Każdy kwadrat osobno praktycznie. Próbowałem tablicy DIM ale wywala mi błąd. Nie wiem, czy nie za dużo danych, bo dim poziomu mam 19 liczb, a dim pionu 15.
[#9] Re: Tworzenie dem

@tukinem, post #8

Dwie uwagi:

1. Żeby zrobić tablicę dwuwymiarową (macierz) stosujesz DIM tab(20,16) - czyli dwie liczby - wymiary po przecinku.

2. Numerujesz indeksy od liczby 0. Warto to zapamiętać, bo identycznie jest w języku C, czyli tab(0,0) oznacza lewy górny róg macierzy.

Tę pierwszą notę przekazałem Ci w wiadomości prywatnej.

Tak jak pisał DJPiotrs, zapoznaj się z AMOSem od podstaw - np. z książki Adama Zalepy, która wyszła ledwo parę lat temu.

Pisanie logiki gry - trzeba troszkę popracować we własnym zakresie.

Ostatnia aktualizacja: 10.07.2021 21:34:16 przez Hexmage960
[#10] Re: Tworzenie dem

@Hexmage960, post #9

Czuję że znów ktoś zapodał nam temat ........................ .
[#11] Re: Tworzenie dem

@tukinem, post #8

to nie chodzi o wychodzenie poza ekran, tylko o wychodzenie już na murek


W Amosie są takie instrukcje jak ZONE. RESERVE ZONE , SET ZONE , MOUSE ZONE , RESET ZONE
Dzięki tym instrukcjom możesz utworzyć zdarzenia obiektów na tle. Oczywiście że takie zdarzenia można zaprogramować za pomocą tablicy DIM lub za pomocą określonych zmiennych w programie.
Powtarzam jeszcze raz LITERATURA i przykłady " EXAMPLES " się kłaniają , bo mimo że Amos wydaje się prosty to nie jest tak łatwo .... .
[#12] Re: Tworzenie dem

@tukinem, post #2

Nie bierz się na poczatek za programowanie gry na tablicach. Zaprogramuj sobie na początek gre gdzie na dole ruszasz sobie koszyczkiem, a z góry spada wisienka ktora musisz złapać. Zrób to w trybie tekstowym. Potem kolejne proste gierki w stylu PONG-a; koszykówke, paletki itp. Ucz się pzrez kilka miesięcy co z czym, pisz sobie programy ktore będa wykorzystywać poszczególne komendy AMOS-a. Ucz się, nie zaczynaj od tablic bo rzucisz programowanie w diabły. I nie tylko AMOS-a ale tez Asm czy C, stwierdzisz że za trudne.
[#13] Re: Tworzenie dem

@Stoopi, post #12

Zaprogramuj sobie na początek gre gdzie na dole ruszasz sobie koszyczkiem, a z góry spada wisienka ktora musisz złapać. Zrób to w trybie tekstowym.

Bardzo słuszna i mądra uwaga.

Ja akurat lubię Robbo czy Boulder Dasha od samego początku obcowania z komputerem (C64/Atari XE). A to gry komórkowe.

Kochałem Robbo Konstruktor i przygotowywałem mapki na kartce.

Można oczywiście Sokobana zrobić również w trybie tekstowym.

Jasne, że można zacząć od takiego projektu wykorzystującego Duszki w AMOSie oraz wykrywanie kolizji, np. gra ze statkiem kosmicznym.

Z mojego doświadczenia warto zrobić jakąś bardzo prostą grę planszową - np. kółko i krzyżyk, młynek, bądź warcaby. Człowiek bardzo wówczas ćwiczy pisanie logiki gry. Potrzebna jest najprostsza grafika, np. plansza i pionek.

Sokoban wymaga projektowania plansz a to znaczne utrudnienie.

Również polecam testowanie poszczególnych instrukcji AMOSa.

--
P.S. Pierwsza gra, którą zrobiłem z bratem w AMOSie polegała na tym, że bohater u dołu biega i strzela do obiektów pojawiających się u góry.

Napisaliśmy ją na podstawie książki Pawła Chadzińskiego.

W grze były 3 skomponowane w Protrackerze przez nas i kolegów brata utwory muzyczne oraz 6 scenerii (podkładów graficznych oraz grafik postaci).

Ostatnia aktualizacja: 11.07.2021 10:08:33 przez Hexmage960
1
[#14] Re: Tworzenie dem

@Hexmage960, post #13

Zrobiłem po ciężkich trudach, że chłopek nie wchodzi na mur oraz przesuwanie paczek. Niestety jeszcze dochodzi to, gdy paczka jest zablokowana przez murek, lub przez drugą paczkę. Wykorzystałem tablicę dwuwymiarową do narysowania planszy. To ułatwi potem tworzenie innych leveli. Stworzenie samej fizyki gry to koszmar bez wiedzy :) nie ma książki dostępnej do kupienia, śledzenie PDFa jest niewygodne, a wydrukowanie 400 stron mało opłacalne :/ zmęczyłem to pętlami IF THEN, FOR NEXT itd. Pewnie zaraz poleci fala krytyki jak się przyznam bez bicia, że użyłem też GO TO, ale nie miejcie mi za złe. Sama gra chodzi trochę gorzej niż na PC, lecz cieszę się, że coś już stworzyłem po 4 dniach nauki. Przy użyciu "double buffer" wolno rysuje planszę, lecz dokładnie. Gdy nie użyję tej funkcji, to rysuje szybko, lecz boby w niektórych miejscach zasłaniają bitmapę stworzoną z murku wklejonego metodą "paste bob". Staram się tworzyć taki kod uniwersalny, żeby później od razu na innych poziomach działał bez problemu, dlatego wiele zmiennych jest użytych i wiele odnośników oraz pętli. Wszyscy mieli rację, że to porwanie się z motyką na księżyc, lecz efekty jakieś są.
P.S. Przy Amidze 500 i 9,5MB FastRAM Amos mi się kilka razy zawiesił, później na A1200 z 128MB zadziałało bez problemu i po powrocie do A500 też działało. Nie wiem co się wydarzyło, ale to chyba wina emulatora. Nie wytrzymał po całym dniu klepania :)
3
[#15] Re: Tworzenie dem

@tukinem, post #14

Przy zastosowaniu "Double Buffer" koniecznie po tej komendzie wpisz również "Autoback 0". To oznacza, że ekrany nie będą przerzucane po każdym narysowanym elemencie. W pętli głównej po narysowaniu już wszystkiego użyj "Screen Swap" i tym samym dasz sygnał, że ekrany mają być podmienione. Będzie duuużo szybciej.

Sprawdzania kolizji chłopka z murkami/skrzyniami w ogólne nie musisz robić na ekranie. Po prostu jak już zrobisz tablicę odwzorowującą etap, to w tej tablicy sprawdzasz czy np. po wychyleniu dżoja w prawo w tablicy (pozycja chłopka+1, pozycja chłopka) jest murek/skrzynia, czy też jest 'zero', czyli podłoga. Jeśli jest podłoga, to chłopek wykonuje przesunięcie w prawo, a jeśli jest coś innego niż podłoga, to wtedy się nie rusza/przesuwa skrzynię.

Ostatnia aktualizacja: 12.07.2021 07:44:50 przez mastaszek
1
[#16] Re: Tworzenie dem

@mastaszek, post #15

Dzieki za podpowiedź.
Co do przesuwania użyłem funkcji if...then jedank po wpisaniu if joy(1) itd i wpisaniu then chciałem od razu dać bob i,x,y,4 np. Wywala mi syntax error. Nie mogę po komendzie THEN dać umieszczania boba. Muszę dać odnośnik po THEN i dopiero tam umieszczam danego boba. Dziwne to trochę.
Co do czytania z tablicy, to paczki mam wpisane jako boby 4 i paczek mam 6. Gdy chłopek wchodzi w paczkę, to czytanie z tablicy nie powie mi którą paczkę nadepnął więc musiałem użyć BobCol i zapętlić w for I...next gdzie I to numery bobów paczek. Wtedy program sam szuka numeru paczki żeby odpowiednią przesunąć. Przy czytaniu z tablicy oczywiście przesuwał mi wszystkie paczki :)

Szczerze czasem te błędy fizyczne które wychodzą są śmieszne ale później po wielu próbach są męczące.

Ostatnia aktualizacja: 12.07.2021 07:55:14 przez tukinem
[#17] Re: Tworzenie dem

@tukinem, post #16

IF Joy(1)=jakiś kierunek

tutaj wszystko co się ma dziać

ENDIF
--------------------------------

w tablicy możesz mieć np:
0 - podłoga
1 - murek
2 i więcej - skrzynki

czyli każda skrzynka w tablicy ma swój osobny numerek i wtedy czytając z tablicy wiesz o którą skrzynkę chodzi






Ostatnia aktualizacja: 12.07.2021 08:00:10 przez mastaszek
[#18] Re: Tworzenie dem

@mastaszek, post #17

Aha jeszcze jedno pytanie.
Dając joystick w jakiś kierunek chłopek bezustannie zasuwa jak mario. Chciałbym żeby do każdego ruchu trzeba było osobno ruszać joyem. Trzeba wtedy np dać jakiś reset joy(1) czy repeat... until joy(1)=0?
[#19] Re: Tworzenie dem

@tukinem, post #18

wklej ten twój kod tutaj. Popatrzymy i przeanalizujemy
[#20] Re: Tworzenie dem

@mastaszek, post #19

Teraz nie mam dostępu do Amosa. Później jak siądę do komputera to dam znać. Chociaż będę musiał zrobić kopię bo szkoda mi kasować tamtych 3-dniowych wypocin.
[#21] Re: Tworzenie dem

@tukinem, post #20

W amosie zaznacz cały kod

Skopiuj ten blok do pomięci (Ctrl+s)

W menu BLOCK na górnej belce wybierz "SAVE ASCII"

Zapisze się plik tekstowy i ten plik wklej tu na forum.

PS. Najlepiej ustaw sobie w WinUAE dysk twardy, którym będzie windowsowy katalog. Wtedy tam zapisujesz pliki i masz do nich łatwy dostęp z poziomu windowsa.
[#22] Re: Tworzenie dem

@mastaszek, post #21

Ok zaraz tak zrobię, lecz jeśli wrzucę tu na forum tak brzydko napisany program to się boję że mi admin konto zablokuje bo wstyd :)
1
[#23] Re: Tworzenie dem

@tukinem, post #22

link
tu jest ten kod, jednak jest coś poprzestawiane, bo w kodzie w Amosie mam początek taki:
KOLOR$="c"
Screen Open 0,320,256,16,Lowres
CLS1:Flash Off:Curs Off:Ink 0

a tu w notatniku jest poprzestawiane wszystko
[#24] Re: Tworzenie dem

@tukinem, post #23

KOLOR$="c"
Screen Open 0,320,256,16,Lowres

Cls 1 : Flash Off : Curs Off : Ink 0



If KOLOR$="c" Then Load Iff "dane/brush"
If KOLOR$="t" Then Load Iff "dane/brush_tandy"
Get Bob 1,1,1 To 16,17
Get Bob 2,18,1 To 33,17
Get Bob 3,35,1 To 50,17
Get Bob 4,52,1 To 65,17
Get Bob 5,69,1 To 84,17
Get Bob 6,86,1 To 100,17

Cls 2
Double Buffer

Draw 42,28 To 278,28
Draw 42,234 To 278,234
Draw 42,28 To 42,234
Draw 278,28 To 278,234


Draw 44,30 To 276,30
Draw 44,232 To 276,232
Draw 44,30 To 44,232
Draw 276,30 To 276,232
Dim TAB(19,16)

Rem**********
RemLEVEL1
Rem**********

TAB(5,4)=6
TAB(6,4)=6
TAB(7,4)=6
TAB(8,4)=6
TAB(9,4)=6

TAB(5,5)=6
TAB(9,5)=6

TAB(9,6)=6
TAB(5,6)=6

TAB(3,7)=6
TAB(4,7)=6
TAB(5,7)=6
TAB(9,7)=6
TAB(10,7)=6

TAB(3,8)=6
TAB(10,8)=6

TAB(1,9)=6
TAB(2,9)=6
TAB(3,9)=6
TAB(5,9)=6
TAB(7,9)=6
TAB(8,9)=6
TAB(10,9)=6
TAB(14,9)=6
TAB(15,9)=6
TAB(16,9)=6
TAB(17,9)=6
TAB(18,9)=6
TAB(19,9)=6

TAB(1,10)=6
TAB(5,10)=6
TAB(7,10)=6
TAB(8,10)=6
TAB(10,10)=6
TAB(11,10)=6
TAB(12,10)=6
TAB(13,10)=6
TAB(14,10)=6
TAB(19,10)=6

TAB(1,11)=6
TAB(19,11)=6

TAB(1,12)=6
TAB(2,12)=6
TAB(3,12)=6
TAB(4,12)=6
TAB(5,12)=6
TAB(7,12)=6
TAB(8,12)=6
TAB(9,12)=6
TAB(11,12)=6
TAB(13,12)=6
TAB(14,12)=6
TAB(19,12)=6

TAB(5,13)=6
TAB(11,13)=6
TAB(12,13)=6
TAB(13,13)=6
TAB(14,13)=6
TAB(15,13)=6
TAB(16,13)=6
TAB(17,13)=6
TAB(18,13)=6
TAB(19,13)=6

TAB(5,14)=6
TAB(6,14)=6
TAB(7,14)=6
TAB(8,14)=6
TAB(9,14)=6
TAB(10,14)=6
TAB(11,14)=6

TAB(18,12)=5
TAB(18,11)=5
TAB(18,10)=5
TAB(17,12)=5
TAB(17,11)=5
TAB(17,10)=5

TAB(6,6)=4
TAB(6,8)=4
TAB(8,8)=4
TAB(8,7)=4
TAB(6,11)=4
TAB(3,11)=4

TAB(12,12)=1

POLA=6
SKRZYNIE=6




B=1
For X=1 To 19
For Y=1 To 16
XP=(X-1)*12+46
YP=(Y-1)*12+32
If TAB(X,Y)=6 Then Paste Bob XP,YP,6
If TAB(X,Y)=5 Then Bob POLA+30,XP,YP,5 : POLA=POLA-1
If TAB(X,Y)=4 Then Bob SKRZYNIE+3,XP,YP,4 : SKRZYNIE=SKRZYNIE-1
If TAB(X,Y)=1 Then Bob 1,XP,YP,B : XP=XB : YP=YB
Next Y
Next X


SKRZYNIE=6
X=12
Y=12







250


Rem****** PETLA WLASCIWA *******


Do
Bob 1,(X-1)*12+46,(Y-1)*12+32,B
RUCHX=0
RUCHY=0
Wait 3

If Joy(1)=1 Then RUCHY=-1 : B=3 : C=3
If Joy(1)=2 Then RUCHY=1 : B=3 : C=4
If Joy(1)=4 Then RUCHX=-1 : B=1 : C=1
If Joy(1)=8 Then RUCHX=1 : B=2 : C=2
If X<1 Then X=1
If X>19 Then X=19
If Y<1 Then Y=1
If Y>16 Then Y=16



For I=4 To 9
If Bob Col(1,4 To I)=-1 Then Goto MOVEBOX

Next I



If TAB(X,Y-1)=6 and RUCHY=-1 Then RUCHY=0 : Goto 300
If TAB(X,Y+1)=6 and RUCHY=1 Then RUCHY=0 : Goto 300
If TAB(X-1,Y)=6 and RUCHX=-1 Then RUCHX=0 : Goto 300
If TAB(X+1,Y)=6 and RUCHX=1 Then RUCHX=0 : Goto 300

300

X=X+RUCHX
Y=Y+RUCHY
Wait 2

Rem Locate 10,30
Rem Print "kolizja: ";Bob Col(1,4 To I);" i :";I
Loop

MOVEBOX:
If C=1 Then Bob I,(X-2)*12+46,(Y-1)*12+32,4
If C=2 Then Bob I,X*12+46,(Y-1)*12+32,4
If C=3 Then Bob I,(X-1)*12+46,(Y-2)*12+32,4
If C=4 Then Bob I,(X-1)*12+46,Y*12+32,4
Goto 250
[#25] Re: Tworzenie dem

@tukinem, post #24

najpierw wczytywane są boby
potem rysuję ramkę planszy
później definiuję tablicę: 1 to chłopek odwrócony w lewo, 2 to w prawo, 3 to w pionie, 4 paczka, 5 pole na paczkę i 6 to murek
później pętle rysują planszę
zmienna B to pozycja chłopka (1,2 lub 3)
zmienna C to kierunek chłopka (1,2,3 lub 4)
ruchx to przesunięcie w poziomie
ruchy to przesunięcie w pionie
x,y - pola planszy, jednak nie uwzględniłem, że współrzędne zaczynają się od 0 więc czasem gdy trzeba dałem (x-1), (y-1)

wypisywanie kolizji bobów na ekranie to taka pomoc dla mnie i czasem ją włączam
[#26] Re: Tworzenie dem

@tukinem, post #25

Wieczorem nad tym siądę. Wydaje mi się, że lepiej skrzynki też rysować jako paste bob, bo nie ma potrzeby stałego rysowania wszystkich skrzynek (jako boby). Im więcej skrzynek, tym więcej bobów i będzie coraz wolniej. A chłopka można rysować jako sprite. A całą mechanikę oprzeć o tablicę levelu i ogóle nie sprawdzać kolizji na ekranie.

Ostatnia aktualizacja: 12.07.2021 09:02:10 przez mastaszek
[#27] Re: Tworzenie dem

@mastaszek, post #26

nie da rady bo rysując skrzynie, program nie wykasuje odpowiedniej skrzyni i nie przesunie jej
opcja autoback 0 jeszcze pogorszyła efekt, dałem autoback 1 lecz niewiele to pomogło
screen swap spowodował że ekran zaczął migać całkiem
dodałem repeat...until joy(1)=0 i teraz sterowanie jest przyjemne, tylko jedną funkcję WAIT usunąłem
1
[#28] Re: Tworzenie dem

@mastaszek, post #26

Już chyba nie musisz :) można powiedzieć, że dojechałem do mety, ale dzięki za pomoc. Gdy paczka jest blokowana to nie przesunie się jej. Problemem było to, że po przesunięciu paczki nie uaktualniała się tablica z paczkami. Sprawdziłem teraz na wszystkie sposoby i gra zachowuje się już właściwie.
Zostało dołożenie kiedy wygrywa się poziom i potem samo wklepywanie leveli a później już jakieś retusze graficzne.
1
[#29] Re: Tworzenie dem

@tukinem, post #28

No to elegancko. Trzymam kciuki
[#30] Re: Tworzenie dem

@tukinem, post #18


Jedną z możliwości jest zapamiętywanie stanu joya w poprzedniej klatce

np. zmienną joy_prawo_prev

sprawdzasz stan tej zmiennej i stanu joya, jeśli joy_prawo_prev = 0 i joy = 1, to wywołujesz jakąś funkcję, albo zapisujesz do jakiejś zmiennej np. ruch_w_prawo (potem trzeba wstawić 0 po wykonaniu tego ruchu), zapisujesz stan joy'a do zmiennej joy_prawo_prev

Takie prymitywne wykrywanie zdarzeń.

Ostatnia aktualizacja: 12.07.2021 14:14:03 przez san_u
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem