Ten artykuł został stworzony dla starszych wersji GameMakera i może nie być aktualny.

Zegar analogowy

Sobota, 18 Lutego 2006, 22:44
Czas czytania 2 minuty, 56 sekund
Zgodne z GM: gm5 gm6 gm7 gm8
Dowiedz się jak poruszać obiekty po okręgu, tworząc zwykły zegar analogowy.
Nie raz na forum zadawano pytanie jak zrobić aby obiekt poruszał się po okręgu, zatem dzisiaj z nudów napisałem dość prosty przykład tego typu, czyli zegar analogowy. Najpierw omówię bardzo prosty zegar, potem zrobimy trochę trudniejszy.

Jedyne co musicie zrobić to stworzyć nowy obiekt i do Draw wklejać poniższy kod:

Najpierw namalujemy ramkę dla zegaru.
koddraw_circle(320,240,100,true);Teraz zdefinujemy za pomocą var kilka zmiennych: sekx,seky - pozycja grotu wskazówki od sekund, minx, miny - pozycja grotu wskazówki od minut,
godzx, godzy, kpozycja grotu wskazówki godzin, sekl, minl, godzl - długość wskazówki sekund, minut i godzin.
kodvar sekx,seky,minx,miny,godzx,godzy,sekl,minl,godzl;
sekl=100;
minl=90;
godzl=70;

Teraz ustawiamy wszystkie dane końcówek wskazówek, w tym celu posłużymy się dość zaawansowanym równaniem:
kodsekx=320+sekl*cos(degtorad(current_second*6-90));
seky=240+sekl*sin(degtorad(current_second*6-90));
minx=320+minl*cos(degtorad(current_minute*6-90));
miny=240+minl*sin(degtorad(current_minute*6-90));
godzx=320+godzl*cos(degtorad(current_hour*30-90));
godzy=240+godzl*sin(degtorad(current_hour*30-90));
sekundy i minuty mnożymy przez 6 dlatego, że 6*60=360, w przypadku godzin jest to 30*12, a od tego odejmujemy 90 stopni, dlatego że w Game Makerze (jak i w innych programach) kąt 0 stopni skierowany jest w prawo, a w zegarku w górę (czyli musimy albo odjąć 90 stopni, albo dodać 270). Liczba którą otrzymamy to kąt w pod którym powinna być skierowana wskazówka. Potem wyciągamy z tego sin lub cos, zależnie czy jest to współrzędna x czy y. Mnożymy to przez długość wskazówki i mamy już jej pozycję, wystarczy teraz tylko to wszystko dodać do pozycji z której wskazówka ma być malowana.

Na sam koniec namalujemy trzy strzałki
koddraw_arrow(320,240,sekx,seky,10);
draw_arrow(320,240,minx,miny,10);
draw_arrow(320,240,godzx,godzy,10);

Zegar ten niestety będzie mało przypominał taki prawdziwy, bowiem wskazówki będą przeskakiwały, i o ile z sekundami nie ma problemu, o tyle minuty już śmiesznie przeskakują... ale i to da się poprawić.


Ulepszamy zegar
Tego przykładu już nie będę tłumaczył, pobawcie się sami w jego modyfikowanie, porównajcie z poprzednim i zobaczcie różnice. Wadą tego zegara jest to że ma czasami do jednej sekundy opóźnienia w stosunku do czasu prawdziwego. Dzieje się tak dla tego, że od czasu włączenia zegarka do minięcia następnej sekundy czasami mija 5 setnych, czasem aż 100 i sprawdzenie w którym akurat jesteśmy momencie wymagało by jeszcze sporo linijek kodu.
W create dajemy:
kodsec=current_second;A w draw
kodif sec>60 then sec-=60;

sekx=320+sekl*cos(degtorad(sec*6-90));
seky=240+sekl*sin(degtorad(sec*6-90));
minx=320+minl*cos(degtorad((current_minute+(current_second/60))*6-90));
miny=240+minl*sin(degtorad((current_minute+(current_second/60))*6-90));
godzx=320+godzl*cos(degtorad((current_hour+(current_minute/60))*30-90));
godzy=240+godzl*sin(degtorad((current_hour+(current_minute/60))*30-90));


draw_arrow(320,240,sekx,seky,10);
draw_arrow(320,240,minx,miny,10);
draw_arrow(320,240,godzx,godzy,10);

