Yritän tehdä peliä käyttäen XNAa. Tarvis keksii miten saan Windows Form buttonin avaamaan pelin :/
siis haluatko avata tekemäsi pelin toisella sovelluksella?
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.
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
Edelleen ongelma on miten saan sen pelin auki formin kautta.
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...
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
Nyt ei kyllä tuon pohjalta jaksa edes arvailla.
Sijamuodotkin ois kova sana. Kuulostaa aika hirveältä lukea tuota päässään.
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.
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.
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.
en ymmärrä. mikset voi tehdä sitä kirjautumista suoraan peliisi. Miksi sen ylipäätään pitää olla erillinen?
Siitä tulee steamin tapanen
E: Hmmm.. Tokihan sen vois laittaa steamin.. Mut mitenköhän API toimii XNAssa? Sillee kätsysti vaatis steam kirjautumisen.
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.
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
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ä.
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(); }
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ä
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.
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ä.
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.
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
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.