Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: XNA + VB

Sivun loppuun

virus4 [26.05.2013 00:32:34]

#

Yritän tehdä peliä käyttäen XNAa. Tarvis keksii miten saan Windows Form buttonin avaamaan pelin :/

groovyb [26.05.2013 10:02:33]

#

siis haluatko avata tekemäsi pelin toisella sovelluksella?

virus4 [26.05.2013 10:55:33]

#

groovyb kirjoitti:

siis haluatko avata tekemäsi pelin toisella sovelluksella?

En. Samaan projektiin voi tehä myös Windows Formeja. Haluan että peliin täytyy ensin kirjautua sisään ja sit vasta peli aukeaa.

Rox [26.05.2013 21:38:55]

#

Jos VB.Netillä meinaat niin sehän on aika helppo, siis tehdä jotain jos salasana oikein / väärin.

If TextBox1.Text = "Salasana" Then
'Peli aukeaa.
Else
MessageBox.Show("Väärä salasana!")
End If

virus4 [27.05.2013 00:01:03]

#

Edelleen ongelma on miten saan sen pelin auki formin kautta.

Rox [27.05.2013 08:04:12]

#

En tuosta XNA:sta tiedä yhtään mitään mutta jos se on sulla form2:ssa, lisää form 1:seen buttoni, ja lisää sen alle Form2.Show()

?

Kerro tarkemmin...

virus4 [27.05.2013 19:07:28]

#

Rox kirjoitti:

En tuosta XNA:sta tiedä yhtään mitään mutta jos se on sulla form2:ssa, lisää form 1:seen buttoni, ja lisää sen alle Form2.Show()

?

Kerro tarkemmin...

Se avaus toimii sub mainin kautta ja se käyttää: game.run(), mutta formissa vetää error

groovyb [28.05.2013 10:42:16]

#

Nyt ei kyllä tuon pohjalta jaksa edes arvailla.

The Alchemist [28.05.2013 10:59:39]

#

Sijamuodotkin ois kova sana. Kuulostaa aika hirveältä lukea tuota päässään.

Rox [28.05.2013 17:59:25]

#

Jos apua kaipaat niin suosittelen kertomaan vähän enemmän. Tai sitten postaa koko projekti tänne ja toivo että joku jaksaa sen ladata.

runeberg [28.05.2013 21:47:50]

#

XNA ei ole tarkoitettu winforms koodaukseen (ei tarjoa edes hiiritukea default projektissa) eikä niikseen formit toimi xna ympäristössä (paitsi pienellä kikkailulla, mikä ei maksa vaivaa). Xna on puhtaasti "pelimoottori", mutta vastaavan systeemin saat kun piirrät vaikka paintilla sen buttonin ja rivillä koodia saat sen toimimaan kuten winform buttonin.

Unohtu. VB.Net toimii xna ympyröissä kielenä joilla hoidetaan logiikat (silmukat, ehdot yms. normi kaura) mutta muuten visual studion "raahaa formille ja kliksuta objektin asetukset" ei toimi.

virus4 [28.05.2013 23:20:30]

#

runeberg kirjoitti:

XNA ei ole tarkoitettu winforms koodaukseen (ei tarjoa edes hiiritukea default projektissa) eikä niikseen formit toimi xna ympäristössä (paitsi pienellä kikkailulla, mikä ei maksa vaivaa). Xna on puhtaasti "pelimoottori", mutta vastaavan systeemin saat kun piirrät vaikka paintilla sen buttonin ja rivillä koodia saat sen toimimaan kuten winform buttonin.

Unohtu. VB.Net toimii xna ympyröissä kielenä joilla hoidetaan logiikat (silmukat, ehdot yms. normi kaura) mutta muuten visual studion "raahaa formille ja kliksuta objektin asetukset" ei toimi.

Pitäneen tehdä sit erillinen ohjelma joka avaa sen ja kommunikoi :/ eipä taida kovin tehokas olla tai turvallinen.

groovyb [28.05.2013 23:39:52]

#

en ymmärrä. mikset voi tehdä sitä kirjautumista suoraan peliisi. Miksi sen ylipäätään pitää olla erillinen?

virus4 [29.05.2013 00:40:28]

#

Siitä tulee steamin tapanen

E: Hmmm.. Tokihan sen vois laittaa steamin.. Mut mitenköhän API toimii XNAssa? Sillee kätsysti vaatis steam kirjautumisen.

The Alchemist [29.05.2013 07:06:39]

#

