Gå til innhold

mini map editor sak til mulig pacman spill


Anbefalte innlegg

Ja, holder på å lage en liten map editor sak.. mye igjen men det flikrer noe helt usundt.

jeg ligger ved prosjektet som zip fil og koden direkte her på siden:

 

Public x As Int64
   Public y As Int64
   Public farge As Color
   Public pennen As New Pen(farge.Lime, 1)
   Public penwall As New Pen(farge.Blue, 3)
   Public walls As New ListBox
   Public ontheway As Boolean = False
   Public pos1 As New System.Drawing.Point
   Public pos2 As New System.Drawing.Point
   Public mouseclick As Boolean = False
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Timer1.Enabled = True
   End Sub

   Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       If mouseclick = True Then
           mouseclick = False
           If ontheway = False Then
               ontheway = True
               pos1.X = x
               pos1.Y = y
           ElseIf ontheway = True Then
               ontheway = False
               pos2.X = x
               pos2.Y = y
               addwall()
           End If
       End If
       redrawwalls()
   End Sub
   Public Sub tegn()
       'draw the x line
       Me.CreateGraphics.Clear(farge.Black)
       Me.CreateGraphics.DrawLine(pennen, x, 0, x, Me.Height)
       'draw the y line
       Me.CreateGraphics.DrawLine(pennen, 0, y, Me.Width, y)
   End Sub
   Public Sub redrawwalls()
       Dim i As Integer
       Dim temp() As String
       For i = 0 To walls.Items.Count - 1
           temp = Split(walls.Items.Item(i), "|")
           Me.CreateGraphics.DrawLine(penwall, CInt(temp(0)), CInt(temp(1)), CInt(temp(2)), CInt(temp(3)))
       Next
   End Sub
   Public Sub addwall()
       'save new wall to walls
       walls.Items.Add(pos1.X & "|" & pos1.Y & "|" & pos2.X & "|" & pos2.Y)
   End Sub
   Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
      x = e.X
       y = e.Y
       tegn()
   End Sub

   Private Sub Form1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus
       tegn()
   End Sub

   Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
       If e.Button.Left = MouseButtons.Left Then
           mouseclick = True
       End If
   End Sub

 

Det funker jo egentlig slik jeg ville men... flikringen var irriterende...?

 

BTW VB 7.0 ;)

mini_map_sak.zip

Endret av chills
Lenke til kommentar
Videoannonse
Annonse

Som GeirGrusom sa i en annen post, bruk Paint Events for formen. Type:

Private Sub frmMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
      e.Clear(farge.Black) 'Er ikke sikker på om denne faktisk trengs...

      'Draw the x line
      e.DrawLine(pennen, x, 0, x, Me.Height)
      'Draw the y line
      e.DrawLine(pennen, 0, y, Me.Width, y)
      
      'Redrawing walls...
      Dim temp() As String
      For i = 0 as Integer To walls.Items.Count - 1
          temp = Split(walls.Items.Item(i), "|")
          Me.CreateGraphics.DrawLine(penwall, CInt(temp(0)), CInt(temp(1)), CInt(temp(2)), CInt(temp(3)))
      Next
End Sub

 

Da bruker du bare e istedentfor Me.CreateGraphics. Istedenfor å kalle paint(), så kaller du Me.Invalidate. :)

Lenke til kommentar

Takk så mye... :D

 

Skal teste det så snart jeg kommer hjem fra skolen :cool:

 

EDIT:

 

Takker så mye.... testa den og funka perfect...

Men flimringen kan det komme av at jeg bruker split string function saken.. er ikke den litt for treg til dette?

Endret av chills
Lenke til kommentar

Det er jo selvfølgelig doublebuffer som mangler... :blush:

 

Legg til dette i frmMain_Load sub'en:

Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.DoubleBuffer, True) 

(der ControlStyles.DoubleBuffer er den viktigste...)

Lenke til kommentar
Bare hyggelig! :)

 

 

Jeg bruker samme grafikk kode til å lage alle nye 2d spill fantasien min skulle komme opp med :D

Så vi kan forvente oss en haug med Pacman-kloner i nærmeste fremtid? :p

5093882[/snapback]

 

Nja... for se.. men du bare lurer på et par nye ting...

Hva gjør jeg viss jeg vil bruke bitmaps som vegger og bakgrunn i stede for drawline...?

Men ja.. eg må prøve og lage en pacman klone.. alle som programmerer har vel det :!:

Lenke til kommentar

Bitmap som bakgrunn er jo enklest løst ved å sette et bilde som bakgrunn på formen ( Me.BackgroundImage = New Bitmap("test.jpg")).

 

Ved bruk av Bitmap som texture er jeg ikke sikker, men du kan nok bruke en TextureBrush til å tegne med.

       Dim br as New TextureBrush(Image.FromFile("greenstone"))

og tegne med den...

 

eller så kan du jo alltids tegne selve bildet...

       e.Graphics.DrawImage(Image.FromFile("test.jpg"), New Point(x, y))

Lenke til kommentar

TextureBrush er et objekt som inheriter fra Brush, for å tegne en TextureBrush må du bruke en rektangel, eller lignende, i Graphics.DrawRectangle(Brush, ...)

 

Det er enklere å bruke Graphics.DrawImageUnscaled(Image, ...) og bare laste bildet i et Image objekt

 

eksempel:

Private bgImg As Image = System.Drawing.Bitmap.FromFile("test.jpg")

Protected Override Sub OnPaint(sender As Object, e As PaintEventArgs)
 e.Graphics.DrawImageUnscaled(bgImage, pctDisp.Bounds)
End Sub

 

Hvis du bruker TextureBrush kan du fylle et polygon, eller sirkel etc. med en tekstur

 

eksempel:

Private bgImg As Image
Private m_fill As System.Drawing.Drawing2D.TextureBrush

Private m_poly() As Point

Public Sub New()
 bgImg = New System.Drawing.Bitmap.FromFile("test.jpg")
 m_fill = New System.Drawing.Drawing2D.TextureBrush(bgImg)

 m_poly = New Point() { _
 New Point(32, 32), _
 New Point(79, 16), _
 New Point(64, 96)} 

End Sub

Protected Override Sub OnPaint(sender As Object, e As PaintEventArgs)
 e.Graphics.FillPolygon(m_fill, m_poly);
 e.Graphics.DrawPolygon(System.Drawing.Pens.Black, m_poly);
End Sub

 

En god grunn til aldri å bruke CreateGraphics(), er fordi det er en funksjon, ikke et objekt, den lager et Graphics objekt hver gang du kaller den.

Lenke til kommentar

Sub New() er det man kaller en constructor

 

En constructor har til hensikt å initialisere et objekt med en gang det blir laget, og kanskje gi parameter

 

f.eks.

 

Public Structure MyPlayer
 Protected m_name As String
 Protected m_location As Point
 Public Sub New(playername As String)
   m_name = playername
   m_location = new Point(32, 32)
 End Sub
 Public Property Name() As String
   Get
     Return m_name
   End Get
   Set(value As String)
     m_name = value
   End Set
 End Property
End Structure

Public Sub Main()
 Dim a As Player
 a = New Player("Pacman")
 Console.WriteLine(a.Name)
End Sub

 

Det finnes også noe som heter destructor, denne heter

Protected Sub Finalize()

Den tar aldri noen parameter, men IDisposable brukes til fordel for Finalize.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...