Weergegeven resultaten: 1 t/m 18 van 18

Discussie: c# snake

  1. #1
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0

    c# snake

    Hello,

    Ik heb een aantal jaar geleden een snake spel gemaakt in java en nu zou ik dat willen maken in C#. Maar kheb problemen bij het tekenen van de figuren, als in ze worden niet getekend.

    De slang bestaat een hoofd (gif file), huid(png file) en dan nog bolletjes & sterretjes (png's).

    Mijn teken functie ziet er zo uit:

    public void paintComponent(Graphics g)
    {

    if (tekenBol)
    {
    bol.teken(g);
    }

    if (tekenSter)
    {
    ster.teken(g);
    }

    slang.teken(g);

    }

    met die in slang:

    Image huid = Image.FromFile("..\\..\\huid.png");
    Image kopOnder = Image.FromFile("..\\..\\kop_Onder.gif");
    Image kopBoven = Image.FromFile("..\\..\\kop_Boven.gif");
    Image kopLinks = Image.FromFile("..\\..\\kop_Links.gif");
    Image kopRechts = Image.FromFile("..\\..\\kop_Rechts.gif");

    public void teken(Graphics g)
    {

    for(int i=langer-1;i>=0;i--)
    {
    if(i==0)
    {

    if (boven)
    {

    g.DrawImage(kopBoven, x[i] * 20 + 25, y[i] * 20 + 45);

    }
    if (onder)
    {

    g.DrawImage(kopOnder, x[i] * 20 + 25, y[i] * 20 + 45);

    }
    if (links)
    {
    g.DrawImage(kopLinks, x[i] * 20 + 25, y[i] * 20 + 45);
    }
    if (rechts)
    {
    g.DrawImage(kopRechts , x[i] * 20 + 25, y[i] * 20 + 45);
    }
    }
    else
    {
    g.DrawImage(huid, x[i]*20+25, y[i]*20+45);
    }
    }
    }

    maar er wordt niets op het scherm getoond..

    In java was het "simpeler" met altijd 'repaint();' maar hoe kan ik dit nu ook in c# aan het werken krijgen?

    Als je met deze code niet genoeg hebt kan ik eventueel ook de volledige code geven..

    Mvg

  2. #2
    Member
    Lid sinds
    21/06/03
    Berichten
    23
    iTrader
    0
    waar op probeer je te tekenen..?
    Code:
          protected override void OnPaint(PaintEventArgs e)
           {
                DrawSnake(e);
                base.OnPaint(e);
            }
    drawsnake is dan een functie zoals deze:
    Code:
           private void DrawSnake(PaintEventArgs e)
            {
                Graphics graph = e.Graphics;
                SolidBrush brush = new SolidBrush(Color.Green);
                Pen pen = new Pen(Color.Blue, 20);
                graph.FillRectangle(brush,X, Y,20,20);
                CreateFood();
            }

  3. #3
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    Gewoon op een paneel tekenen maar dan met gifs en pngs.

    Je hebt dus een hoofdform met 4 knoppen. Als je op play duwt ga je naar het speelscherm en daar staat de score & naam van speler + een paneel. En op dat paneel wil ik de kop + huid van de slang gaan tekenen samen met de bolletjes en soms sterren
    Laatst gewijzigd door jens_vc; 12 juli 2012 om 02:21

  4. #4
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    Ik heb het probleem gevonden (denk ik toch), weet alleen nog niet hoe ik het moet oplossen..

    Code:
      private void timer_Tick(object sender, EventArgs e)
            {
                aantalBewegingen++;
    
                if (onder)
                {
    
                    slang.beweegOnder();
                    this.Refresh();
                    
                }
    
                if (boven)
                {
    
                    slang.beweegBoven();
                    this.Refresh();
                }
    
                if (links)
                {
    
                    slang.beweegLinks();
                    this.Refresh();
                }
    
                if (rechts)
                {
    
                    slang.beweegRechts();
                    this.Refresh();
                }
    
                if (slang.heeftKop())
                {
                    verloren = true;
                }
    
    
                if (verloren)
                {
                    System.Media.SoundPlayer player = new System.Media.SoundPlayer();
                    player.SoundLocation = "..//..//gameover.wav";
                }
    
                if (bol.opSlang(slang))
                {
    
                    testScore = (35 - aantalBewegingen);
    
                    if (testScore <= 0)
                    {
                        testScore = 1;
                    }
    
                    score += testScore * level;
                    aantalBollen++;
    
                    do
                    {
                        bol = new Bollen();
                        tekenBol = true;
                    }
                    while (bol.opSlang(slang));
    
                    slang.verleng();
                    aantalBewegingen = 0;
    
                    if ((aantalBollen - opgegeten) == 4)
                        do
                        {
                            ster = new Sterren();
                            tekenBol = false;
                            tekenSter = true;
                        }
                        while (ster.opSlang(slang));
                    this.Refresh();
    
    
                    if (tekenSter)
                    {
    
                        aantalBewegingen++;
    
                        if (ster.opSlang(slang))
                        {
    
                            System.Media.SoundPlayer player = new System.Media.SoundPlayer();
                            player.SoundLocation = "..//..//cash.wav";
    
                            score += (70 - aantalBewegingen) * level;
                            opgegeten = aantalBollen;
    
                            tekenSter = false;
                            tekenBol = true;
    
                            slang.verleng();
    
                            aantalBewegingen = 0;
                            this.Refresh();
                        }
    
                        if (aantalBewegingen == 41) //= 20 bewegingen en dan verdwijnt de ster en komt er opnieuw een bolletje
                        {  
    
                            opgegeten = aantalBollen;
                            tekenSter = false;
                            tekenBol = true;
                            aantalBewegingen = 0;
    
                            this.Refresh();
                        }
                    }
                }
            }
    Dit is mijn code van de timer en overal waar this.Refresh(); staat, stond in java repaint(); waardoor de teken functie opgeroepen werd. Dit is dus hier niet het geval..

    Hoe kan ik nu in die timer code er voor zorgen dat deze code wordt opgeroepen?
    Code:
            public void paintComponent(PaintEventArgs g)
            {
    
                if (tekenBol)
                {
                    bol.teken(g);
                }
    
                if (tekenSter)
                {
                    ster.teken(g);
                }
    
                slang.teken(g);
    
            }

  5. #5
    Member Destiser's schermafbeelding
    Lid sinds
    4/11/03
    Locatie
    Wervik
    Berichten
    1.862
    iTrader
    30 (100%)
    probeer eens this.Invalidate() in de plaats.

  6. #6
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door Destiser Bekijk bericht
    probeer eens this.Invalidate() in de plaats.
    Nope komt nog altijd niet in de teken lus terecht dan

  7. #7
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    private Graphics g;
    Code:
    private void timer_Tick(object sender, EventArgs e)
            {
                aantalBewegingen++;
    
                if (onder)
                {
    
                    slang.beweegOnder();
                    this.Refresh();
                    
                }
    
                if (boven)
                {
    
                    slang.beweegBoven();
                    this.Refresh();
                }
    
                if (links)
                {
    
                    slang.beweegLinks();
                    this.Refresh();
                }
    
                if (rechts)
                {
    
                    slang.beweegRechts();
                    this.Refresh();
    g.FillEllipse(new SolidBrush(Color.Red), 100, 100, 30, 30);
                }
    Als ik dit nu doe (rechts is standaard true) dan krijg ik de error:
    De objectverwijzing is niet op een exemplaar van een object ingesteld.

    Iemand die weet hoe dit komt?

  8. #8
    Member forloRn_'s schermafbeelding
    Lid sinds
    23/11/03
    Locatie
    Landeurp
    Berichten
    1.648
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door jens_vc Bekijk bericht
    Als ik dit nu doe (rechts is standaard true) dan krijg ik de error:
    De objectverwijzing is niet op een exemplaar van een object ingesteld.

    Iemand die weet hoe dit komt?
    Ja, dat wilt zeggen dat je de taal op Engels moet zetten.

    Ik ga een wilde gok doen als Java-programmeur en zeggen dat dat een NullReferenceException is. Heb je geen stack trace om op voort te gaan?

  9. #9
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door forloRn_ Bekijk bericht
    Ja, dat wilt zeggen dat je de taal op Engels moet zetten.

    Ik ga een wilde gok doen als Java-programmeur en zeggen dat dat een NullReferenceException is. Heb je geen stack trace om op voort te gaan?
    Het is inderdaad een nullReferenceException was unhandled

    stack trace als in een try catch?

  10. #10
    Member Jerre Muesli's schermafbeelding
    Lid sinds
    8/09/02
    Locatie
    -
    Berichten
    1.883
    iTrader
    6 (100%)
    Stack Trace als in bvb
    org.omg.CORBA.MARSHAL: com.ibm.ws.pmi.server.DataDescriptor; IllegalAccessException minor code: 4942F23E completed: No
    at com.ibm.rmi.io.ValueHandlerImpl.readValue(ValueHan dlerImpl.java:199)
    at com.ibm.rmi.iiop.CDRInputStream.read_value(CDRInpu tStream.java:1429)
    at com.ibm.rmi.io.ValueHandlerImpl.read_Array(ValueHa ndlerImpl.java:625)
    at com.ibm.rmi.io.ValueHandlerImpl.readValueInternal( ValueHandlerImpl.java:273)
    at com.ibm.rmi.io.ValueHandlerImpl.readValue(ValueHan dlerImpl.java:189)
    at com.ibm.rmi.iiop.CDRInputStream.read_value(CDRInpu tStream.java:1429)

  11. #11
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    misschien domme vraag, maar hoe doe je dit?

  12. #12
    Member profound's schermafbeelding
    Lid sinds
    13/12/08
    Locatie
    Dendermonde
    Berichten
    2.496
    iTrader
    5 (100%)
    Heb je van je objectverwijzing wel een object gemaakt?

  13. #13
    Member Destiser's schermafbeelding
    Lid sinds
    4/11/03
    Locatie
    Wervik
    Berichten
    1.862
    iTrader
    30 (100%)
    Waar haal je in godsnaam de g van in
    g.FillEllipse(new SolidBrush(Color.Red), 100, 100, 30, 30);?

    Misschien best eens even de full code geven, ik maak nu en dan custom controls in C# en Invalidate() lukt me altijd om te doen hertekenen, zou me verbazen mocht dat bij u niet het geval zijn.

    edit: override je onpaint wel, en hoe?

  14. #14
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    Kzal de volledige code in een spoiler tonen van elk scherm & klassen.
    Spoiler:


    De bedoeling is dus als je een level kunt instellen in optie's (1-4) naargelang welke radiobutton wordt de timer aangepast (sneller of trager). Als je op play klikt begint het spel en zou de slang (lengte 4: kop + 3 stukjes huid) moeten worden getekend + een bolletjes om op te eten..

    Probleem is dat ik met de paintcomponent functie van java nog zit en dus die niet worden aangeroepen in slang en bol / ster..

  15. #15
    Member Destiser's schermafbeelding
    Lid sinds
    4/11/03
    Locatie
    Wervik
    Berichten
    1.862
    iTrader
    30 (100%)
    je hoofdprobleem zit dus wel degelijk in het feit dat je onpaint niet override.
    Voeg dit eens toe in je speelscherm:

    protected override void OnPaint(PaintEventArgs e)
    {
    PaintComponent(e.Graphics);
    //base.OnPaint(e);
    }

    Indien het niet direct lukt, vervang je refreshes door invalidates

  16. #16
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    Als ik dat toevoeg kreeg ik de ene keer als ik het spel run een vierkant met een rood kruis in (over de hoofdform) en als ik het dan nog eens run dan wordt de slang wel getekend en beweegt ze.

    Ze zou enkel op het paneel moeten getekend worden en de bollen of sterren zou ook moeten getekend worden..

    Alvast bedankt!

  17. #17
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    Nog eens een vraag bij het doorsturen van het toetsenbord.

    In mijn main form (Form1) staats:
    gameBezig staat momenteel altijd op true.
    Code:
    		private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
    		{
    			
    			if(gameBezig)
    			{
                    speelScherm.toetsenbordInpunt( e );
    			}
    		}
    en in speelscherm:
    Code:
     public void toetsenbordInpunt(System.Windows.Forms.KeyEventArgs key)
            {
                if (key.KeyCode == Keys.Escape)
                {
                    //  doeGameOver();
                    this.Close();
                }
    ...(nog meer code)
    }
    Maar als je op escape duwt gebeurt er niets..

    Iemand een idee?

    edit: volledig code
    Spoiler:
    Laatst gewijzigd door jens_vc; 13 juli 2012 om 15:25

  18. #18
    Approved 9-lifer jens_vc's schermafbeelding
    Lid sinds
    4/03/03
    Locatie
    Nijlen
    Berichten
    2.553
    iTrader
    0
    toetsenbord probleem is opgelost, maar nu zit ik weer met iets eigenaardig..

    Ik werk met bolletjes en sterren en normaal na 4 bolletjes moet er een ster komen (die wordt ook getekend), maar als ik dan de ster wil vangen gaat de slang er gewoon door .

    Als ik dit op 1 zet (dus bolletje dan ster en terug bolletje,..) dan werkt het wel.. Alleen zit soms dan nog met een probleem dat er een ster blijft staan en toch terug een bolletjes getekend wordt..

    Kzou misschien denken iets met de timer? Als de ster getekend wordt start er een timer en na zoveel seconde moet de ster verdwijnen.


    Het stuk code als ik de eerste if op 1 zet ipv 4 werkt het wel, maar met 4 niet meer..
    Code:
                    if ((aantalBollen - opgegeten) == 4)
                        do
                        {
                            ster = new Sterren();
                            tekenBol = false;
                            tekenSter = true;
                            aantalBewegingen++;
                            
                        }
                        while (ster.opSlang(slang));
                    this.Invalidate();
    volledige code van dat form:

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml;
    
    namespace JensVerlinden_SICT
    {
        public partial class SpeelScherm : Form
        {
            private bool gameIsBezig = false;
            private Slang slang;
            private Bollen bol;
            private Sterren ster;
            private bool onder, boven, links, rechts, verloren, tekenBol, tekenSter;
            private int aantalBollen = 0, score = 0, aantalBewegingen = 0, testScore = 0, opgegeten = 0, level = 0;
            private XmlDocument doc;
            private Form1 form1 = null; 
    
            public SpeelScherm()
            {
                this.InitializeComponent();
    
                slang = new Slang();
                bol = new Bollen();
                ster = new Sterren();
    
                rechts = true;
                tekenBol = true;
                score = 0;
                opgegeten = 0;
            }
    
            private void SpeelScherm_Load(object sender, EventArgs e)
            {
                //aanpassingen opslaan in XML		
           /*     XmlElement root = doc.DocumentElement;
                XmlNode node = root.SelectSingleNode("Speler");
                node.FirstChild.Value = lblSpeler.Text;*/
    
                
                lblSpeler.Text = Options.spelerNaam;
    
                if (Options.level1)
                {
                    timer.Interval = 1000;
                    level = 1;
                }
    
                if (Options.level2)
                {
                    timer.Interval = 750;
                    level = 2;
                }
    
                if (Options.level3)
                {
                    timer.Interval = 450;
                    level = 3;
                }
    
                if (Options.level4)
                {
                    timer.Interval = 250;
                    level = 4;
                }
            }
    
    
            //Spel loopt ?
            public bool getGameIsBezig()
            {
                return this.gameIsBezig;
            }
    
            private void SpeelScherm_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
            {
                toetsenbordInpunt(e);
            }
    
           //Toetsenbord controle
            public void toetsenbordInpunt(System.Windows.Forms.KeyEventArgs key)
            {
                if (key.KeyCode == Keys.Escape)
                {
                    doeGameOver(score);               
                }
    
                //spel is bezig dan gaan kijken naar toetsenbord input
                if (this.gameIsBezig!=null)
                {
                    //Bewegingen					
                    switch (key.KeyCode)
                    {
                        case Keys.Up: //2x hetzelfde in de if & else lus omdat het anders niet te goei werkte (slang blijft stilstaan, reden niet bekend).
                            if (boven)
                            {
                                onder = false;
                                boven = true;
                            }
                            else
                            {
                                onder = false;
                                boven = true;
                            }
                            links = false;
                            rechts = false;
                            break;
    
                        case Keys.Down:
                            if (onder)
                            {
                                boven = false;
                                onder = true;
                            }
                           else
                            {
                                boven = false;
                                onder = true;
                            }
                            links = false;
                            rechts = false;
                            break;
    
                        case Keys.Right:
                            if (rechts)
                            {
                                links = false;
                                rechts = true;
                            }
                            else
                            {
                                links = false;
                                rechts = true;
                            }
                            onder = false;
                            boven = false;
                            break;
    
                        case Keys.Left:
                            if (links)
                            {
                                links = true;
                                rechts = false;
                            }
                           else
                            {
    
                                links = true;
                                rechts = false;
                            }
                            onder = false;
                            boven = false;
                            break;
                    }
                }
            }
            public void paintComponent(PaintEventArgs g)
            {
    
                if (tekenBol)
                {
                    bol.teken(g);
                }
    
                if (tekenSter)
                {
                    ster.teken(g);
                }
    
                slang.teken(g);
    
            }
            //voor altijd te herpainten, anders wordt slang niet getekend
            protected override void OnPaint(PaintEventArgs e)
            {
                paintComponent(e);
                base.OnPaint(e);
            }
    
            private void timer_Tick(object sender, EventArgs e)
            {
                aantalBewegingen++;
    
                if (onder)
                {
                    slang.beweegOnder();
                    this.Invalidate(); //refreshen (opnieuw painten)            
                }
    
                if (boven)
                {
                    slang.beweegBoven();
                    this.Invalidate();
                }
    
                if (links)
                {
                    slang.beweegLinks();
                    this.Invalidate();              
                }
    
                if (rechts)
                {
                    slang.beweegRechts();
                    this.Invalidate();       
                }
    
                if (slang.heeftKop())
                {
                    verloren = true;
                }
    
                if (verloren)
                {
                    System.Media.SoundPlayer player = new System.Media.SoundPlayer();
                    player.SoundLocation = "..//..//gameover.wav";
                    player.Play();
                    doeGameOver(score);
                }
    
                if (bol.opSlang(slang))
                {
                    testScore = (35 - aantalBewegingen);
    
                    if (testScore <= 0)
                    {
                        testScore = 1;
                    }
    
                    score += testScore * level;
                    lblScore.Text = score.ToString();
                    aantalBollen++;
    
                    do
                    {
                        bol = new Bollen();
                        tekenBol = true;
                    }
                    while (bol.opSlang(slang));
    
                    slang.verleng();
                    aantalBewegingen = 0;
    
                    if ((aantalBollen - opgegeten) == 4)
                        do
                        {
                            ster = new Sterren();
                            tekenBol = false;
                            tekenSter = true;
                            aantalBewegingen++;
                            
                        }
                        while (ster.opSlang(slang));
                    this.Invalidate();
    
    
                    if (tekenSter)
                    {
                        sterTimer.Start();                    
    
                        if (ster.opSlang(slang))
                        {
                            System.Media.SoundPlayer player = new System.Media.SoundPlayer();
                            player.SoundLocation = "..//..//cash.wav";
                            player.Play();
    
                            score += (70 - aantalBewegingen) * level;
                            lblScore.Text = score.ToString();
                            opgegeten = aantalBollen;
    
                            tekenSter = false;
                            tekenBol = true;
    
                            slang.verleng();
    
                            aantalBewegingen = 0;
                            this.Invalidate();
                        }
                    }
                }
            }
    
    
            public int getScoren()
            {
                return score;
            }
    
            private void btnStart_Click(object sender, EventArgs e)
            {
                gameIsBezig = true;
                timer.Enabled = this.gameIsBezig;
            }
    
            private void sterTimer_Tick(object sender, EventArgs e)
            {
                opgegeten = aantalBollen;
                tekenSter = false;
                tekenBol = true;
                aantalBewegingen = 0;
                sterTimer.Stop();
                sterTimer.Dispose();
                sterTimer.Enabled = false;
                this.Invalidate();
            }
    
            private void doeGameOver(int score)
            {
                this.gameIsBezig = false;
                timer.Enabled = false;
    
                //Score opslaan
                Form1.ScoreOpslagen(score);
    
                string tekst = "Verloren! Uw score: " + score + "\n Terug naar beginscherm ?";
    
                if (MessageBox.Show(tekst, "Game Over", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    this.Hide();
                    form1 = new Form1();
                    form1.ShowDialog(this);
                    this.Close();
                }
                else
                {
                    this.Close();
                }
            }
        }
    }
    Iemand dat kan helpen?

Discussie informatie

Users Browsing this Thread

Op dit moment bekijken 1 gebruikers deze discussie. (0 leden en 1 gasten)

Regels voor berichten

  • Je mag geen nieuwe discussies starten
  • Je mag niet reageren op berichten
  • Je mag geen bijlagen versturen
  • Je mag niet je berichten bewerken
  •