Siis miten tuollainen ratkaisu ei olisi "tehokas"? Mitä se edes tarkoittaa? Eihän se kirjautumissovellus tee yhtään mitään siinä taustalla, kun peli on käynnissä. Binäärien lukumäärä ei myöskään tarkoita "turvallisuuden" (mitä tuo sana sitten edes tarkoittaa) kannalta yhtään mitään.

neau33 [29.05.2013 08:47:28]

#

Morjens!

Täällä puhutaan nyt niin paljon paskaa että..., no tässä aivan sikasimppeli esimerkki...

1. Klikkaa Solution Explorerissa projektin kuvaketta (toiseksi ylin) hiiren oikealla ja valitse Add -> New Item -> Windows Form

2. Klikkaa samaista kuvaketta uudestaan hiiren oikealla ja valitse Add Reference -> etsi .Net välilehden listalta System.Windows.Forms ja
tuplakilkkaa nimeä

3. Avaa Form1.vb [Design] -> raahaa formille Toolboxista 1 textboxi ja 2 nappia

4. Tuplaklikka design tilassa hiirelle ensin formia ja sen jälkeen kutakin nappia vuorollaan

5. Copy/Paskanna esimerkin 'Main: Sub New() tapahtuman koodissa merkittynä oleva osa projektisi vastaavan paikkaan

6. Copy/Paskanna esimerkin 'Form1: tapahtumien koodit projektisi Form1 tapahtumien vastaaviin paikkoihin

