Skocz do zawartości

H2S04

Użytkownicy
  • Postów

    51
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    2

Ostatnia wygrana H2S04 w dniu 28 Stycznia 2022

Użytkownicy przyznają H2S04 punkty reputacji!

O H2S04

  • Urodziny 12.04.1995

Informacje

  • Użytkownik GameMaker Studio 2
    Tak
  • Użytkownik GameMaker Studio
    Tak
  • Użytkownik Unity
    Nie
  • Użytkownik Godot
    Tak
  • Steam
    GanjaViruss

O mnie

  • Skąd
    Lubelskie

Ostatnie wizyty

8 934 wyświetleń profilu

Osiągnięcia H2S04

  1. A teraz mam pierdołę. Mam taki kod var _inst = instance_create([reszta kodu]); with(_inst) { Direction = _Direction Damage = _Damage Head_Shot = true } Oczywiście wszystko leci w instancje tylko ta jedna się nie zmienia i jest to Head_Shot, badałem sprawę za pomocą show_debug_msg. Ale jedyne co wychodzi ze nie chce tylko tej zmiennej przenieść, wszystkie inne zmienia normalnie. Dziwne 😅 EDIT: znalazłem odpowiedź grzebiąc w necie, ten typ tak ma 🤷🏻‍♂️ dlatego na końcu instancji wprowadzono możliwość tworzenia struktur, by tworzyć zmienne przed stworzeniem obiektu. 👌
  2. 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;
  3. 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
  4. 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; } } }
  5. 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...
  6. Mam pytanie z innej beczki, otóż posiadam kod ekwipunku, czyli rysowanie slotów, oraz przenoszenie przedmiotów, łączenie ich itp. Jednak napisałem kod w DrawGui zamiast step, jak bardzo może wpłynąć to na grę? Oczywiście kod działa tylko po kliknięciu myszą oraz gdy EQ jest włączone. Pozdrawiam PS. Tak wiem, że kod powinienem przenieść do stepa, bo on obsługuje logikę gry i jest wykonywany co ilość klatek, a Draw jest do rysowania, bo wykonywany jest ciągle, jednak ciekawi mnie to, zanim napiszę kod od nowa przenosząc do StepEvent
  7. W takim razie po prostu zrobię znikającą alphę, w czasie klikunastu s obiekt zniknie i się zniszczy, będzie mniej kombinacji i tyle ?
  8. Zaraz obczaję, problem jest taki, że przy with jak obiekt został zniszczony usuwało go z surface ale zaraz pokombinuję EDIT: Hmm wczesniej kombinowałem z camera_apply to nie chciało działać teraz dałem na początku drawu surface i działa ok jeden problem mniej jednak dalej przy with przy zniszczeniu obiektu draw na surface się niszczy
  9. Mam pytanie dotyczące surface podążającego za kamerą. Otóż rysując surface na powierzchni stałej (tj. jakiś koordynatach typu room_width room_height) rysowanie polega na rysowaniu na koordach danego obiektu, przy kamerze muszę odjąć view width/height by narysowało mi surface tam gdzie chce, i tutaj jest problem bo ile wszystko się rysuje, (przy obiekcie jak istnieje tego problemu nie ma bo pozycja obiektu jest stała więc rysowanie w with będzie ładnie działać z kamerą), narysowany surface podąża za kamerą zamiast być w miejscu rysowania... Jak można to naprawić bo skończyły mi się pomysły i nic nie wydukałem patrząc na forum yoyo. Pozdrawiam. ///SURFACE RYSUJE SIĘ W POSTACI Create: global.FloorSurafce = -1; Draw: var VW = camera_get_view_width(view_camera[0]), VH = camera_get_view_height(view_camera[0]), VX = camera_get_view_x(view_camera[0]), VY = camera_get_view_y(view_camera[0]); if (surface_exists(global.FloorSurf)){ draw_surface(global.FloorSurf,VX,VY); } else { global.FloorSurf = surface_create(VW,VH); } /// OBIEKT KTÓREGO SZCZĄTKI CHCĘ RYSOWAĆ Draw: if speed == 0{ // obiekt się porusza i zmniejsza prędkość lub zatrzymuje się na ścianie if (surface_exists(global.FloorSurf)){ surface_set_target(global.FloorSurf); draw_sprite_ext(sprite_index,image_index,x-camera_get_view_x(view_camera[0]),y-camera_get_view_y(view_camera[0]),image_xscale,image_yscale,image_angle,TPColor,image_alpha); // TPColor to wybranie koloru surface_reset_target(); } }
  10. Paaanie luksus teraz światła które na siebie nachodzą ładnie się zlewają Dzięki Gnysek! Zdrówka
  11. EDIT: Problem występuje przy blend mode bm_add... jak jest sam biały bm_substract, to nie ma tego problemu. Więc chyba po prostu wywalę tę linijkę i zamiast, żółtego światła będzie białe i tyle Właśnie próbowałem na różne sposoby, efekt byle jaki, i człowiek już nie wie jak to przykombinować, nawet uciąłem trochę gardient ale dalej widać linię, rysowanie w pętli for też daje ten sam efekt ?
  12. Trzeba powiększyć, spróbuj na smartphonie ?
  13. Już zmniejszyłem, popatrz jak gradient na siebie nachodzi, jeśli chodzi o latarnie, widać zaokrąglenia, bawiłem się bmami ale efekty słabe, wygląda jak by rysowały się wszystkie na raz, bo światełko od pawnshopu ładnie nachodzi bo jest rysowane następne w kolejności, jeszcze jutro nadam im jakiś nr i spróbuję for narysować je po kolei, może coś to da, bo wygląda fajnie ale jednak te zaokrąglenia jakoś mnie w oczy bolą ?
  14. Pytanko co do surface... Mam Sprite 500x500 okrągłego gardientu na światełko, ale rysowanie surface nachodzi na siebie i nie wygląda to zbyt ładnie, co mogę z tym zrobić? var VW = camera_get_view_width(view_camera[0]), VH = camera_get_view_height(view_camera[0]), VX = camera_get_view_x(view_camera[0]), VY = camera_get_view_y(view_camera[0]); if(surface_exists(global.Light_Surf)){ surface_set_target(global.Light_Surf); //BlackAlpha draw_clear_alpha(c_black,0.8); with(o_Light){ gpu_set_blendmode(bm_subtract); draw_sprite_ext(s_Light,0,x-VX,y-VY,0.5,0.5,0,c_white,1); // gpu_set_blendmode(bm_normal); gpu_set_blendmode(bm_add); draw_sprite_ext(s_Light,0,x-VX,y-VY,0.5,0.5,0,c_yellow,0.15); gpu_set_blendmode(bm_normal); draw_sprite_ext(s_RoadLight,0,x-VX,y-VY,1,1,image_angle,c_white,1); } with(o_PawnShp){ gpu_set_blendmode(bm_subtract); draw_sprite_ext(s_Light,0,x-VX,y-VY,0.3,0.3,0,c_white,1); gpu_set_blendmode(bm_normal); gpu_set_blendmode(bm_add); draw_sprite_ext(s_Light,0,x-VX,y-VY,0.3,0.3,0,LightColor,0.15); gpu_set_blendmode(bm_normal); draw_sprite_ext(s_PawnShop,image_index,x-VX,y-VY-8,1,1,180,c_white,1); draw_sprite_ext(s_PawnShop,image_index,x-VX,y-VY+8,1,1,0,c_white,1); } surface_reset_target(); draw_surface(global.Light_Surf,VX,VY); } else { global.Light_Surf = surface_create(VW,VH); }
  15. Brak czasu tamten projekt zabił, ale dało mi to trochę nauki, i teraz bawię się kolejnym, ale dało to zawsze jakaś naukę ?
×
×
  • Dodaj nową pozycję...