Gumimacik esnek lefele (játék)
2016-01-06T13:08:42+01:00
2016-01-11T01:19:43+01:00
2022-08-18T11:05:32+02:00
kriszrap
Sziasztok:)

Egy gumimaci játékot szeretnék windows formba:)

A lényeg
van 5 db gumimaci jpg és az ablak föntről lefele menne kb 7 darab oszlop.
Ha a képre kattint a felhasználó meg úgy mond meg eszi vagy is eltűnik .
kb ennyi lenne. Hogy lehetne célszerű megcsinálni labellel vagy garipcs objectel vagy hogy lenne  célszerűbb. Aztán kép ugy y tengelyen megy lefele hogy csináljam töröljem a képeket újrarajzoljam vagy a pozici módosításával??

  Segítségeteket előre köszönöm.
Mutasd a teljes hozzászólást!
Nem is ez volt a cél 

Amúgy ha én kezdő lennék, és egyszerű winformsos játékot akarnék, lehet hogy megelégednék inkább egy timeres megoldással. Valahogy így:

private class Maci { float y, speedY; int x; Label kep; public Maci(int x, int y, Form owner) { this.x = x; this.y = y; kep = new Label(); kep.Text = "<O>"; kep.Location = new Point(this.x, (int) this.y); kep.Width = 50; speedY = 10; owner.Controls.Add(kep); } public void Mozgat(float delta) { y += speedY * delta; kep.Location = new Point(this.x, (int)this.y); } } Maci[] maci; DateTime lastMovement; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { maci = new Maci[10]; for (int i = 0; i < 10; i++) maci = new Maci(50 * i, 50, this); lastMovement = DateTime.Now; } private void timer1_Tick(object sender, EventArgs e) { DateTime newMovement = DateTime.Now; float delta = (float) (newMovement - lastMovement).TotalSeconds; lastMovement = newMovement; foreach (var m in maci) m.Mozgat(delta); } }
Mutasd a teljes hozzászólást!

  • Csináld, ahogy akarod, taknyolás lesz így is, úgy is.
    Mutasd a teljes hozzászólást!
  • Mind a kettővel megoldható, de a winforms valóban nem az igazi erre, ráadásul elég elavult dolog.

    Akkor már inkább WPF, vagy monogame vagy valami hasonló.
    Mutasd a teljes hozzászólást!
  • köszönöm a válaszotok akkor meg próbálkozok vele:)
    Mutasd a teljes hozzászólást!
  • Szerintem a Marslakócskák egészségesebbé tesznek mint a gumimacik, próbálkozz inkább azokkal...
    Meg különben is "fentről" jönnek (Mars), nem probléma a startpozíció...
    Mutasd a teljes hozzászólást!
  • Miért kapom ezt a hibát ?:)

    private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { Label szoveg = new Label(); szoveg.Location = new Point((50* i) + palyaxkezd, palyaykezd); szoveg.Height = 70; szoveg.Width = 35; szoveg.Image = newImage; szoveg.Name = Convert.ToString(i); // megcimkézem szoveg.Click += new System.EventHandler(clikelek); Controls.Add(szoveg); } mozgatas = new Thread(mozgat); mozgatas.Start(); } public void mozgat() { for (int k = 0; k < 4; k++) { for (int i = 0; i < 10; i++) { Label macimozgat = (Label)this.Controls.Find(Convert.ToString(i), true)[0]; macimozgat.Location = new Point((50 * i) + palyaxkezd, palyaykezd + (70 * k));//hiba } } } "A szálak közötti művelet érvénytelen: Megpróbáltak hozzáférni a(z) „1” vezérlőhöz egy olyan szálból, amely nem egyezik a vezérlőt létrehozó szállal."

    Annyit akarok hogy mind a 10 gumimaci menjen le 70 px :) 4x
    Mutasd a teljes hozzászólást!
  • Google keresőkifejezés: "c# sprite in winform"
    Mutasd a teljes hozzászólást!
  • Annyi a bajom hogy Controls.Find nem találja az label-t ha Thread segítségével csinálom:((
    Erre van gyógymód??
    Mutasd a teljes hozzászólást!
  • A winforms nem többszálú, és te egy másik szálról próbáltál meg módosítani egy winformsos vezérlőt. Ez picit trükkös, keress olyasmire a guglin mint winforms ui another thread.
    Mutasd a teljes hozzászólást!
  • Annyi a bajom hogy Controls.Find nem találja az label-t ha Thread segítségével csinálom:((


    Nem csak ennyi a bajod, hanem az is hogy megpróbálsz olyan technikákhoz nyúlni amihez lövésed sincs.

    Gyanítom fogalmad sincs a Message Queue  / Main (GUI) thread / Concurrency / Invoking és még pár alapfogalomról ...

    Ne derogáljon könyvet előkapni végigtanulni és a példákat végigvinni. Esetleg jobb minőségű MOOC kurzust.
    Mutasd a teljes hozzászólást!
  • Akkor egy picit eltudnál irányítani a helyes útra???
    Mutasd a teljes hozzászólást!
  • Akkor hogy tudnam megoldani hogy a gumimacit meg csinalja resz es a ami a gumimacit lefele vissza ne akadalyozzak egymast ?? C# nal maradtam amugy. Csak a "find"nem talalja :(( ha az jo lenne akkor majd nem keszlennek :)
    Mutasd a teljes hozzászólást!
  • A te megoldásodnál maradva, ez valahogy így kellene hogy kinézzen:

    public void mozgat()
    {
    for (int k = 0; k < 4; k++)
    {
    for (int i = 0; i < 10; i++)
    {
    Label macimozgat = (Label)this.Controls.Find(Convert.ToString(i), true)[0];

    if (macimozgat.InvokeRequired)
    {
    Invoke(new MethodInvoker(delegate ()
    {
    macimozgat.Location = new Point((50 * i) + 50, 50 + (70 * k));
    }));
    }
    else
    macimozgat.Location = new Point((50 * i) + 50, 50 + (70 * k));
    }

    Thread.Sleep(1000);

    }
    }
    }

    De ezt nem így célszerű megoldani.
    Mutasd a teljes hozzászólást!
  • Ja... Ez így nem túl fluid :S
    Mutasd a teljes hozzászólást!
  • Nem is ez volt a cél 

    Amúgy ha én kezdő lennék, és egyszerű winformsos játékot akarnék, lehet hogy megelégednék inkább egy timeres megoldással. Valahogy így:

    private class Maci { float y, speedY; int x; Label kep; public Maci(int x, int y, Form owner) { this.x = x; this.y = y; kep = new Label(); kep.Text = "<O>"; kep.Location = new Point(this.x, (int) this.y); kep.Width = 50; speedY = 10; owner.Controls.Add(kep); } public void Mozgat(float delta) { y += speedY * delta; kep.Location = new Point(this.x, (int)this.y); } } Maci[] maci; DateTime lastMovement; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { maci = new Maci[10]; for (int i = 0; i < 10; i++) maci = new Maci(50 * i, 50, this); lastMovement = DateTime.Now; } private void timer1_Tick(object sender, EventArgs e) { DateTime newMovement = DateTime.Now; float delta = (float) (newMovement - lastMovement).TotalSeconds; lastMovement = newMovement; foreach (var m in maci) m.Mozgat(delta); } }
    Mutasd a teljes hozzászólást!
  • Na mindjart mas :D A timert meg felkuldod max-ra, a benne levo dolgok meg az eltelt idotol fuggenek. Klasszikus game 'loop'. A GTA5 sem csinalja szebben. :D
    Ha viszont ezek utan az a problema, hogy miert 100% a cpu, akkor megutok valakit :D:D:D
    Mutasd a teljes hozzászólást!
  • Akkor melyik változat lenne nekem jó  ahoz hogy megcsináld xy gumimacit az első sorba azt utánna meg egy sorral lejjebb viszem azt megint gyárt megint xy gumimat és közbe lehessen "megenni"?( rá klikelkek a gumimacira:) )
    Mutasd a teljes hozzászólást!
  • Itt egy kis olvasmany: http://cg.elte.hu/~msc_cg/Gyak/11/GameProgPatterns.pdf

    Game Loop, vagy Simulation Loop.
    Barmilyen interaktiv programot/jatekot igy erdemes csinalni.
    Mutasd a teljes hozzászólást!
  • Segítenél mert nagyon nem sikerül .:( áttudnád operálni a kódom:(

    kattintásra eltávolítjuk a gumimacit:) private void clikelek(object sender, EventArgs e) { Label kattamacira = (Label)sender; int kezdo = kattamacira.Name.LastIndexOf(" "); int i = Convert.ToInt32(kattamacira.Name.Substring(0, kezdo)); int k = Convert.ToInt32(kattamacira.Name.Substring(kezdo)); palya[i, k] = 0; Controls.Remove(kattamacira); } //egysorral lejjebb csusztatjuk a gumimaci public void mozgat() { for (int k = 4; k >= 0; k--) { for (int i = 9; i >= 0; i--) { if (palya[i, k] == 1) { palya[i, k] = 0; Label macimozgat = (Label)this.Controls.Find(i+" "+k, true)[0]; macimozgat.Location = new Point((50 * i) + palyaxkezd, palyaykezd + (70*(k+1))); if (k < 4) { palya[i, k + 1] = 1; macimozgat.Text = i + " " + (k + 1); macimozgat.Name = i + " " + (k + 1); } else { palya[i, k] = 0; Controls.Remove(macimozgat); } } } } Thread.Sleep(1000); macikeszites(); mozgat(); } //elkészitjük a gumimacit 1, sorba public void macikeszites() { Random vszam = new Random(); int i = vszam.Next(0, 10); Label szoveg = new Label(); szoveg.Location = new Point((50 * i) + palyaxkezd, palyaykezd); szoveg.Height = 70; szoveg.Width = 35; szoveg.Image = newImage; szoveg.Name = i + " " + 0; // megcimkézem palya[i, 0] = 1; szoveg.Click += new System.EventHandler(clikelek); Controls.Add(szoveg); }
    Hát nagyon nem jött össze amit küldtél így marattam az alapnál:(
    Mutasd a teljes hozzászólást!
  • Szia!

    A többiek már nagyjából körvonalazták, hogy mire kellene figyelned. Annyiban tudok én hozzájárulni, hogy régebben amikor tanultam a c#-ot, gyakorlásként írtam egy snake játékot, amiből ötletet meríthetsz. Ezt most feltöltöttem githubra: nandorsoma/LameSnakeGame

    A lényeg, hogy az OnPaint eseményben kérem az egyes elemeket, hogy rajzolják ki magukat. Az OnPaintet a mainTimer_Tick eseményben lévő Invalidate() váltja ki. Ezzel nem fog blokkolódni a főszál, ezt a részt megúszod, mert a .net megoldja helyetted. Nyilván te nem pixeleket fogsz rajzolni, hanem a képeidet, de ez nem nagy eltérés. Amit nálad máshogy kell csinálni, hogy nem KeyDown evented lesz, hanem OnClick és minden egyes timer ticknél azt ellenőrzöd, hogy ahova kattintottál, egybe esik-e a gumimaci koordinátájával. Két koordináta fedi-e egymást dologra találsz példát a GameControll.CheckCollision-ban.

    Annyi, hogy én ezzel a játékkal tényleg csak gyakoroltam, nem a legszebb példa lett, most ránézve volna mit máshogy csinálni, de kiindulásnak talán jó lehet...


    Mutasd a teljes hozzászólást!
  • Rendben köszönöm:) megnézem majd holnap:)

    OFF: Nehéz egy snaket össze dobni??

    Consolba sikerült nekem anno.
    Mutasd a teljes hozzászólást!
  • Semmi sem nehéz, főleg, miután az ember tudja, hogy kell. :)
    Mutasd a teljes hozzászólást!
  • InvokeRequired Mire szolgál??



    és ez a rész is:"Invoke(new MethodInvoker(delegate ()"??:)
    Mutasd a teljes hozzászólást!
  • Ezzel nem fog blokkolódni a főszál, ezt a részt megúszod, mert a .net megoldja helyetted.

    jajjjj ... és szerinted ezek az OnPaint-ek csak úgy maguktól keletkeznek valamilyen mágikus ráolvasással?

    Már hogyne blokkolódna hiszen a főszálad dolgozza fel az üzenetsort amiből keletkezik ez az egész eseményvezérelt hurkolás ...
    Mutasd a teljes hozzászólást!
  • Te látom szeretsz beszólogatni, de szerintem ez épp nem blokkolót jelent:

    "Calling invalidate schedules your view to be redrawn after all other immediate work has finished."

    A lényeg, hogy az én megoldásomban, nem kell szenvednie szálakkal, concurrencyvel és társaival...
    Mutasd a teljes hozzászólást!
  • Honnan idéztél?
    Mutasd a teljes hozzászólást!
  • Azt egy stackoverflowos commentből, amit persze most nem találok.

    Ez relevánsabb:
    Calling the Invalidate method does not force a synchronous paint

    Control.Invalidate Method (System.Windows.Forms)

    Remarks címszó alatt.
    Mutasd a teljes hozzászólást!
  • Csak kíváncsi lettem volna hol írták ezt le, azonban az idézett mondat Google-os keresése alapján megtaláltam hogy ez egy Android-os kérdésre adott válaszban volt (keresési előzményeidben megtaláltad volna)

    Nos ez vindóz, nem kevés ideje dolgozok vele C-s WinAPI-val kezdtem, ezért van némi elképzelésem hogyan működik még ha .NET mázzal nyakon is van öntve.

    Igazából ezt a topic-ot matt383  magvas hozzászólása után le lehetett volna zárni, mert ami ebben a topicban megy az a gányolás iskolapéldája, bár ez némileg betudható annak, hogy a feltett kérdésre elvi hibás természetéből fakadóan nincs helyes válasz.

    A kérdező alapdolgokkal nincs tisztában, ezért "szóltam be" neki hogy jobb lenne ha előkapna pár könyvet vagy felvenne pár (ingyenes) MOOC kurzust mert többre menne vele mint az hogy itt kap félig kész példát majd kamillázik hogy:

    InvokeRequired Mire szolgál??

    és ez a rész is:"Invoke(new MethodInvoker(delegate ()"??:)

    Persze csak ha a kérdező komolyan gondolta a "programozást" mit szakmát ...
    Mutasd a teljes hozzászólást!
  • Azt mondjuk benéztem..
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd