[#1] Invanoid
Tworzę grę , która jest połączeniem Arkanoida z grą Invaders . Po wstrzymaniu pracy nad grą "Ufo atak" , odświeżyłem stary projekt " INVANOID ". Poniżej przedstawiam filmik , jest kiepskiej jakości i przekłamuje kolory ... .

Film przedstawia wersję wczesno roboczą ale jak ktoś jest chętny do pomocy w projekcie , grafika , muzyka to zapraszam



Wydających gazetki i covery zapraszam do współpracy , do opublikowania wersji demo gry.

Planowane wydanie gry to maj 2022
[#2] Re: Invanoid

@djpiotrs, post #1

czy mi się wydaje, czy piłeczka momentami odbija się od ścian pod dziwnym kątem? Jak nie umiesz w kąty odbijania piłeczek, to polecam tu, zaimplementowałem te tajne wzory w swojej hakersko-inżynierskiej pracy dyplomowej. siedzi, pije i chrupki

Ostatnia aktualizacja: 19.12.2021 16:32:46 przez snajper
[#3] Re: Invanoid

@snajper, post #2

Ty to jesteś ... . OK Dla gracza wystarczy to co jest , było ... .
[#4] Re: Invanoid

@djpiotrs, post #3

no jestem, jestem, bo to nie było takie proste, że copy-paste czy podmienić literki odpowiednimi zmiennymi, co je oni tam sobie na wstępie przyjęli za dane wejściowe, bo tych danych zwyczajnie brak. Trzeba było hakować. A dodatkowo moja praca to nie było jakieś lamerskie przesuwanie kartona w 2D, tylko najprawdziwszy Kłejko-Descent.
tak że gdyby ktoś pracował nad Kłejko-Descentem na Amigę i głowił się nad wyliczeniami wektorów prędkości, to wklejam swój autorski kod pomocniczy, zrodzony w bólach:

// Wykrywa kolizje miedzy dwiema kulami i w razie wykrycia kolizji
// wylicza nowe wartosci skladowych predkosci.
// zrodlo algorytmow: http://www.tarabuk.cba.pl/niecentralne.htm
// argumenty:	ball *object1 - wskaznik do obiektu struktury ball, kula #1
//				ball *object2 - wskaznik do obiektu struktury ball, kula #2
void CollisionDetect(ball *object1, ball *object2) {

	// definicja zmiennych okreslajacych wspolrzedne srodkow kul w chwili t+1,
	// (po przesunieciu o aktualny wektor predkosci)
	double obj1_newpos_X = object1->position.x + object1->velocity.x * collision_distance * speed;
	double obj1_newpos_Y = object1->position.y - object1->velocity.y / (double)65536.0;
	double obj1_newpos_Z = object1->position.z + object1->velocity.z * collision_distance * speed;
	double obj2_newpos_X = object2->position.x + object2->velocity.x * collision_distance * speed;
	double obj2_newpos_Y = object2->position.y - object2->velocity.y / (double)65536.0;
	double obj2_newpos_Z = object2->position.z + object2->velocity.z * collision_distance * speed;

	// obliczenie odleglosci miedzy srodkami kul w chwili t+1
	double newdistance_x = abs(obj1_newpos_X - obj2_newpos_X);
	double newdistance_y = abs(obj1_newpos_Y - obj2_newpos_Y);
	double newdistance_z = abs(obj1_newpos_Z - obj2_newpos_Z);
	double newdistance_xyz = sqrt(math_sqr(newdistance_x) + math_sqr(newdistance_y) + math_sqr(newdistance_z));

	// jesli odleglosc miedzy srodkami kul w chwili t+1 <= sumie promieni obu kul, nastepuje kolizja
	if (newdistance_xyz < object1->radius + object2->radius) {

		// zwieksz licznik kolizji i wyswietl nowa wartosc w oknie dialogowym
		collision_counter++;
		change_text(IDC_EDIT_COLLISIONCOUNT, std::to_string(collision_counter));

		// definicje zmiennych okreslajacych aktualne wartosci skladowych predkosci,
		// wspolrzednych srodkow kul oraz odleglosci miedzy srodkami kul
		double obj1_velocity_X = object1->velocity.x;
		double obj1_velocity_Y = object1->velocity.y;
		double obj1_velocity_Z = object1->velocity.z;
		double obj2_velocity_X = object2->velocity.x;
		double obj2_velocity_Y = object2->velocity.y;
		double obj2_velocity_Z = object2->velocity.z;
		double obj1_currpos_X = object1->position.x;
		double obj1_currpos_Y = object1->position.y;
		double obj1_currpos_Z = object1->position.z;
		double obj2_currpos_X = object2->position.x;
		double obj2_currpos_Y = object2->position.y;
		double obj2_currpos_Z = object2->position.z;
		double currdistance_x = obj1_currpos_X - obj2_currpos_X;
		double currdistance_y = obj1_currpos_Y - obj2_currpos_Y;
		double currdistance_z = obj1_currpos_Z - obj2_currpos_Z;
		double currdistance_xz = sqrt(math_sqr(currdistance_x) + math_sqr(currdistance_z));
		double currdistance_xyz = sqrt(math_sqr(currdistance_x) + math_sqr(currdistance_y) + math_sqr(currdistance_z));

		// definicja zmiennej okreslajacych mase kul
		double mass = object1->mass / object2->mass;		

		double ctg_fi = currdistance_z / currdistance_x;
		double fi = 0.0 + atan(ctg_fi) + 0.5 * PI;			// kat pomiedzy osia X ukladu XYZ a osia A ukladu pomocniczego ABC

		// definicja zmiennej okreslajacej miare kata psi
		// pomiedzy osia
		double psi = acos(currdistance_xz / currdistance_xyz);

		// deklaracje zmiennych pomocniczych
		double obj1_velocity_XZ, obj2_velocity_XZ, obj1_velocity_XYZ, obj2_velocity_XYZ;
		double sin_theta1, sin_theta2, tg_theta1, tg_theta2, theta1, theta2;
		double tg_gamma1, tg_gamma2, gamma1, gamma2;
		double ABC_W1x, ABC_W1y, ABC_W1z, ABC_W2x, ABC_W2y, ABC_W2z, ABC_W1xz, ABC_W2xz;
		double ABC_W1x_s1, ABC_W2x_s1, ABC_W1y_s1, ABC_W2y_s1, ABC_W1z_s1, ABC_W1z_s2, ABC_W2z_s1, ABC_W2z_s2;
		double obj1_velocity_Y_s1, obj1_velocity_Y_s2, obj2_velocity_Y_s1, obj2_velocity_Y_s2;

		// jesli aktywna jest transmisja szeregowa, zapal LED-y przypisane kulom, miedzy ktorymi wystapila kolizja
		if (using_serial) {
			set_LED(object1);
			set_LED(object2);
		}

		// dlugosci wektorow predkosci wypadkowych na plaszczyznie XZ i w XYZ
		obj1_velocity_XZ = sqrt(math_sqr(obj1_velocity_X) + math_sqr(obj1_velocity_Z));
		obj2_velocity_XZ = sqrt(math_sqr(obj2_velocity_X) + math_sqr(obj2_velocity_Z));
		obj1_velocity_XYZ = sqrt(math_sqr(obj1_velocity_X) + math_sqr(obj1_velocity_Y) + math_sqr(obj1_velocity_Z));
		obj2_velocity_XYZ = sqrt(math_sqr(obj2_velocity_X) + math_sqr(obj2_velocity_Y) + math_sqr(obj2_velocity_Z));

		// obliczanie katow THETA pomiedzy wektorami predkosci wypadkowych kul na plaszczyznie XZ a osia X
		// ukladu wspolrzednych XYZ
		sin_theta1 = obj1_velocity_Z / obj1_velocity_XZ;
		sin_theta2 = obj2_velocity_Z / obj2_velocity_XZ;
		tg_theta1 = obj1_velocity_Z / obj1_velocity_X;
		tg_theta2 = obj2_velocity_Z / obj2_velocity_X;

		// kat theta musi byc liczony z (co)tangensa!! Ze wzgledu na wartosc sinusa/cosinusa,
		// ktory w mianowniku zawsze ma liczbe dodatnia
		theta1 = 0.0 + atan(tg_theta1);				// kat pomiedzy wektorem predkosci obj1_velocity_XZ oraz osia X
		theta2 = 0.0 + atan(tg_theta2);				// kat pomiedzy wektorem predkosci obj2_velocity_XZ oraz osia X
		if (sin_theta1 < 0) theta1 = theta1 + PI;
		if (sin_theta2 < 0) theta2 = theta2 + PI;

		// ponizsze jest, zeby miara katow nie byla ujemna. W sumie zbedne.
		if (theta1 < 0) theta1 = 2 * PI + theta1;
		if (theta2 < 0) theta2 = 2 * PI + theta2;

		// obliczanie katow GAMMA pomiedzy wektorami predkosci wypadkowych kul na plaszczyznie YZ a osia X
		// ukladu wspolrzednych XYZ
		tg_gamma1 = obj1_velocity_X / obj1_velocity_XZ;
		tg_gamma2 = obj2_velocity_X / obj2_velocity_XZ;
		if (((obj1_velocity_X < 0) && (obj1_velocity_Z >= 0)) || ((obj1_velocity_X >= 0) && (obj1_velocity_Z < 0))) { tg_gamma1 = -tg_gamma1; }
		if (((obj2_velocity_X < 0) && (obj2_velocity_Z >= 0)) || ((obj2_velocity_X >= 0) && (obj2_velocity_Z < 0))) { tg_gamma2 = -tg_gamma2; }
		gamma1 = 0.0 + atan(tg_gamma1);
		gamma2 = 0.0 + atan(tg_gamma2);

		// ponizsze jest, zeby miara katow nie byla ujemna. W sumie zbedne.
		if (gamma1 < 0) gamma1 = 2 * PI + gamma1;
		if (gamma2 < 0) gamma2 = 2 * PI + gamma2;

		// wyliczanie skladowych predkosci koncowych W obu kul po zderzeniu w ukladzie ABC
		// *_s1, *_s2 - skladniki do koncowych rownan
		ABC_W1x_s1 = obj1_velocity_XZ * cos(theta1 - fi);
		ABC_W2x_s1 = obj2_velocity_XZ * cos(theta2 - fi);
		ABC_W1y_s1 = obj1_velocity_XYZ * sin(gamma1 - psi);
		ABC_W2y_s1 = obj2_velocity_XYZ * sin(gamma1 - psi);
		ABC_W1z_s1 = obj1_velocity_XZ * ((mass - restitution) / (mass + restitution)) * sin(theta1 - fi);
		ABC_W1z_s2 = obj2_velocity_XZ * ((restitution + 1) / (mass + 1)) * sin(theta2 - fi);
		ABC_W2z_s1 = obj1_velocity_XZ * ((mass * (restitution + 1)) / (mass + 1)) * sin(theta1 - fi);
		ABC_W2z_s2 = obj2_velocity_XZ * ((1 - restitution * mass) / (mass + 1)) * sin(theta2 - fi);
		if (((obj1_velocity_X < 0) && (obj1_velocity_Z >= 0)) || ((obj1_velocity_X >= 0) && (obj1_velocity_Z < 0))) {
			ABC_W1x_s1 = -ABC_W1x_s1;
			ABC_W1z_s1 = -ABC_W1z_s1;
			ABC_W2z_s1 = -ABC_W2z_s1;
		}
		if (((obj2_velocity_X < 0) && (obj2_velocity_Z >= 0)) || ((obj2_velocity_X >= 0) && (obj2_velocity_Z < 0))) {
			ABC_W2x_s1 = -ABC_W2x_s1;
			ABC_W1z_s2 = -ABC_W1z_s2;
			ABC_W2z_s2 = -ABC_W2z_s2;
		}
		ABC_W1x = ABC_W1x_s1;
		ABC_W2x = ABC_W2x_s1;
		ABC_W1y = ABC_W1y_s1;
		ABC_W2y = ABC_W2y_s1;
		ABC_W1z = ABC_W1z_s1 + ABC_W1z_s2;
		ABC_W2z = ABC_W2z_s1 + ABC_W2z_s2;
		ABC_W1xz = sqrt(math_sqr(ABC_W1x) + math_sqr(ABC_W1z));
		ABC_W2xz = sqrt(math_sqr(ABC_W2x) + math_sqr(ABC_W2z));

		// wyliczanie skladowych predkosci koncowych w ukladzie XYZ
		obj1_velocity_Y_s1 = ABC_W1y * cos(psi);
		obj1_velocity_Y_s2 = ABC_W1xz * sin(psi);
		obj2_velocity_Y_s1 = ABC_W2y * cos(psi);
		obj2_velocity_Y_s2 = ABC_W2xz * sin(psi);
		if (((obj1_velocity_X < 0) && (obj1_velocity_Z >= 0)) || ((obj1_velocity_X >= 0) && (obj1_velocity_Z < 0))) { obj1_velocity_Y_s2 = -obj1_velocity_Y_s2; }
		if (((obj2_velocity_X < 0) && (obj2_velocity_Z >= 0)) || ((obj2_velocity_X >= 0) && (obj2_velocity_Z < 0))) { obj2_velocity_Y_s2 = -obj2_velocity_Y_s2; }
		obj1_velocity_X = ABC_W1x * cos(fi) - ABC_W1z * sin(fi);
		obj1_velocity_Z = ABC_W1x * sin(fi) + ABC_W1z * cos(fi);
		obj2_velocity_X = ABC_W2x * cos(fi) - ABC_W2z * sin(fi);
		obj2_velocity_Z = ABC_W2x * sin(fi) + ABC_W2z * cos(fi);
		obj1_velocity_Y = obj1_velocity_Y_s1 + obj1_velocity_Y_s2;
		obj2_velocity_Y = obj2_velocity_Y_s1 + obj2_velocity_Y_s2;

		// sprawdzanie kolizji ze scianami...
		if ((obj1_currpos_X + object1->radius >= (double)area.x / 2) || (obj1_currpos_X - object1->radius <= 0 - (double)area.x / 2)) {
			obj2_velocity_X = -obj2_velocity_X;
			object2->rotation_dir.x = -1.0 * object2->rotation_dir.x;
		}
		if ((obj1_currpos_Z + object1->radius >= (double)area.z / 2) || (obj1_currpos_Z - object1->radius <= 0 - (double)area.z / 2)) {
			obj2_velocity_Z = -obj2_velocity_Z;
			object2->rotation_dir.z = -1.0 * object2->rotation_dir.z;
		}
		if ((obj2_currpos_X + object2->radius >= (double)area.x / 2) || (obj2_currpos_X - object2->radius <= 0 - (double)area.x / 2)) {
			obj1_velocity_X = -obj1_velocity_X;
			object1->rotation_dir.x = -1.0 * object1->rotation_dir.x;
		}
		if ((obj2_currpos_Z + object2->radius >= (double)area.z / 2) || (obj2_currpos_Z - object2->radius <= 0 - (double)area.z / 2)) {
			obj1_velocity_Z = -obj1_velocity_Z;
			object1->rotation_dir.z = -1.0 * object1->rotation_dir.z;
		}
		if (obj1_currpos_Y + object1->radius >= (double)area.y / 2) { obj1_velocity_Y = -obj1_velocity_Y; }
		if (obj2_currpos_Y + object2->radius >= (double)area.y / 2) { obj2_velocity_Y = -obj2_velocity_Y; }

		object1->velocity.x = obj1_velocity_X;
		object1->velocity.y = obj1_velocity_Y;
		object1->velocity.z = obj1_velocity_Z;
		object2->velocity.x = obj2_velocity_X;
		object2->velocity.y = obj2_velocity_Y;
		object2->velocity.z = obj2_velocity_Z;
	}
}


(tak po prawdzie to ten jest na Windowsa, ewentualnie SmerfOS, bo Amiga ma jakieś starożytne kompilatory i one tak zaawansowanych obliczeń nie rozumio).
jest jeszcze osobny hakerski kod do obsługi grawitacji, ale to to już pewnie będą umieć sami.

Dla gracza wystarczy to co jest , było ... .

może inni się wypowiedzą. Wg mnie kulka w Arkanoidzie powinna jednak zachowywać się zgodnie z pewnymi prawami fizyki. Wystarczy obejrzeć grę na jutubie - jedyna sytuacja, w której kąty odbicia i padania piłeczki są zależne od dodatkowych czynników, to zderzenie z paletką (bo inaczej gra byłaby jednak trochę nudna...). Ewentualnie może jeszcze z "przeszkadzajkami" - nie wpatrywałem się.

Ostatnia aktualizacja: 20.12.2021 14:24:44 przez snajper
[#5] Re: Invanoid

@djpiotrs, post #1



Górna belka zmieniona
3
[#6] Re: Invanoid

@djpiotrs, post #5

to zmień jeszcze POWEP na POWER ;)
[#7] Re: Invanoid

@teh_KaiN, post #6

To jest R , jak się dobrze przyjrzysz to zobaczysz szeroki uśmiech
[#8] Re: Invanoid

@snajper, post #2

Obejrzałem filmik i też od razu rzuciło mi się w oczy nienaturalne odbicie piłki od górnej belki. Nie zawsze, ale często. Czasami odbija się zupełnie nienaturalnie - gdy jest pod kątem i odbija się w stronę, z której przyleciała. Wg mnie to do poprawy. Czasami też dostaje dodatkowego boosta przy odbiciu, nie wiem, czy to zamierzone.
[#9] Re: Invanoid

@marskow, post #8

Właściwie to jest zamierzone , gdyż gra nabiera dynamiki i jest nieprzewidywalna. Dlatego piłka jest naszym sprzymierzeńcem ale też i wrogiem. Staram się coś zmienić od typowego arkanoida. Mówiąc prosto , piłka odbita od paletki jest twoja , odbita od góry jest wroga. Oczywiście można to zmienić i zastosować pomysły Snajpera.
Poza tym to działa jak strzelanka , POWER to moc paletki. Aby nie dopuścić aby wróg przekroczył dolną krawędż , można wroga zniszczyć paletką.

Ostatnia aktualizacja: 23.12.2021 13:01:30 przez djpiotrs
[#10] Re: Invanoid

@djpiotrs, post #9

Mam nadzieję że ten serial nie będzie tak długi jak serial Hexmage Skoro to tutaj zacząłem to według planu lub wcześniej powinienem zakończyć.
Według zamierzeń gra ma być prosta i grywalna z jak najniższymi wymaganiami. Poniżej przedstawiam filmik walki z pierwszym Bosem.

1
[#11] Re: Invanoid

@djpiotrs, post #10

A tutaj są moje wypociny i tło od 11-stego etapu. Ciężko jest coś zrobić w ubogiej palecie barw


[#12] Re: Invanoid

@djpiotrs, post #11

a dlaczego to ma tylko 4 kolory ?
[#13] Re: Invanoid

@selur, post #12

Ma pięć kolorów. Po to żeby przeciwnicy byli lepiej widoczni . Jak się dojrzysz to i osiem naliczysz.

Ostatnia aktualizacja: 06.01.2022 15:26:12 przez djpiotrs
[#14] Re: Invanoid

@djpiotrs, post #13

"Jak się dojrzysz to i osiem naliczysz"

nie mam pod reka mikroskopu zeby az tyle dojrzec
[#15] Re: Invanoid

@djpiotrs, post #11

Ciężko jest coś zrobić w ubogiej palecie barw


złej baletnicy przeszkadza romb u spodnicy.





1
[#16] Re: Invanoid

@snajper, post #15

złej baletnicy przeszkadza romb u spodnicy


To prawda . Uważam że moja przygoda z grafiką i tak wychodzi na 4- . Nie zamierzam się poddawać i tą grę dokończę według swojego scenariusza i według własnej wiedzy graficznej.

Snajper . Te rysunki jak ktoś rysował to nie zrobił tego w jeden tydzień .... . Siedział i dłubał , dłubał i dłubał .... . aż wydłubał.
1
[#17] Re: Invanoid

@djpiotrs, post #16

A nie lepiej jakbys sie zajal czyms mniej dynamicznym ale bardziej grywalnym ?
Jakas gra turowa/przygodowa czy cus. Poki co wszystkie te Amosowe strzelanki, platformowki i inne zrecznosciowki wygladaja biednie...
1
[#18] Re: Invanoid

@selur, post #17

Skoro powiedziałem A to teraz muszę powiedzieć B > Ta gra musi być ukończona i jest grywalna. Jako po wieloletniej współpracy będziesz betatesterem i się przekonasz!

Amosowe strzelanki, platformowki i inne zrecznosciowki wygladaja biednie...


Amos ma potencjał ale ogranicza go A500 i 1mb ram. Twórcy Amosa myśleli przyszłościowo ale Commodore ich zawiodło.

Mieliśmy wiele projektów w dziale prywatnym ale zniechęciłem się bo zawsze we wszystkim widziałeś porażkę. Między innymi gra Mink Gold Return.
[#19] Re: Invanoid

@djpiotrs, post #18

Bo jestem wizjonerem i widze dalej niz inni

A ogolnie to serio...
nie moge zrozumiec dlaczego wszyscy chca robic w Amosie gry ktore do Amosa kompletnie nie pasuja !!!
a przeciez obok leza wspaniale gry z lat 90-tych - wielka kopalnia pomyslow.
Wystarczy po nie siegnac, pograc i napisac cos podobnego.
Jest tyle fajnych przygodowek, gier ekonomicznych, strategii turowych itp.. ktore nie wymagaja 30 klatek na sekunde.
Technicznie wszystkie gry Arcade, to najtrudniejsze do zakodowania rzeczy a tu wszyscy sie na nie uparli.
[#20] Re: Invanoid

@selur, post #19

Strategie turowe są fajne , tylko potrzebny dobry pomysł. Ja zawsze chciałem opierać się na Disciples 1. Na dopalonej Amidze da się to zrobić , coś podobnego i to w Amosie.
[#21] Re: Invanoid

@djpiotrs, post #20

Reasumując , Invanoid według mnie wygląda przyzwoicie i jest grywalna . Zastanawiam się tylko ile taka gra powinna mieć leveli ? Czy 40 wystarczy ? Bo taki jest plan. Żadnych bajerów , proste menu - start ,end . Klik i grasz.
[#22] Re: Invanoid

@djpiotrs, post #21

Zapisywanie highscore by się przydalo.
[#23] Re: Invanoid

@selur, post #19

Wiesz że łatwiej zrobić arkanoida czy sokobana niż grę strategiczno-ekonomiczną. Poza tym układy Amigi są przystosowane raczej do strzelanek. Co do Amosa to tu jest w miarę łatwo zrozumiały język i są książki. Kupiłem jakiś czas temu książkę do Blitz Basic od Pana Zalepy, ale tam pół książki jest opisywana sama instalacja i obsługa edytora TED. To raczej mało przydatne.

Ostatnia aktualizacja: 07.01.2022 16:39:47 przez tukinem

Ostatnia aktualizacja: 07.01.2022 16:40:10 przez tukinem
[#24] Re: Invanoid

@djpiotrs, post #11

Wracając do drugiego tła , zmieniłem na coś takiego ...




Na tym obrazku , dla mnie obiekty wyglądają bardzo dobrze i nie wtapiają się w tło. Uważam że przy takiej grze jest to ważne. Poza tym występuje jakby efekt pseudo 3d , tak zwanej
lekkiej głębi.
[#25] Re: Invanoid

@twardy, post #22

Twardy , będzie ,będzie
1
[#26] Re: Invanoid

@djpiotrs, post #25

Demo gry Invanoid , wersja 0.33
Sterowanie Joystick + klawiatura ( z= fire)
Ta wersja ma wiele błędów i jest niedopracowana więc proszę o wyrozumiałość . Ta wersja jest grywalna.

link
[#27] Re: Invanoid

@djpiotrs, post #26

przeszlem 10 leveli i po zniszczeniu Ufoka wyskakuje "file not found".
A ogolnie to nie zauwazylemm, zadnej zmiany miedzy poszczegolnymi poziomami.
[#28] Re: Invanoid

@selur, post #27

Pewnie zapodzialem jakiś plik w danych, bo to demo ma 14 leveli.
[#29] Re: Invanoid

@djpiotrs, post #26

Brawo za terminowe wydanie demka. OK

Takie połączenie Invaders i Arkanoida wygląda atrakcyjnie.
[#30] Re: Invanoid

@djpiotrs, post #26

Jest też krótki gameplay do obejrzenia:
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