Gå til innhold

Workblog, lage et 2d spill online, hjelpe meg?


Anbefalte innlegg

Hei!

 

Jeg har lyst til å lage dette spillet i min egen versjon:

Et slags bombemann spill i 2d, hvor eks 10 spillere på et brett skal sprenge vekk muren for å så ta hverandre...

"Orginalen"

 

Jeg har en del spørsmål angående dette, ikke direkte spørsmål men spørsmål om hva jeg må sette meg inn i for å kunne lage dette spillet.

 

Spillet skal programmeres i VB.NET 2005, både klient og server i vb.

 

Dette skal bli en workblog, jeg vil lage dette spillet.

Men jeg trenger en del hjelp underveis, spør her om hjelp og poster fremgangen etter hvert.

 

# Grafikk

Hvordan lager jeg 2d grafikk, hva må jeg bruke?

 

#Online delen

Hva må jeg sette meg inn i for å skrive "nett-delen" av programme.

 

# Skrive MapEditor?

Må jeg lage en map editor.

 

Er noen spørsmål jeg har til å begynne med, jeg ber ikke om hjelp med akkurat "det". Jeg ber om hjelp så jeg vet hva jeg skal google etter og hva jeg skal sette meg inn i. ;)

 

Jeg trenger innspill, ideer og tanker.

Personlig har jeg aldri laget et spill før så tar i mot alle slags tips, jeg kan VB men aldri programmert i grafikk før.

 

Jeg oppdaterer etter hvert med fremgang...

Lenke til kommentar
Videoannonse
Annonse

Jeg søkte litt og fant litt informasjon om de grafikk klassene som følger med .NET

Hvordan fungerer egentlig formene med den:

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
      
End Sub

 

Er det noen som vet hva som kaller OnPaint suben?

Óg hvordan kan jeg bruke det til å tegne alt i spillet?

 

 

Er det noen som har erfaring med å lage spill/grafikk med de klassene?

 

De virker som et greit alternativ, men det vil vel ta litt tid å sette seg inn i. :hmm:

 

Teknisk sett virker det enklere å bruke f.eks bildebokser som figurer, og som steiner i spillet. Er dette lurt eller vil det gå altfor tregt då?

 

*Back-too-google* :w00t:

 

Liten update:

 

Klassene til grafikk som fulgte med .net ser jo helt grei ut.

Har meldt meg inn i vbforum.com som svarer litt fortere enn her.

Det krever litt å sette seg inn i det, men eller ser jo de helt grei ut for jobben.

Når jeg kan grafikkdelen, må lage bitmaps og slikt. Skrive "story-line", planlegge litt før jeg setter i gang. :w00t:

Endret av chills
Lenke til kommentar

Etter litt tenking:

 

Spillet har jo flere deler som egentlig kan kodes før selve grafikk delen av spillet.

 

#Kollisjondeteksjon

#A.I for fienden når man spiller single player.

#MapEditor, lage en måte å designe kart på som er enkel for drawmap funksjonen å prosessere.

#Net delen av programmet, skrive serveren og klient modulen.

#Lage bitmaps for spillet.

#En form for 2d "engine".

 

Egentlig er det ganske mye jeg kan gjøre ferdig før jeg faktisk må lage selv grafikk koden, den koden gjør jo bare det å tegne spillet ikke noe annet.

Men burde vel vite at jeg klarer grafikk delen før jeg lager resten av programmet, må vel også begynne og lese litt om .NET sockets så internett delen av programmet blir funksjonabel og stabil.

 

Jaja holder på, er bare den OnPaint suben gir meg litt hodebry.

All grafikken som skal kunne bli redrawn må nemmelig bli laget med parameteren til den suben, så teknisk sett blir det kun OnPaint som kan tegne og den vet jeg heller ikke hvordan jeg kaller. :hmm:

 

Kanskje jeg skal gå vekk i fra tutorials og finne ferdig spill, har tetris ferdig laget som jeg fandt på nettet kan se på den koden så kanskje jeg forstår dette bedre.

Lenke til kommentar
kan ingen ting.. men det her ser veldig interessant ut.. Bombeman er digg for meg.. spes i online.. lykke til!

6021823[/snapback]

 

Takker... håper jeg får gjort det ferdig. :w00t:

 

---------------------

 

Mappe blir på 700*700, med andre ord "bombemannen" er på 35*35 så ble det 35*20=700 :cool:

Jeg tenkte jeg skulle lage mapeditoren nå, hvis jeg deler opp karte i (20*20) 400 firkanter, og lager properties for hver av de vil jo det være en grei måte å loade mappe på.

mapfile:

 

#1 brickwall
#2 hardwall
#3 brickwall | hidden=>stash
#4 empty | playerstart 

 

Det blir jo 400linjer for hvert map, går dette?

 

Hele mappet lastes inn i en array/listboks også slettes de i fra den etter hvert som de blir sprengt vekk fra karte. Så de ikke havner i redraw loopen.

Er dette en lite smart måte å gjøre det på, kan det bli for tregt?

 

Så lager jeg en function som loader mappe inn i minnet, og en til mapupdate. :cool:

Lenke til kommentar
SPØRSMÅL:

 

Hvordan har det seg at når jeg vil oppgradere skjermen at jeg må kalle:

 

  Me.Invalidate()

 

Hva har denne metoden med tegning på formet å gjøre?

 

Tusen takk for hjelp. :)

6021787[/snapback]

Du må manuelt invalidate formen slik at programmet vet at "wee. NÅ skal jeg repainte og revalidate". Enkelt og greit. Hadde vært litt upraktisk om den gjorde det for hver eneste kodelinje du skrev ;)

Lenke til kommentar

Du må skrive din egen "grafikkmotor" (i gåseøyne ettersom du allerede bruker GDI+) som tar seg av grafikk og timing, slik at du kan typisk si "flytt Tile(1) til venstre i løpet av 20 frames".

 

Men jeg ville heller brukt en allerede eksisterende motor. Selv er jeg, som du vet, glad i TrueVision 3D som fint kan benyttes til 2D. Da slipper du å tenke på selve grafikken og konsentrere deg om spillet (noe som blir vanskelig nok, tro meg).

Lenke til kommentar

Jeg skal i dag lage ferdig function som gjør om rutenummer til x og y verdi, får se hva mer jeg får tid til før jobb.

 

Riktig, jeg skal lage en bitte liten "graikkmotor" til spillet. Denne begynner jeg nok ikke på før alt annet er i orden, vil ha en skikkelig MapEditor som fungerer samt en del annen kode som kollisjonsdeteksjon.

 

Moskus:

Ja, jeg vet det. Men har lyst til å skrive min mitt "eget" 2d spill, så når jeg kan det skikkelig vil jeg prøve på 3d. Først 2d så 3d, men vil ha min egen kode.

Effektivt er det ikke, heller bare det at det er min kode.

 

Spørsmål:

 

Bevegelsen på figurene spillet skal jeg regulere det med en timer?

Altså jeg bruker en timer som MainGameLoop, og setter intervallen på den?

 

Sett at noen figurer skal gå fortere enn noen andre hvordan kan jeg gjøre det?

Kan hver figur ha en egen timer, eller blir det for rotete?

Lenke til kommentar
Bevegelsen på figurene spillet skal jeg regulere det med en timer?

Altså jeg bruker en timer som MainGameLoop, og setter intervallen på den?

 

Sett at noen figurer skal gå fortere enn noen andre hvordan kan jeg gjøre det?

Kan hver figur ha en egen timer, eller blir det for rotete?

6033118[/snapback]

1) En timer vil jo fungere, men hvis du har undersøkt litt, vil du finne ut at Visual Studios innebygde Timer ikke er utrolig bra. Den er ikke så nøyaktig som man skulle ønske, men kode til annen timer burde absolutt være mulig å finne på nettet...

 

2) En timer vil nok være en fordel. Hvis man skal ha en figur til å gå raskere enn andre, er det jo bare å skru opp antall pixler (eller whatever) den skal flytte seg for hver gjennomgang av MainLoop.

Lenke til kommentar
Hvorfor har du satt et breakpoint der? (og har du startet timeren?)

6033307[/snapback]

