• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed WinForms - klatkowanie w grze (Flickering)

Object Storage Arubacloud
0 głosów
192 wizyt
pytanie zadane 26 marca 2019 w C# przez Shimeo7 Obywatel (1,910 p.)
zamknięte 28 marca 2019 przez Shimeo7

Cześć, napisałem prostą grę gdzie jest plansza i postacie poruszają się w systemie turowym, przy czym po ruchu postaci na krótką chwilkę za postacią pojawia się białe pole i znika po aktualizacji pozycji, postacie są kontrolkami pictureBox, a backColor mają ustawione na transparent. Moje pytanie brzmi, czy da się coś z tym zrobić? Nie wiem, czy to dobrze wytłumaczyłem, jeżeli nie to proszę wskazać miejsce do wytłumaczenia.

 

EDIT

Dla potomnych, udało mi się rozwiązać problem. Banał jedna linijka kodu...

pod InitializeComponent(); wystarczy dodać 

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint |
                ControlStyles.OptimizedDoubleBuffer, true);

Nim to wstawiłem w swój kod poczytałem co, jak i dlaczego. Nie będę tutaj tego opisywać, ale coś Wam podrzucę ;) https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.setstyle?view=netframework-4.7.2

 

komentarz zamknięcia: Problem rozwiązano
komentarz 26 marca 2019 przez DeBos123 Nałogowiec (44,950 p.)
Pokaż kod
komentarz 26 marca 2019 przez Shimeo7 Obywatel (1,910 p.)

To jest fragment metody UpdateCharacters() odpowiadający za aktualizacje planszy

            switch (game.WeaponInRoom.Name)
            {
                case "Sword":
                    {
                        weaponControl = sword30;
                        break;
                    }
                case "Bow":
                    {
                        weaponControl = bow30;
                        break;
                    }
                case "Mace":
                    {
                        weaponControl = mace30;
                        break;
                    }
            }

            weaponControl.Visible = true;

            setClearEquipWeapon();
            setNoneWeaponInInventory();
            checkInventory();
            choosenWeapon();

            weaponControl.Location = game.WeaponInRoom.Location;
            if (game.WeaponInRoom.PickedUp)
                weaponControl.Visible = false;
            else
                weaponControl.Visible = true;

            checkHitPoints(game.PlayerHitPoints);
            countEnemies(enemiesShown);               
        }

        private void countEnemies(int enemiesShown)
        {
            if (enemiesShown < 1)
            {
                MessageBox.Show("You defeated all of enemies at this level", "Great Job");
                game.NewLevel(random);
                UpdateCharacters();
            }
        }

        private void checkHitPoints(int playerHitPoints)
        {
            if (game.PlayerHitPoints <= 0)
            {
                MessageBox.Show("You have been killed");
                Application.Exit();
            }
        }

        private void setTheVisibilityOfTheWeaponOnTheBoard()
        {
            sword30.Visible = false;
            bow30.Visible = false;
            mace30.Visible = false;
        }

        private void setNoneWeaponInInventory()
        {
            equipSword.BorderStyle = BorderStyle.None;
            equipBow.BorderStyle = BorderStyle.None;
            equipMace.BorderStyle = BorderStyle.None;
        }

        private void setClearEquipWeapon()
        {
            equipWeaponSword.Visible = false;
            equipWeaponBow.Visible = false;
            equipWeaponMace.Visible = false;
        }

        private void choosenWeapon()
        {
            if(game.choosenWeaponByPlayer() == "Sword")
            {
                equipSword.BorderStyle = BorderStyle.FixedSingle;
                equipWeaponSword.Visible = true;
            }
            else if(game.choosenWeaponByPlayer() == "Bow")
            {
                equipBow.BorderStyle = BorderStyle.FixedSingle;
                equipWeaponBow.Visible = true;
            }
            else if(game.choosenWeaponByPlayer() == "Mace")
            {
                equipMace.BorderStyle = BorderStyle.FixedSingle;
                equipWeaponMace.Visible = true;
            }
        }

        private void checkInventory()
        {
            if (game.CheckPlayerInventory("Sword"))
                equipSword.Visible = true;
            if (game.CheckPlayerInventory("Bow"))
                equipBow.Visible = true;
            if (game.CheckPlayerInventory("Mace"))
                equipMace.Visible = true;
        }

        private void moveLeft_Click(object sender, EventArgs e)
        {
            game.Move(Direction.Left, random);
            UpdateCharacters();
        }

        private void moveRight_Click(object sender, EventArgs e)
        {
            game.Move(Direction.Right, random);
            UpdateCharacters();
        }

        private void moveUp_Click(object sender, EventArgs e)
        {
            game.Move(Direction.Up, random);
            UpdateCharacters();
        }

        private void moveDown_Click(object sender, EventArgs e)
        {
            game.Move(Direction.Down, random);
            UpdateCharacters();
        }

        private void attackLeft_Click(object sender, EventArgs e)
        {
            game.Attack(Direction.Left, random);
            UpdateCharacters();
        }

        private void attackRight_Click(object sender, EventArgs e)
        {
            game.Attack(Direction.Right, random);
            UpdateCharacters();
        }

        private void attackUp_Click(object sender, EventArgs e)
        {
            game.Attack(Direction.Up, random);
            UpdateCharacters();
        }

        private void attackDown_Click(object sender, EventArgs e)
        {
            game.Attack(Direction.Down, random);
            UpdateCharacters();
        }

        private void equipSword_Click(object sender, EventArgs e)
        {
            game.Equip("Sword");
            UpdateCharacters();
        }

        private void equipBow_Click(object sender, EventArgs e)
        {
            game.Equip("Bow");
            UpdateCharacters();
        }

        private void equipMace_Click(object sender, EventArgs e)
        {
            game.Equip("Mace");
            UpdateCharacters();
        }
    

 

komentarz 26 marca 2019 przez DeBos123 Nałogowiec (44,950 p.)

pojawia się białe pole i znika po aktualizacji pozycji

Mógłbyś to bardziej rozwinąć? Białe pole zostaje po przesunięciu postaci, a po aktualizacji pozycji co się z nim dzieje? Zostaje zastąpione jakąś grafiką? 

komentarz 26 marca 2019 przez Shimeo7 Obywatel (1,910 p.)
Hmm, spóbuje to wytłumaczyć, masz postać w miejscu X, po przesunięciu jej o stałą wartość w miejsce X+1 w miejscu X zostaje na momencik białe pole(tak jakby w miejscu X, gdzie była postać została wycięta plansza) pojawia się na chwile i znika i tak z każdym elementem, który jest na planszy, tak jakby formularz drukował całą planszę na nową zaktualizowaną o pozycje gracza i innych elementów na planszy, wszystko działa jak należy poza właśnie tym graficzym defektem. Jeżeli nie rozumiesz, to około 17 zrobię krótki filmik i wstawię na youtube
komentarz 26 marca 2019 przez DeBos123 Nałogowiec (44,950 p.)
Mógłbyś pokazać część kodu w której wszystko aktualizujesz? Chodzi mi najbardziej o kolejność. Czy najpierw aktualizujesz mapę czy postacie.
komentarz 26 marca 2019 przez Shimeo7 Obywatel (1,910 p.)
cała aktualizacja jest w tym kodzie, reszta z tego kodu odpowiada za inne rzeczy. Mapa jest jako BackgroundImage formularza, więc ona nie ulega odświeżaniu, tylko postaci, dodam jeszcze, że postaci są w kwadracikach .png a ich właściwośc backcolor ustawiona jest na transparent
komentarz 26 marca 2019 przez DeBos123 Nałogowiec (44,950 p.)
Ja bym dał sleep'a (np. 3sek) i write'a po każdej linijce i zobaczył, która funkcja powoduje problem.

Podobne pytania

0 głosów
1 odpowiedź 1,337 wizyt
pytanie zadane 21 listopada 2017 w OpenGL, Unity przez Eryk Chojnacki Obywatel (1,420 p.)
0 głosów
0 odpowiedzi 123 wizyt
–3 głosów
1 odpowiedź 229 wizyt
pytanie zadane 10 marca 2017 w JavaScript przez Zahrad Użytkownik (740 p.)

92,570 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...