Skocz do zawartości

Cała aktywność

Kanał aktualizowany automatycznie

  1. Wczoraj
  2. Ostatni tydzień
  3. Kolejna paczucha do Unity. Pierwsza wersja była wybrakowana i tylko rewrite mógł to naprawić
  4. Wiem, że nie ładnie tak post pod postem ale rozwiązałem problem. Był jakiś problem z WhatSee array nie wiem dlaczego, ale jak na liście były obiekty których nie ma na mapie, to kod dostawał małpiego rozumu 🤷‍♂️ więc po prostu stwierdziłem, że najłatwiej będzie sprawdzać listę na bieżąco i ją aktualizować. Nie zamykam tematu w razie jak by coś w tym kodzie dalej nie działało. Na razie poprawiłem jedno, zaraz będę patrzył co się stanie jak będzie więcej obiektów na mapie i jak się zachowa pętla for, to zaktualizuję kod po poprawkach [1]: if global.gamestart{ show_debug_message("Game_Start"); switch(ActualState){ case WarriorState.Think: show_debug_message("CASE WARRIORSTATE.THINK"); var WhatSee = []; var ColRad = 256; if instance_exists(Enemy[0]){ array_push(WhatSee,Enemy[0]); } if instance_exists(Enemy[1]){ array_push(WhatSee,Enemy[1]); } if instance_exists(Enemy[2]){ array_push(WhatSee,Enemy[2]); } if (!MyWeapon[WeaponType.Have]){ if instance_exists(o_StartChest){ array_push(WhatSee,o_StartChest); } if instance_exists(o_DroppedWeaponParent){ array_push(WhatSee,o_DroppedWeaponParent); } } if(!HaveHealPotion){ if instance_exists(o_DroppedHealPotion){ array_push(WhatSee,o_DroppedHealPotion); } } for(i = 0; i < array_length(WhatSee); i++){ show_debug_message("WhatSee["+string(i)+"] :"+string(WhatSee[i])); } //show_debug_message("Check i have HealPotion"); if HaveHealPotion{ //show_debug_message("I have HealPotion"); if MyHp < MyMaxHP / 5{ ActualState = WarriorState.Heal; } else { //show_debug_message("But My Life Is Too Hight to use it"); } } ActualState = WarriorState.GoToMiddle; show_debug_message("START FOR LOOP // Check collision circle with nearest obj"); for(i = 0; i < array_length(WhatSee); i++){ show_debug_message("'I' INDEX: " + string(i)); var NearObj = instance_nearest(x,y,WhatSee[i]); show_debug_message("Nearest Instance: " + string(NearObj)+" / "+string(object_get_name(NearObj.object_index))); show_debug_message("START CHECKING COLLISON CIRCLE"); if(NearObj != noone){ if collision_circle(x,y,ColRad,NearObj,true,true){ show_debug_message("=======================HAVE COLLISION: ============================="+string(NearObj)); if !collision_line(x,y,NearObj.x,NearObj.y,o_wall,false,true){ show_debug_message("No Collision with wall!"); show_debug_message("START SWITCH GETNAME"); switch(NearObj.object_index){ case Enemy[0]: case Enemy[1]: case Enemy[2]: show_debug_message("SWITCH CASE 0 1 2 // GO TO ENEMY"); ActualState = WarriorState.GoToEnemy; Gox = NearObj.x; Goy = NearObj.y; break; case o_StartChest: show_debug_message("SWITCH CASE 3 // GO TO CHEST"); if MyWeapon[0] == false{ ActualState = WarriorState.GoToChest; Gox = NearObj.x; Goy = NearObj.y; } else { show_debug_message("I HAVE WEAPON I BACK TO THINK"); ActualState = WarriorState.Think; } break; case o_DroppedWeaponParent: case o_DroppedHealPotion: show_debug_message("SWITCH GO TO GET ITEM"); Move = true; Gox = NearObj.x; Goy = NearObj.y; NearDropedItem = NearObj; ActualState = WarriorState.GetItem; break; } } } } } break;
  5. Nie no, reszta kodu poglądowo tylko, głównie chodzi o tę pierwszą część. Tutaj masz rację pętla for jest ciągle kontynuowana, więc dlatego kod nie działa jak znajdzie kolizję, bo szuka kolejnej w pętli, to poprawię ale dalej jest sedno problemu. Z jakiegoś powodu, czasami kod wykrywa kolizję z obiektem, a czasami nie... mianowicie, kod wykonuje się do show_debug_message("START FOR"); for(i = 0; i < array_length(WhatSee); i++){ show_debug_message("CHECK I:" + string(i)); var NearObj = instance_nearest(x,y,WhatSee[i]); show_debug_message("START CHECKING COLLISON"); if collision_circle(x,y,ColRad,NearObj,true,true){ I tutaj jest zwrot akcji, nawet po sprawdzeniu nazwy obiektów i jaki obiekt wykrywa mimo, że nazwa najbliższego obiektu == nazwa docelowego obiektu z tablicy, Collision_circle nie wykrwya kolizji z obiektem, mimo przechodzenia obok niego na ok 32PX. Tutaj jest problem. Jak bym napisał kod bez tablicy na wykrywaniu obiektu normalnie (~~if instance_nearest(x,y,o_startchest)), to ten obiekt zostanie wykryty bez problemu. Kiedy postać przechodzi obok skrzyni wygląda to tak (debugmsg trochę zmieniłem teraz) Index 3 to o_startchest i tutaj powinna być kolizja, tylko o to w sumie się rozchodzi, dlaczego nie może porównać Nearobj z collision_circle to mnie ciekawi 😮 nawet dodałem przed switch zmienną getname, i dalej dupa if collision_circle(x,y,ColRad,NearObj,true,true){ show_debug_message("HAVE COLLISION: "+string(NearObj)); if !collision_line(x,y,NearObj.x,NearObj.y,o_wall,false,true){ show_debug_message("OBJ NAME 2"+string(NearObj)); var getname = object_get_name(NearObj.object_index); switch(getname){ case Enemy[0]: case Enemy[1]: Zaraz dalej będę kombinował, zapewne jak zawsze jakaś pierdoła jak to u mnie i psuje wszystko
  6. Wcześniejsza
  7. Tego kodu jest trochę za dużo, żeby przeanalizować, zwłaszcza, że większość zmiennych nie ma w sumie w przypadku tego pytania związku z sednem problemu (tworzenie krwi, wybranie armora). Spójrz na pętlę z WhatSee. Tam jest takie fajne sprawdzanie po kolei na typach obiektów i JEŚLI zaszła kolizja z danym typem obiektu, to wtedy wybierane jest state (i pętla jest kontynuowana!!!!), ale jeśli nie, to state zmienia się na "idź na środek". } else { show_debug_message("----------------------------NO COLLISION GO TO MIDDLE"); ActualState = WarriorState.GoToMiddle; } Wygląda więc tak, że możesz w jednej pętli znaleźć Enemy[0], ale wtedy nadal sprawdzisz Enemy[1], potem nie znajdzie Enemty[2] więc state będzie na GoToMiddle, ale potem pętla nadal szuka pozostałych obiektów i np. jeśli jest kolizja z o_DroppedHealPotion to do niego podejdzie, a jak nie to znów trafi na state GoToMiddle. Błąd polega więc na tym, że po pierwsze pętla przechodzi wszystkie typy obiektów i nie jest kończona, gdy znajdziesz kolizje, a po drugie, że state ustawia się na GoToMiddle za każdym razem, jak jednego z typów obiektów nie znajdzie (i kolejny typ może to nadpisać). Rzeczy, które można by zrobić to: a) wyjście z pętli for (WhatSee) jak zmieniono state b) ustawienie state na GoToMiddle przed pętlą, żeby pętla ewentualnie nadpisała ten stan, wtedy nie będzie potrzebny ten else (można też zrobić wariant z dodatkową zmienną tymczasową, która sprawdza, czy została znaleziona jakaś kolizja i jeśli nie, to wtedy ustawia GoToMiddle, nie ma tutaj to większego znaczenia, chodzi jednak o to, żeby to nie był else na każdym typie tego co przeszukujesz w pętli WhatSee). Może napiszę nieco jaśniej jak rozumiem Twoją pętlę: var search = [obj_enemyA, obj_enemyB, obj_healhtpack, obj_item]; for(var i = 0; i < array_length(search); i++) { if (collision_circle(...)) { state = <zrob_cos>; // to by się przydał break; w pętli :) } else { state = <idz_na_srodek>; } } I powinno być widać problem. Jeśli np. istnieje obj_enemyA, a nie istnieje obj_item, to zawsze state będzie wybrany, aby iść na środek Np. coś w ten deseń: var search = [obj_enemyA, obj_enemyB, obj_healhtpack, obj_item]; state = <idz_na_srodek>; // domyślny, pętla go ewentualnie nadpisze for(var i = 0; i < array_length(search); i++) { if (collision_circle(...)) { state = <zrob_cos>; break; } } Myślę, że gdyby w debuggerze postawić breakpoint, to byś to bez problemu znalazł Btw. do celów debugowych string(NearObj.object_index) zamienić można chyba na object_get_name(NearObj.object_index)
  8. Mam problem z AI. Założenie AI jest takie, że ma myśleć nad krokami, nie jest to jakoś mocno złożone, Na podstawie collision_circle ma sprawdzić, z jakim obiektem koliduje *r = 256, wybieranie obiektu leci w pętli for, i na jej podstawie wybierany jest obiekt, który jest najbliżej (lista obiektów to tablica). Problem jest taki, kiedyś pisałem coś podobnego, działało... Przykładu nie mam więc się zastanawiam co poszło nie tak. Postacie, z miejsca lecą na środek roomu, mijają skrzynie do której mają zajrzeć, bo niby jej nie wykrywa, nie ważne czy zmienna to NearObject czy NearObject.object_index, ogólnie kod wykonuje się do if collision_circle ale ładuje go na false, bo nie wykrywa danej kolizji z tablicy, przez co postacie lecą na środek pokoju, jak się spotkają, zamiast się atakować, to już stoją, tak bo nie działa tablica. I teraz pytanie, co poszło nie tak... Myślę nad napisaniem kodu kod po kroku bez tablicy, w tedy na pewno zadziała, jednak nadłożę, dużo linijek. Tutaj poszło coś o czym moja wiedza na temat GMS2 jest ograniczona i bez podpowiedzi chyba już tego nie ogarnę. Linijka o którą chodzi. (debug message pisane na szybko by zobaczyć co się dzieje). PS. Pamiętam w GM 8.1 dało się skopiować kod całego obiektu na raz, czy GMS2 ma taką możliwość? PS.2 Projekt jest w RunTime 2023.11.1.160 if global.gamestart{ show_debug_message("Game_Start"); switch(ActualState){ case WarriorState.Think: show_debug_message("START THINK"); var WhatSee; var ColRad = 256; if !HaveHealPotion and !MyWeapon[WeaponType.Have]{ show_debug_message("I DONT HAVE POTION OR WEAPON"); WhatSee = [Enemy[0],Enemy[1],Enemy[2],o_StartChest,o_DroppedWeaponParent,o_DroppedHealPotion]; } else { if !HaveHealPotion and MyWeapon[WeaponType.Have]{ show_debug_message("i dont have potion and have weapon"); WhatSee = [Enemy[0],Enemy[1],Enemy[2],o_DroppedHealPotion]; } else { if HaveHealPotion and !MyWeapon[WeaponType.Have]{ show_debug_message("i have potion and dont have weapon"); WhatSee = [Enemy[0],Enemy[1],Enemy[2],o_StartChest,o_DroppedWeaponParent] } } } show_debug_message("Check HP is lower than maxhp / 5 "); if HaveHealPotion{ if MyHp < MyMaxHP / 5{ ActualState = WarriorState.Heal; } } show_debug_message("START FOR"); for(i = 0; i < array_length(WhatSee); i++){ show_debug_message("CHECK I:" + string(i)); var NearObj = instance_nearest(x,y,WhatSee[i]); show_debug_message("START CHECKING COLLISON"); if collision_circle(x,y,ColRad,NearObj,true,true){ show_debug_message("----------------------------------HAVE COLLISION: "+string(NearObj)); if !collision_line(x,y,NearObj.x,NearObj.y,o_wall,false,true){ show_debug_message("I SEE IT"); show_debug_message("OBJ NAME 2"+string(NearObj.object_index)); switch(NearObj.object_index){ case Enemy[0]: case Enemy[1]: case Enemy[2]: show_debug_message("SWITCH CASE 0 1 2 // GO TO ENEMY"); ActualState = WarriorState.GoToEnemy; Gox = NearObj.x; Goy = NearObj.y; break; case o_StartChest: show_debug_message("SWITCH CASE 3 // GO TO CHEST"); if MyWeapon[0] == false{ ActualState = WarriorState.GoToChest; Gox = NearObj.x; Goy = NearObj.y; } else { show_debug_message("I HAVE WEAPON I BACK TO THINK"); ActualState = WarriorState.Think; } break; case o_DroppedWeaponParent: case o_DroppedHealPotion: show_debug_message("SWITCH GO TO GET ITEM"); Move = true; Gox = NearObj.x; Goy = NearObj.y; NearDropedItem = NearObj; ActualState = WarriorState.GetItem; break; } } } else { show_debug_message("----------------------------NO COLLISION GO TO MIDDLE"); ActualState = WarriorState.GoToMiddle; } } break; A tu cały step dla ciekawskich. if global.gamestart{ show_debug_message("Game_Start"); switch(ActualState){ case WarriorState.Think: show_debug_message("START THINK"); var WhatSee; var ColRad = 256; if !HaveHealPotion and !MyWeapon[WeaponType.Have]{ show_debug_message("I DONT HAVE POTION OR WEAPON"); WhatSee = [Enemy[0],Enemy[1],Enemy[2],o_StartChest,o_DroppedWeaponParent,o_DroppedHealPotion]; } else { if !HaveHealPotion and MyWeapon[WeaponType.Have]{ show_debug_message("i dont have potion and have weapon"); WhatSee = [Enemy[0],Enemy[1],Enemy[2],o_DroppedHealPotion]; } else { if HaveHealPotion and !MyWeapon[WeaponType.Have]{ show_debug_message("i have potion and dont have weapon"); WhatSee = [Enemy[0],Enemy[1],Enemy[2],o_StartChest,o_DroppedWeaponParent] } } } show_debug_message("Check HP is lower than maxhp / 5 "); if HaveHealPotion{ if MyHp < MyMaxHP / 5{ ActualState = WarriorState.Heal; } } show_debug_message("START FOR"); for(i = 0; i < array_length(WhatSee); i++){ show_debug_message("CHECK I:" + string(i)); var NearObj = instance_nearest(x,y,WhatSee[i]); show_debug_message("START CHECKING COLLISON"); if collision_circle(x,y,ColRad,NearObj,true,true){ show_debug_message("----------------------------------HAVE COLLISION: "+string(NearObj)); if !collision_line(x,y,NearObj.x,NearObj.y,o_wall,false,true){ show_debug_message("I SEE IT"); show_debug_message("OBJ NAME 2"+string(NearObj.object_index)); switch(NearObj.object_index){ case Enemy[0]: case Enemy[1]: case Enemy[2]: show_debug_message("SWITCH CASE 0 1 2 // GO TO ENEMY"); ActualState = WarriorState.GoToEnemy; Gox = NearObj.x; Goy = NearObj.y; break; case o_StartChest: show_debug_message("SWITCH CASE 3 // GO TO CHEST"); if MyWeapon[0] == false{ ActualState = WarriorState.GoToChest; Gox = NearObj.x; Goy = NearObj.y; } else { show_debug_message("I HAVE WEAPON I BACK TO THINK"); ActualState = WarriorState.Think; } break; case o_DroppedWeaponParent: case o_DroppedHealPotion: show_debug_message("SWITCH GO TO GET ITEM"); Move = true; Gox = NearObj.x; Goy = NearObj.y; NearDropedItem = NearObj; ActualState = WarriorState.GetItem; break; } } } else { show_debug_message("----------------------------NO COLLISION GO TO MIDDLE"); ActualState = WarriorState.GoToMiddle; } } break; case WarriorState.GoToChest: show_debug_message("CASE GO TO CHEST"); var NearChest = instance_nearest(x,y,o_StartChest); show_debug_message("CHECK DISTANCE TO NEARCHEST"); if distance_to_object(NearChest) > 32{ show_debug_message("IS GREATER THAN 32"); Move = true; } else { show_debug_message("IS NOT GREATER THAN 32"); Move = false; ActualState = WarriorState.GetChestItems; } break; case WarriorState.GoToMiddle: show_debug_message("CASE GO TO MIDDLE"); show_debug_message("CHECK DISTANCE TO MIDDLE"); if distance_to_point(RoomMx,RoomMy) > 32{ show_debug_message("DISTANCE TO MIDDLE IS GREATER THAN 32"); Move = true; Gox = RoomMx; Goy = RoomMy; } else { show_debug_message("DISTANCE TO MIDDLE IS NOT GREATER THAN 32"); Move = false; } show_debug_message("CHANGE STATE TO THINK FROM GO TO MIDDLE"); ActualState = WarriorState.Think; break; case WarriorState.GoToEnemy: show_debug_message("CASE GO TO ENEMY"); var Enemies = [Enemy[0],Enemy[1],Enemy[2]]; var NearEnemy = noone; var Distance = 16; if MyType = WarriorType.Ranged{ Distance = 128; } for (var i = 0; i < array_length(Enemies); i++){ NearEnemy = instance_nearest(x,y,Enemies[i]); } if NearEnemy != noone{ if distance_to_point(Gox,Goy) > Distance{ Move = true; } else { Move = false; ActualState = WarriorState.Attack; } } break; case WarriorState.Attack: show_debug_message("CASE ATTACK"); switch(MyType){ case WarriorType.Meele: if CanAttack{ CanAttack = false; var Enemies = [Enemy[0],Enemy[1],Enemy[2]]; var NearEnemy = noone; for (var i = 0; i < array_length(Enemies); i++){ NearEnemy = instance_nearest(x,y,Enemies[i]); } NearEnemy.ActualState = WarriorState.TakeDMG; NearEnemy.GetDMG = ActualDMG; ActualState = WarriorState.Think; } else { ActualState = WarriorState.Think; } break; case WarriorType.Ranged: if CanAttack{ CanAttack = false; var arrow = instance_create_layer(x+lengthdir_x(16,direction),y+lengthdir_y(16,direction),"InstLayer_Ground",o_Arrow); arrow.speed = irandom_range(10,20); arrow.direction = direction; arrow.DMG = ActualDMG; arrow.ActualTeam = ActualTeam; } else { ActualState = WarriorState.Think; } break; } break; case WarriorState.Heal: show_debug_message("CASE HEAL"); var AddHp = irandom_range(50,100); var CalculateHp = MyHp + AddHp; if CalculateHp < MyMaxHP{ MyHp += AddHp; } else { MyHp = MyMaxHP; } ActualState = WarriorState.Think; break; case WarriorState.GetItem: show_debug_message("CASE GET ITEM"); var ItemN = instance_nearest(x,y,NearDropedItem); if distance_to_point(Gox,Goy) > 4{ Move = true; } else { Move = false; switch(NearDropedItem){ case o_DroppedSword: var WType = WeaponType.Sword; Weapon[WeaponType.Have] = true; Weapon[WType] = true; ActualDMG = SetDamage[WType]; ActualCoolDownD = WeaponCoolD[WType]; Speed -= SpeedDecreaser[WType]; with(ItemN){ instance_destroy(); } ActualState = WarriorState.Think; break; case o_DroppedAxe: var WType = WeaponType.Axe; Weapon[WeaponType.Have] = true; Weapon[WType] = true; ActualDMG = SetDamage[WType]; ActualCoolDownD = WeaponCoolD[WType]; Speed -= SpeedDecreaser[WType]; with(ItemN){ instance_destroy(); } ActualState = WarriorState.Think; break; case o_DroppedBow: var WType = WeaponType.Bow; Weapon[WeaponType.Have] = true; Weapon[WType] = true; ActualDMG = SetDamage[WType]; ActualCoolDownD = WeaponCoolD[WType]; Speed -= SpeedDecreaser[WType]; with(ItemN){ instance_destroy(); } ActualState = WarriorState.Think; break; case o_DroppedHealPotion: HaveHealPotion = true; with(ItemN){ instance_destroy(); } ActualState = WarriorState.Think; break; } } break; case WarriorState.GetChestItems: show_debug_message("CASE GET CHEST ITEMS"); var Chest = instance_nearest(x,y,o_StartChest); Chest.ChestIsOpen = true; Chest.Timer = 1 * global.Second; switch(MyType){ case WarriorType.Meele: //AXE if Chest.AxesInChest > 0{ var WType = WeaponType.Axe; Chest.AxesInChest -= 1; Weapon[WeaponType.Have] = true; Weapon[WType] = true; ActualDMG = SetDamage[WType]; ActualCoolDownD = WeaponCoolD[WType]; Speed -= SpeedDecreaser[WType]; } else { //SWORD if Chest.SwordsInChest > 0{ var WType = WeaponType.Sword; Chest.SwordsInChest -= 1; Weapon[WeaponType.Have] = true; Weapon[WType] = true; ActualDMG = SetDamage[WType]; ActualCoolDownD = WeaponCoolD[WType]; Speed -= SpeedDecreaser[WType]; } } break; case WarriorType.Ranged: if Chest.BowsInChest > 0{ var WType = WeaponType.Bow; Chest.BowsInChest -= 1; Weapon[WeaponType.Have] = true; Weapon[WType] = true; ActualDMG = SetDamage[WType]; ActualCoolDownD = WeaponCoolD[WType]; Speed -= SpeedDecreaser[WType]; } else { MyType = WarriorType.Meele; ActualState = WarriorState.GetChestItems; } break; } // Get Armor if Chest.HArmorinChest > 0 and MyType != WarriorType.Ranged{ var Arm = ArmorType.Heavy; Chest.HArmorinChest -= 1; MyMaxArmor = DefaultArmor[Arm]; MyArmor = MyMaxArmor; MyArmorType[ArmorType.Have] = true; MyArmorType[Arm] = true; Speed -= SpeedDecreaserArmor[Arm]; } else { if Chest.LArmorinChest > 0{ var Arm = ArmorType.Light; Chest.HArmorinChest -= 1; MyMaxArmor = DefaultArmor[Arm]; MyArmor = MyMaxArmor; MyArmorType[ArmorType.Have] = true; MyArmorType[Arm] = true; Speed -= SpeedDecreaserArmor[Arm]; } } if Chest.HPotionInChest > 0{ Chest.HPotionInChest -= 1; } ActualState = WarriorState.GoToMiddle; break; case WarriorState.TakeDMG: show_debug_message("CASE TAKE DMG"); TakeDMGAlpha = 1; TakeDMG = true; if MyArmor > 0{ var CalcualteDMG = MyArmor - GetDMG; if CalcualteDMG > 0{ MyArmor -= CalcualteDMG; ActualState = WarriorState.Think; } else { MyArmor = 0; ActualState = WarriorState.Think; } } else { if MyHp > 0{ var CalcualteDMG = MyHp - GetDMG; if CalcualteDMG > 0{ MyHp -= CalcualteDMG; ActualState = WarriorState.Think; } else { sprite_index = DeadSprite; ActualState = WarriorState.Die; } } } var num = irandom_range(2,10); repeat num{ var blood = instance_create_layer(x,y,"InstLay_Blood",o_blood); } break; case WarriorState.Die: show_debug_message("CASE DIE"); if image_alpha > 0{ image_alpha -= 0.01; } else { instance_destroy(); } break; } if TakeDMG{ show_debug_message("ILL TAKE DMG"); if TakeDMGAlpha > 0{ TakeDMGAlpha -= 0.1; } else { TakeDMG = false; show_debug_message("OFF TAKE DMG"); } } if Move{ show_debug_message("I MOVE"); if Gox != 0 and Goy != 0{ //if distance_to_point(Gox,Goy) > 32{ //if x > Gox + 64 and x < Gox - 64 and y > Goy + 64 and y < Goy - 64{ mp_potential_step(Gox,Goy,Speed,true); //} else { // Move = false; //} } } if !CanAttack{ show_debug_message("I CANT ATTACK START COOLDOWN"); if ActualCoolDown > 0{ ActualCoolDown--; } else { show_debug_message("COOLDOWN END"); CanAttack = true; ActualCoolDown = ActualCoolDownD; } } }
  9. Skończyłem, no przynajmiej proces haftowania bo trzeba jeszcze wymyślić czym to będzie. Zawieszką, zakładką do książki, magnesem na lodówkę itp. Całość ma wielkość 6x6cm.
  10. I podoba mi się to Huder!
  11. Wybierasz format .zip ? Nie pamiętam, ostatni raz robiłem to z 6-7 lat temu
  12. Czesc, o ile wiem to game maker studio 1.4 tworzy instalator , czy jest możliwość zrobienia jak w game maker 8 samego pliku exe ?
  13. Działa własnie z tego powodu, chciałem innych pokonać
  14. Ha, nadeszły czasy, że obecnie ich "SHoutbox" nie działa, a gmclanowy działa! Bardzo dobra robota gnysek!
  15. Już chciałem zagrać, ale... czemu to jest instalator, a nie spakowane .exe, żebym sobie mógł na szybko odpalić?
  16. Jak będę mial czaaaaaas to pobioooooorę
  17. Opis - Seid powraca po wielu wielu latach , minęło ich wiele od czasów Seid to jeszcze nie koniec 1 . Jakiś głos mu mówi by odważył się zebrał siły na ostatnie zadanie , po drodze okazuje się że może uda się odnaleźć maske , czy staruszek Seid sobie poradzi ? Tego się dowiemy grając w te odsłonę !!!!!! Gatunek - akcja , przygodowe , przesmiewcze, platformowka 2d Screen 1 Screen 2 Screen 3 Screen 4 Wideooo zwiastunem Link do pobraniaaaa znowuuuu https://dyzmek.itch.io/seid-to-jeszcze-nie-koniec-ii
  18. Ja nie mogę zrobić upgradu z win 10 do win 11 bo nie spełniam wymagań i odrzuca instalator.
  19. Yep, najnowszy windows ma wbudowane nagrywanie albo pod Start+S, albo za pomocą Xbox GameBara, nie trzeba nawet OBS (chociaż to i tak najlepsze rozwiązanie, nie jak niektórzy, co mają wciąż instalki FRAPsa xD).
  20. A ja się ostatnio zastanawiałem co u Ciebie bardzo dobrze, że nadal tworzysz coś kreatywnego, a kawałek i wizualizacje super! Czekam aż więcej tutaj zaprezentujesz
  21. Wykorzystałem jakieś rozszerzenie z marketplace, które czyta format midi. Ale musiałem mocno go dostosować i w ogóle nauczyć się tych typów MIDI. Utwór posiada około 20 ścieżek i strasznie zmulała mi pętla, która te wszystkie nuty czyta. Problemów z klatkarzem było co nie miara i jak już ładnie zoptymalizowałem do 60 fps to się okazało że po odpaleniu OBSa do nagrywania komp mi się dławił, masakra 🙆‍♂️🙆‍♂️ trzeba ten złom w koncu wymienić bo ma 15 lat
  22. Fajne, przypominają mi się stare dobre czasy, amigowe moduły i strzelanki kosmiczne w stylu Galaga
  23. To nie moje klimaty, więc nie ocenię Ale za zaprogramowanie wizualizacji w GM propsy.
  24. Trochę już siedzę w muzyce i w końcu czuję się na sile by zacząć publikować swoje wypociny, stworzyłem osobny kanał na YT właśnie do tego, Yazgot. Pierwszy utwór na kanale Hadanoir, nazwa pochodzi od "Hardanger" techniki haftowania, którym się zajmuje moja kobita z tym że wymówiona po Norwesku tam skąd ponoć ta technika pochodzi. Szkoda że FPSy spadały podczas nagrywania wideosa, może pora na zmianę tego złomiastego kompa w końcu haha. Zaprogramowane w GMie oczywście
  25. EDIT 2: Ogólnie, kamera się popsuła i zaczęła mi wywalać czarne pasy po bokach ekranu, więc po prostu zmodyfikowałem End Stepa, by przy wykryciu zmiany rozmiaru okna zmienił wielkość kamery oraz zmienił rozmiar, app_surface. Wszystko działa poprawnie, jednak dalej trzeba zmaksymalizować okno (GM na to nie pozwala, trzeba dodać plik dll który by to wykonał) EDIT: Dobra... Widzę gdzie jest problem... Gra uruchamia się w oknie, ale jest nie dopasowane do ekranu, po wciśnięciu dopasowania (wypełnienia jak kto woli :P) do ekranu (kwadracik), wszystko się naprawia -.-. Matko, a ja już 3 kamerę piszę... przynajmniej ją skróciłem o 3/4 z funkcją window_set_showborder(false); też wszystko się naprawia 😪 Witajcie, mam problem z GUI, a mianowicie skalowanie... Otóż, na fullscreenie koordynaty rysowania oraz myszy się zgadzają, po wyłączeniu fullscreena pozycja myszy z GUI się nie zgadza... Nie ważne jakiej funkcji do ustalania wielkości Gui użyję, koordy się nie zgadzają.. (Próbowałem display_set_gui_size(Window_Width, Window_Height); // display_set_gui_size(window_get_width(),window_get_height()); // display_set_gui_size(view_wport[0], view_hport[0]); // teraz pytanie gdzie jest problem, szukam w google i nie mogę ogarnąć problemu) Kamerę tworzę bezpośrednio w roomie i w alarmie skaluję GUI. // create Window_Width = 1920; Window_Height = 1080; Cam_Scale = 1; Cam_W = Window_Width / Cam_Scale; Cam_H = Window_Height / Cam_Scale; FullScreen = false; move = true; alarm[0] = 1; surface_resize(application_surface,Window_Width,Window_Height); window_set_size(Window_Width,Window_Height); window_center(); view_enabled = true; view_visible[0] = true; view_xport[0] = 0; view_yport[0] = 0; view_wport[0] = Cam_W; view_hport[0] = Cam_H; view_camera[0] = camera_create_view(0, 0, view_wport[0], view_hport[0], 0, o_Player, -1, -1, Cam_W/2, Cam_H/2); camera_set_view_pos(view_camera[0],o_Player.x - (Cam_W/2),o_Player.y - (Cam_H / 2)); alarm[0] = 1; //alarm 0 x = o_Player.x; y = o_Player.y; if move{ if alarm[0] < 0{ alarm[0] = 1*room_speed; } } if FullScreen{ display_set_gui_maximize(); window_set_fullscreen(true); } else { display_set_gui_size(view_wport[0], view_hport[0]); window_set_fullscreen(false); } //clean up camera_destroy(view_camera[0]); Mysz jest na górze czerwonego kwadratu...
  26. Raczej naiwna implementacja serializacji obiektów.
  1. Pokaż więcej elementów aktywności
×
×
  • Dodaj nową pozycję...