for (i=0; i<360; i+=30)
{
var l1,l2,l3,l4;
l1=320+90*cos(degtorad(i-90));
l2=240+90*sin(degtorad(i-90));
l3=320+100*cos(degtorad(i-90));
l4=240+100*sin(degtorad(i-90));

draw_line(l1,l2,l3,l4);
}
Pętla for dodatkowo namaluje nam 12 kresek na zegarku.

Mam nadzieję, że dzięki temu przykładowi poznacie kilka ciekawych technik programowania, jak płynne przesuwanie obiektu i obliczanie pozycji na podstawie innych danych.
Komentarze (łącznie 26, wyświetlam 16 - 30):
F
~FIREMARK (Pią., 03 Mar. 06, 18:14)
#16

czy ktos powie,co oznacza degdorat i con + sin? nigdzie sie ne moge dowiedziec :(

pietrus (Pią., 03 Mar. 06, 19:32)
#17

Sinus, Cosinus :P

gnysek (Sob., 04 Mar. 06, 18:44)
#18

degtorad - stopnie na radiany. Radian - kąt płaski (jednostka pomocnicza układu SI). Pierwsza lekcja elektrotechniki w pierwszej klasie technikum :P

eXcLiFe (Sob., 04 Mar. 06, 22:34)
#19

Tak zgadzam się z qnysek pierwsze lekcje w Technikum elektronicznym ps.
(Moja spec. Audio Wizualne + Cyfrówa) coś tu dużo elektroników :D

K
kasa100 (Pon., 21 Maj. 07, 17:34)
#20

nie ma... :-(

k
~klech (śro., 03 Wrz. 08, 21:01)
#21

hej mi nie działa!

k
~klech (śro., 03 Wrz. 08, 21:03)
#22

Pomoże ktoś?pls

gnysek (śro., 03 Wrz. 08, 21:09)
#23

napisz na forum, to raz, a dwa - co nie działa ?

k
~klech (Pon., 08 Wrz. 08, 21:26)
#24

pokazuje że błąd jest w kodzie:draw_circle(320,240,100,true);

k
kryniak (Pon., 08 Wrz. 08, 21:39)
#25

A treść błędu? ;):*

G
Gunman (Nie., 31 Sty. 10, 12:08)
#26

Dobra, nie chce mi się liczyć. Ponad 100 błędów wyłapało jak uruchomiłem .exe

Najnowsze wersje GameMakera:

Stabilna
2024.14.0.207 • 2024.14.0.251
wydana  6 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 337 dni temu
Beta
2024.1400.0.911 •
2024.1400.0.899
 0.18.0

wydana 14 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
Shoutbox
gnysek (16:01, 16.10.25)
To już google decyduje. Mam wrażenie, ze po datach obcina stare treści.
S
Sutikku (10:42, 14.10.25)
Ja jeszcze trafiam na fora jak szukam konkretnych haseł (chociażby wczoraj zepsuty pendrive który się identyfikuje jako Phison 2307 Boot ROM). Teraz projekty opensource często mają społeczności na discordzie i tam jest tona przydatnych informacji ale niedostępna poza discordem. Fajnie by to było wyeksponować
Korodzik (04:24, 14.10.25)
A w sumie to forum się normalnie indeksuje w wyszukiwarkach? Bo ja stwierdziłem, że np. w Google ciężko znaleźć cokolwiek z gmclanowego forum. Większość tematów jest chyba nieindeksowana od dawna...
S
Sutikku (08:44, 13.10.25)
mam niedokończony projekt bota, którego dodaje się do discorda, a on synchronizuje wiadomości z discorda -> na readonly forum. Wtedy treści mogą być indeksowane z wyszukiwarek i łatwo dostępne bez logowania. No ale leży w czyśćcu i czeka.
Wojo (11:52, 11.10.25)
Może kiedyś powróci moda na fora internetowe. Pamiętam w sumie, że czasami aktywność rosła i malała, ale tak pusto to chyba jeszcze nigdy nie było i myślę, że ta cała migracja użytkowników jest zasługą Discorda i zmiany czasów. Po prostu lata dwudzieste spowodowały zmiany trendów w internecie
S
Sutikku (09:06, 08.10.25)
najwyższa pora zopensourcować kod gmclanu!
gnysek (10:33, 06.10.25)
Może tak zrobię :D Jak znajdę czas :D
I am Lord (10:49, 01.10.25)
Tutaj powinna być na głównej jakaś wielka informacja o tym że na Discordzie teraz wszystko jest
Wojo (20:34, 17.07.25)
Discordy i Facebooki pogrzebały erę forów internetowych...
gnysek (10:36, 04.07.25)
Bo wszyscy piszą na discordzie :)
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?