Et eksempel, break fungerer ikke noen steder i koden. :(

Heller ikke på formload. :(

 

Jeg har flere funksjon som jeg vil skal kunne "tegne" så kan jeg parse parameteren til OnPaint rundt til de funksjonene? :hmm:

 

Løsningen på det ene problemet ble å lage ny proskjekt fil, virker som noe hva korrupt.

:thumbup:

Endret av chills
Lenke til kommentar
Et eksempel, break fungerer ikke noen steder i koden.  :(

Heller ikke på formload. :(

6033319[/snapback]

Det er fordi at teknisk sett "skjer det ikke noe programmatisk" hvis jeg har forstått MSDN riktig (har tenkt på dette selv). Med andre ord kan man ikke sette break på kommandoer som "btnOK.Focus", mens utregning, if-setninger (og tilsvarende) eller tilordning av variable går helt fint, som f.eks. "strTest = Dette er en test".

Lenke til kommentar

Jeg har et problem, i map editoren min så blir ikke alle rutene fylt med farge.

Kun den øverste ruten til venstre blir fylt, ikke alle.

Hva er det jeg har oversett, koden:?

 

Public Class Form1
   Public con As New settings
   'propertis for settings
   Public player1startpos As Integer = 1
   Public player2startpos As Integer
   Public brickwall As Integer
   Public hardwall As Integer
   Public brickwallspecial As Integer
   Public showgrid As Integer = 0
   Public showbitsmaps As Boolean = False
   Public kart As New ListBox
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       con.Visible = True
       con.Focus()
       Dim i As Integer = 0
'fyller med tomme ting
       Do Until (i = 399)
           map.Items.Add("hei")
           i += 1
       Loop
       Debug.WriteLine(map.Items.Count)
       Dim i2 As Integer = 0
       Dim u As Integer = 0
       Dim u2 As Integer = 0
'lagrer x og y verdi for alle rutene
       For i2 = 0 To 399
           If u = 20 Then
               u2 += 1
               u = 0
           End If
           kart.Items.Add(u2 * 35 & "|" & u * 0)
       Next
   End Sub
   Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
       'Tegner gridde
       If showgrid = 0 Then
           If showbitsmaps = True Then
               loadgrafikk(e)
           End If
           Exit Sub
       End If
       Dim x As Integer = 35
       Dim i As Integer = 0
       Do Until (i = 19)
           e.Graphics.DrawLine(Pens.Blue, 0, x, Me.Width, x)
           x += 35
           MyBase.OnPaint(e)
           i += 1
       Loop
       i = 0
       x = 35
       Do Until (i = 19)
           e.Graphics.DrawLine(Pens.Blue, x, 0, x, Me.Height)
           x += 35
           MyBase.OnPaint(e)
           i += 1
       Loop
       If showbitsmaps = True Then
           loadgrafikk(e)
       End If
   End Sub
   Public map As New ListBox
   Public Function solvrute(ByVal pos As Point) As Integer
       Dim x As Integer = pos.X
       Dim y As Integer = pos.Y
       Dim temp As Integer = 35
       Dim xrute As Integer = 0
       Dim yrute As Integer = 0
       Do
           If x < temp Then
               xrute = (temp / 35)
               Exit Do
           End If
           temp += 35
       Loop
       temp = 35
       Do
           If y < temp Then
               yrute = (temp / 35)
               Exit Do
           End If
           temp += 35
       Loop
       temp = 0
       temp = xrute * 20
       temp = temp - (20 - yrute)
       Return temp
   End Function
   Public Function solvpos(ByVal rute As Integer) As Drawing.Point
       Dim temp() As String
       Dim loc As New Drawing.Point
       temp = Split(kart.Items.Item(rute), "|")
       loc.X = CInt(temp(0))
       loc.Y = CInt(temp(1))
       Return loc
   End Function

   Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
       Dim what As String = Nothing
       If player1startpos = 1 Then
           ' map.Items.Item((solvrute(e.Location))) = String.Empty
           map.Items.Item(solvrute(e.Location)) = "player1startpos"
       ElseIf player2startpos = 1 Then
           'map.Items.Item(solvrute(e.Location)) = String.Empty
           map.Items.Item(solvrute(e.Location)) = "player2startpos"
       ElseIf brickwall = 1 Then
           'map.Items.Item(solvrute(e.Location)) = String.Empty
           map.Items.Item(solvrute(e.Location)) = "brickwall"
       ElseIf hardwall = 1 Then
           'map.Items.Item(solvrute(e.Location)) = String.Empty
           map.Items.Item(solvrute(e.Location)) = "hardwall"
       End If
       Debug.WriteLine(map.Items.Item(solvrute(e.Location)))
   End Sub
   Public Sub savemap()
       If Not sf1.FileName = String.Empty Then
           Dim i As Integer = 0
           FileOpen(1, sf1.FileName, OpenMode.Output)
           For i = 0 To map.Items.Count - 1
               PrintLine(1, map.Items.Item(i))
           Next
       End If
   End Sub

   Private Sub sf1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles sf1.FileOk
       savemap()
   End Sub
   Public Sub loadgrafikk(ByVal e As System.Windows.Forms.PaintEventArgs)
       'Sette farge på veggene
       Dim x As Integer
       Dim y As Integer
       Dim i As Integer = 0
       For i = 0 To map.Items.Count - 1
           If map.Items.Item(i) = "brickwall" Then
               x = solvpos(i).X
               y = solvpos(i).Y
               Debug.WriteLine("Rute: " & i & " " & x & " " & y)
               Me.CreateGraphics.FillRectangle(Brushes.Black, x, y, 35, 35)
           End If
           MyBase.OnPaint(e)
       Next
   End Sub

End Class

Endret av chills
Lenke til kommentar

Hmmm... dette synes jeg var veldig rotete. Tror det er lurt å ta en generell opprydning her. Tenk klasser! Her ramser jeg opp noen forslag til forbedringer, ikke ta det som personlig kritikk, men heller som forslag til å forbedre spillet ditt :)

 

Listbokser er fy-fy til lagring, de skal kun brukes synlig i grensesnittet.

 

Jeg ville laget en klasse for en "Brick", og så brukt en todimensjonal array av Brick-klassen. Da er det mye lettere å loope gjennom denne i x- og y-retning.

Da kan også metoder som sier om en gitt brikke er lov å gå på lages i Brick-klassen: If brick(x + 1, y).CanWalk Then ...

 

Det at du brukes listbox til å lagre kartet gjør det også veldig vanskelig å lese koden.

 

Du bør også lese litt om OnPaint... kall til MyBase.OnPaint bør bare gjøres en gang i din OnPaint.

 

Loadgrafikk-metoden din kjører samme solvpos(i) to ganger, noe som er unødvendig.

 

Do-loopen i solvrute- og OnPaint-metoden din gjør -nesten- eksakt det samme to ganger, dette bør skilles ut i metoder med parametre.

 

Svaret på spørsmålet ditt:

Loopen din i Form_Load er mangelfull. Jeg fikk det til slik:

 

For i2 = 0 To 399
  If u = 20 Then
     u2 += 1
     u = 0
  End If
  kart.Items.Add(u2 * 35 & "|" & u * 35)
  u += 1
Next

Lykke til videre!

 

Øyvind

Lenke til kommentar

Øyvind:

Tusen takk for hjelpen... kjempe bra innlegg.

Det løste problemet og koden funker.

 

Ja, slapp av jeg tar alt du sa som forslag/tips ikke kritikk. ;)

Du har rett, jeg skal se om jeg kan rydde opp i koden før jeg jobber videre.

God ide angåede arrays og klasser, skal begynne nå.

 

Bare så glad det funker no. :blush: Takk igjen. :w00t:

 

Skal vi se, du har vel ikke en link til et program som ligger inn html kode inni "koden" min sånn at jeg får farger på koden på riktig sted. Mener jeg har "hørt" noe om det, svakt minne om det. En her på forumet som laget det... :dontgetit:

Lenke til kommentar

Jeg har nå laget en klasse for all håndtering av kart, hvor jeg brukte to arrays en til x og en til y. Også en til og holde hele karte.

 

Problemet mitt nå er at når jeg trykker på mapet for å lage "brickwall" i en rute, redrawes alle brickwallene på hele mappen og det blinker/flikrer.

Aktiverer jeg dubbel buffering, forsvinner de helt? :dontgetit:

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...