'Main:
Public Class Game1

    Inherits Microsoft.Xna.Framework.Game

    Private WithEvents graphics As GraphicsDeviceManager
    Private WithEvents spriteBatch As SpriteBatch

    Public Sub New()

        'Lisää katkoviivoitusten välissä oleva pätkä:
        '--------------------------------------------------------------------
        Dim frmLogin As System.Windows.Forms.Form = New Form1
        frmLogin.StartPosition = Windows.Forms.FormStartPosition.CenterScreen
        frmLogin.ShowDialog()
        frmLogin.Dispose()
        '--------------------------------------------------------------------

        graphics = New GraphicsDeviceManager(Me)
        Content.RootDirectory = "Content"

    End Sub

    ''' <summary>
    ''' Allows the game to perform any initialization it needs to before starting to run.
    ''' This is where it can query for any required services and load any non-graphic
    ''' related content.  Calling MyBase.Initialize will enumerate through any components
    ''' and initialize them as well.
    ''' </summary>
    Protected Overrides Sub Initialize()
        ' TODO: Add your initialization logic here
        MyBase.Initialize()
    End Sub

    ''' <summary>
    ''' LoadContent will be called once per game and is the place to load
    ''' all of your content.
    ''' </summary>
    Protected Overrides Sub LoadContent()
        ' Create a new SpriteBatch, which can be used to draw textures.
        spriteBatch = New SpriteBatch(GraphicsDevice)

        ' TODO: use Me.Content to load your game content here
    End Sub

    ''' <summary>
    ''' UnloadContent will be called once per game and is the place to unload
    ''' all content.
    ''' </summary>
    Protected Overrides Sub UnloadContent()
        ' TODO: Unload any non ContentManager content here
    End Sub

    ''' <summary>
    ''' Allows the game to run logic such as updating the world,
    ''' checking for collisions, gathering input, and playing audio.
    ''' </summary>
    ''' <param name="gameTime">Provides a snapshot of timing values.</param>
    Protected Overrides Sub Update(ByVal gameTime As GameTime)
        ' Allows the game to exit
        If GamePad.GetState(PlayerIndex.One).Buttons.Back = ButtonState.Pressed Then
            Me.Exit()
        End If

        ' TODO: Add your update logic here
        MyBase.Update(gameTime)
    End Sub

    ''' <summary>
    ''' This is called when the game should draw itself.
    ''' </summary>
    ''' <param name="gameTime">Provides a snapshot of timing values.</param>
    Protected Overrides Sub Draw(ByVal gameTime As GameTime)
        GraphicsDevice.Clear(Color.CornflowerBlue)

        ' TODO: Add your drawing code here
        MyBase.Draw(gameTime)
    End Sub

End Class
'Form1:
Imports System.Windows.Forms

Public Class Form1 : Inherits Form

    Private Password As String = "salasana" 'esim.

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Me.ControlBox = False
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
        TextBox1.PasswordChar = CType("*", Char)
        Button1.Text = "Login"
        Button2.Text = "Cancel"

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        If TextBox1.Text = "" Then
            TextBox1.Focus() : Exit Sub
        End If

        Static i As Integer : i += 1

        If TextBox1.Text = Password Then
            Me.Close()
        Else
            MsgBox("Väärä salasana")
            TextBox1.Clear()
        End If

        If i > 2 Then
            MsgBox("Salasana on annettu väärin 3 kertaa - ohjelma suljetaan")
            End
        End If

    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        MsgBox("Ohjelma suljetaan")
        End
    End Sub


End Class

Isopaha [29.05.2013 09:36:35]

#

Mitähän iloa tuollaisesta järjestelmästä on ellei kyseessä ole jonkinsortin verkossa pelattava peli missä autentikointi ja muu tiedonvaihto tapahtuu verkossa. Tuollaisenaan tuon koko kirjautumisen ohittamiseen ei tarvitse montaa aivosolua viritellä.

groovyb [29.05.2013 09:54:31]

#

niin ja jos kirjautuminen tarvitaan, miksei sitä dialogia voi piirtää kiinteästi peliin. Pidetään noista peliohjelmoinneista Windows Forms:it kaukana.

C# plain dialog -esimerkki (lainattu stackoverflow:sta):

public void DisplayPopup (string Title, string Text, string AssetPicturePath, SpriteBatch batch)
    {
        FillText = new Texture2D(game.GraphicsDevice, 1, 1);
        FillText.SetData(new Color[] { Color.White });
        //Draw rectangle, center screen,
        Rectangle MainBox;
        MainBox.Width = 700;
        MainBox.Height = 400;
        MainBox.X = game.Window.ClientBounds.Width / 2 - MainBox.Width / 2;
        MainBox.Y = game.Window.ClientBounds.Height / 2 - MainBox.Height / 2;

        //Draw Title
        Rectangle TitleBox;
        TitleBox.Width = 650;
        TitleBox.Height = (int)ArialFont.MeasureString(Title).Y;
        Padding = MainBox.Width / 2 - TitleBox.Width / 2;
        TitleBox.X = (int)Padding + MainBox.X;
        TitleBox.Y = (int)Padding + MainBox.Y;

        //Draw Line Between Title and TextBox
        Rectangle TextSeperator;
        TextSeperator.Width = MainBox.Width - (int)Padding * 2;
        TextSeperator.Height = 1;
        TextSeperator.X = MainBox.X + (int)Padding;
        TextSeperator.Y = TitleBox.Y + (int)(Padding * 1.2);

        //Draw PictureBox
        Rectangle PictureBox;
        if (AssetPicturePath != string.Empty)
            PictureBox.Width = 200;
        else
            PictureBox.Width = 0;

        PictureBox.Height = 250;
        PictureBox.X = MainBox.X + (int)Padding;
        PictureBox.Y = MainBox.Y + TitleBox.Height + (int)Padding * 2;

        MainBox.Height = PictureBox.Y - MainBox.Y + PictureBox.Height + (int)Padding;

        //Draw TextBody
        Rectangle TextBody;
        if (AssetPicturePath == string.Empty)
            TextBody.Width = MainBox.Width - ((int)Padding * 2);
        else
            TextBody.Width = MainBox.Width - ((int)Padding * 3) - PictureBox.Width;
        TextBody.Height = MainBox.Height - ((int)Padding * 3) - TitleBox.Height;
        if (AssetPicturePath == string.Empty)
            TextBody.X = PictureBox.X;
        else
            TextBody.X = PictureBox.X + PictureBox.Width + (int)Padding;
        TextBody.Y = TitleBox.Y + TitleBox.Height + (int)Padding;

        //Draw MainBox
        batch.Draw(FillText, MainBox, Color.Wheat);
        //Draw PictureBox
        //batch.Draw(FillText, PictureBox, Color.Green);
        if (AssetPicturePath != string.Empty)
            batch.Draw(game.Content.Load<Texture2D>(AssetPath + AssetPicturePath.TrimStart(new char[] { '/' })), PictureBox, Color.White);
        //Draw TitleBox
        //batch.Draw(FillText, TitleBox, Color.BlueViolet);
        batch.DrawString(ArialFont, Title, new Vector2(TitleBox.X, TitleBox.Y),Color.Blue);
        //Draw Line Between Title And TextBody
        batch.Draw(FillText, TextSeperator, Color.Gray);
        //Draw TextBody
        //batch.Draw(FillText, TextBody, Color.Indigo);
        int LineNumber = 0;
        foreach (string Line in WrapText(Text, TextBody.Width))
        {
            batch.DrawString(ArialFont, Line, new Vector2(TextBody.X, TextBody.Y + (LineNumber * ArialFont.MeasureString(Line).Y)), Color.Black);
            LineNumber++;
        }

    }
    private object[] WrapText(string text, float Length)
    {
        string[] words = text.Split(' ');
        ArrayList Lines = new ArrayList();
        float linewidth = 0f;
        float spaceWidth = ArialFont.MeasureString(" ").X;
        int CurLine = 0;
        Lines.Add(string.Empty);
        foreach (string word in words)
        {
            Vector2 size = ArialFont.MeasureString(word);
            if (linewidth + size.X < Length)
            {
                Lines[CurLine] += word + " ";
                linewidth += size.X + spaceWidth;
            }
            else
            {
                Lines.Add(word + " ");
                linewidth = size.X + spaceWidth;
                CurLine++;
            }
        }
        return Lines.ToArray();
    }

neau33 [29.05.2013 10:43:04]

#

MORJENS!

virus4 kirjoitti:

Yritän tehdä peliä käyttäen XNAa. Tarvis keksii miten saan Windows Form buttonin avaamaan pelin :/

Isopaha kirjoitti:

Mitähän iloa tuollaisesta järjestelmästä on ellei...

groovyb kirjoitti:

Pidetään noista peliohjelmoinneista Windows Forms:it kaukana.
C# plain dialog -esimerkki (lainattu stackoverflow:sta):

sama se onko iloa vaiko ei vaan sitä tässä alunperin kyseltiin, mutta jos kirjautuminen halutaan tsekata web-palvelimelta niin esim.
jolloin sikasimppelein php-sivu voisi näyttää esim. tältä ja erittäin simppeli php/mysql sivu voisi näyttää esim. tältä

toisaalta taas C#-koodit vois hyvin pukata aivan muihin osioihin... käännös löytyy täältä

Isopaha [29.05.2013 10:57:55]

#

neau33 kirjoitti:

sama se onko iloa vaiko ei, mutta sitä tässä alunperin kyseltiin

Omasta mielestäni se on huomattavasti rakentavampaa ohjata toinen ymmärtämään miksi asiat kannattaisi ehkä tehdä toisella tapaa, kuin lätkiä aivottomasti koodia, joiden käyttäminen todennäköisesti tulevaisuudessa johtaa taas uusiin ongelmiin.

Mutta samapa tuo minulle, viirus varmaan sai jo vastauksen kysymykseensä ja elää onnellisena tämän tiedon kanssa.

The Alchemist [29.05.2013 12:28:52]

#

Itse kyllä ehdottomasti käyttäisin kirjautumiseen jotain käyttiksen natiivia dialogia, jos kirjautuminen voidaan tehdä ennen pelin käynnistämistä. Tämä tosin johtuu siitä, että kaikki tietämäni pelien omat valikkoratkaisut ovat aivan hirveitä. Tietääkseni ei olisi mikään pakko koodata huonoja käyttöliittymiä, mutta jostain syystä hyviä ei osata tehdä.

runeberg [29.05.2013 20:56:03]

#

Winformit eivät vaan kuulu xna ympäristöön, vaikka niitä käyttää voikin. Formuloillakin voi ajaa tieliikenteessä, mutta sitä varten on kehitetty siihen sopivampia pelejä.

Ei kukaan rupea jollain quake 3d moottorilla väsäämään kirjautumis dialogia.

neau33 [30.05.2013 03:57:18]

#

MOI!

runeberg kirjoitti:

Winformit eivät vaan kuulu xna ympäristöön...Formuloillakin voi ajaa tieliikenteessä...

 Onko se jotenkin vittu laitonta käyttää Winformeja Windows alustalla???

-Nea

runeberg [28.06.2013 21:23:51]

#

Pitkästä aikaa tuli näitäkin luettua, joten anteeksi hiukan myöhäinen vastaus.

Laitontahan se ei ole, vaan koko xna:n idea on olla pelien kehitysympäristö. Voithan koodata xna:lla uuden version visual studiosta jos mieles tekee, ei xna resurssit ole rajoitettu pelien kehittämiseen (se on vain yks framework .Netin rinnalle). Mutta koitappa portata se virityksesi xbox maailmaan yms. mikä koko homman idea on.

Samat ominaisuudet siinä on kuin muissakin .Net hommissa, mutta kaikki on toteutettu pelikehitys edellä (sisältäen esim GameTime olion oletuksena luupissa) matriisien pyörityksestä lähtien, mitä ennen sai vaan directx devin mukana.

En tiedä Nea millon viimeks oot pelaillu windowsissa pelejä, mutta mulla viimeinen kosketus winform peliin on Areena 5, jota hakkasin monta vuotta, kunnes viimeinen pisara oli kun mun kaikkien aikojen lemppari gladiaattori (goblin) lähti eläkkeelle.

Eli yhteenvetona, laitonta ei ole, mutta kiellettyä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta