Jump to content

Arkanoid


ricafilipe
 Share

Recommended Posts

Estou a fazer o jogo arkanoid para a pap em vb.net (sim, má escolha).

Consegui desenhar as paredes, a bola e a barra com a propriedade e.graphics.

Até aqui tudo bem. O problema é que preciso de criar um thread e meter o código do e.graphics lá dentro, para quando andar para o lado a barra actualizar e também andar.

Mas sempre que meto lá dentro dá erro.

Deixo aqui o código, alguém me ajuda?

Public Class Form1
    Dim x As Integer = 250 ' bola
    Dim y As Integer = 250 ' bola
    Dim b1 As Integer = 170 ' barra
    Dim b2 As Integer = 270 ' barra
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) ' interface
        Dim g As Graphics = e.Graphics
        Dim pn As Pen = New Pen(Color.Green, 8)
        g.DrawLine(pn, b1, 430, b2, 430) ' barra
        g.DrawEllipse(New Pen(Color.Red, 5), x, y, 5, 5) ' bola
        Dim point1 As PointF = New PointF(5.0F, 450.0F)
        Dim point2 As PointF = New PointF(5.0F, 5.0F)
        Dim point3 As PointF = New PointF(450.0F, 5.0F)
        Dim point4 As PointF = New PointF(450.0F, 450.0F)
        Dim curvePoints As PointF() = {point1, point2, point3, point4}
        g.DrawPolygon(New Pen(Color.Chocolate, 10), curvePoints) ' paredes
    End Sub
    Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean ' mover barra
        Select Case (keyData)
            Case Keys.Right
                If x = 490 Then
                Else
                    b1 = b1 + 5
                    b2 = b2 + 5
                End If
                Return True
            Case Keys.Left
                If x = 15 Then
                Else
                    b1 = b1 - 5
                    b2 = b2 - 5
                End If
                Return True
        End Select
        Return MyBase.ProcessDialogKey(keyData)
    End Function
End Class
Link to comment
Share on other sites

Tipo, ele não deixa declarar isto:

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) ' interface
        Dim g As Graphics = e.Graphics
        Dim pn As Pen = New Pen(Color.Green, 8)
        g.DrawLine(pn, b1, 430, b2, 430) ' barra
        g.DrawEllipse(New Pen(Color.Red, 5), x, y, 5, 5) ' bola
        Dim point1 As PointF = New PointF(5.0F, 450.0F)
        Dim point2 As PointF = New PointF(5.0F, 5.0F)
        Dim point3 As PointF = New PointF(450.0F, 5.0F)
        Dim point4 As PointF = New PointF(450.0F, 450.0F)
        Dim curvePoints As PointF() = {point1, point2, point3, point4}
        g.DrawPolygon(New Pen(Color.Chocolate, 10), curvePoints) ' paredes
    End Sub

dentro do thread.

E como é que vou fazer para ele actualizar o desenho? Assim a barra andava.

É que senão é tipo no form load. Abre e não faz nada. Fica parado porque já leu.

Link to comment
Share on other sites

ao fazer da maneira como tas a fazer vai dar um problema do caraças. Na minha opinião devias usar images e não estar sempre a desenhar tudo. porque vais gastar muitos recursos a máquina em 1º lugar, e em segundo vais ver a parede a aparecer e desaparecer como vez no código.

Mas aqui vai.

O código a funcionar. tens uma função que se chama me.creategraphics que te devolve o graphics da form.

Public Class Form1
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select Case (e.KeyData)
            Case Keys.Right
                If x = 490 Then
                Else
                    b1 = b1 + 5
                    b2 = b2 + 5
                End If
            Case Keys.Left
                If x = 15 Then
                Else
                    b1 = b1 - 5
                    b2 = b2 - 5
                End If
            Case Else
                Exit Sub
        End Select
        Dim formGraphics As Graphics
        formGraphics = Me.CreateGraphics()
        makedraw(formGraphics)
    End Sub


    Dim x As Integer = 250 ' bola
    Dim y As Integer = 250 ' bola
    Dim b1 As Integer = 170 ' barra
    Dim b2 As Integer = 270 ' barra
    Public Sub makedraw(ByVal g As System.Drawing.Graphics)
        Application.DoEvents()
        g.Clear(Color.AntiqueWhite)
        Dim point1 As PointF = New PointF(5.0F, 450.0F)
        Dim point2 As PointF = New PointF(5.0F, 5.0F)
        Dim point3 As PointF = New PointF(450.0F, 5.0F)
        Dim point4 As PointF = New PointF(450.0F, 450.0F)
        Dim curvePoints As PointF() = {point1, point2, point3, point4}
        g.DrawPolygon(New Pen(Color.Chocolate, 10), curvePoints) ' paredes
        Dim pn As Pen = New Pen(Color.Green, 8)
        g.DrawLine(pn, b1, 430, b2, 430) ' barra
        g.DrawEllipse(New Pen(Color.Red, 5), x, y, 5, 5) ' bola
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        makedraw(e.Graphics)
    End Sub
End Class

Se quiseres fazer duma maneira mais correcta basta dizer que o pessoal aqui ajuda-te

Link to comment
Share on other sites

Não entendo o porque da thread sinceramente :S só se for para a bolita saltitona

axo que não e necessário.

Mete uma picturebox com o fundo a transparente e mete la este código no teu trabalho. paredes só faz 1 vez

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select Case (e.KeyData)
            Case Keys.Right
                If b1 >= 450 - 100 Then
                    Exit Sub
                Else
                    b1 = b1 + 5
                    b2 = b2 + 5
                End If
            Case Keys.Left
                If b1 <= 10 Then
                    Exit Sub
                Else
                    b1 = b1 - 5
                    b2 = b2 - 5
                End If
            Case Else
                Exit Sub
        End Select
        Dim formGraphics As Graphics
        formGraphics = Me.CreateGraphics()
        makedraw(formGraphics)
    End Sub


    Dim x As Integer = 250 ' bola
    Dim y As Integer = 250 ' bola
    Dim b1 As Integer = 170 ' barra
    Dim b2 As Integer = 270 ' barra
    Public Sub makedraw(ByVal g As System.Drawing.Graphics)

        g.Clear(Color.AntiqueWhite)
        Dim pn As Pen = New Pen(Color.Green, 8)
        g.DrawLine(pn, b1, 430, b2, 430) ' barra
        g.DrawEllipse(New Pen(Color.Red, 5), x, y, 5, 5) ' bola
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim img As Bitmap = New Bitmap(450, 450)
        Dim g As Graphics = Graphics.FromImage(img)
        Dim point1 As PointF = New PointF(5.0F, 450.0F)
        Dim point2 As PointF = New PointF(5.0F, 5.0F)
        Dim point3 As PointF = New PointF(450.0F, 5.0F)
        Dim point4 As PointF = New PointF(450.0F, 450.0F)
        Dim curvePoints As PointF() = {point1, point2, point3, point4}
        g.DrawPolygon(New Pen(Color.Chocolate, 10), curvePoints) ' paredes
        PictureBox1.Image = img
        makedraw(e.Graphics)
        Debug.Print(2)
    End Sub

Editei o código das barras.... tavas a confundir o x da bola com a barra. Fogo vou fazer 1 também \o/  isto é divertido 👍

Link to comment
Share on other sites

boas pessoal...

eu e o ricafilipe vamos fazer a PAP juntos isto é grupo de 2, o nosso trabalho é fazer o Arkanoid, o codigo k ta em cima no 1º post era o que nos estavamos a tentar fazer, com vossa ajuda ja metemos a barra andar mas como posso meter a picturebox atras a fzer tipo de wallpaper e a barra a frente?

depois outra coisa... alguem podia fazer um exemplo de uma thread basica para eu poder analisar..

obrigado pelo vosso apoio 👍

Link to comment
Share on other sites

RJota Vamos por partes ok? =) Devagar se vai ao longe. em primeiro lugar mesmo sendo 1 projecto pequena tens que esquematizar as coisas para quando alguma coisa ocorrer ser fácil de ser detectada... Vou fazer em simultâneo um projecto do mesmo conteúdo para que te possa dar ideias e opiniões.

Tenho a certeza que o ribeiro depois mete o nariz e da a deles 👍 (kidding 🙂 )

Bom começando a "pensar"....:

1º Vou fazer com resolução fixa de 800*600.

2º As paredes vão ser fixas a barra vai ser variável (Prémios)

3º Não vai dar para passar paredes.

4º A bola vai ser multiplicável (Prémios) e velocidade variável (Prémios).

5º Blocos a partir de varias cores e feitios. incluindo de metal \o/

6º Vários Níveis. Neste ponto (para mim um dos mais importantes) vou fazer os níveis em ficheiros AMP (Arkanoid Map Point) para que no futuro possamos adaptar um sistema de fazer mapas e também podermos mais facilmente corrigirmos erros nos já existentes.

por enquanto isto. que tal seguirem as mesmas ideias? =)

ps: Arkanoid Map Point grande nome xXD

Link to comment
Share on other sites

Bom

começando a "pensar"....:

1º Vou fazer com resolução fixa de 800*600.

2º As paredes vão ser fixas a barra vai ser variável (Prémios)

3º Não vai dar para passar paredes.

4º A bola vai ser multiplicável (Prémios) e velocidade variável (Prémios).

5º Blocos a partir de varias cores e feitios. incluindo de metal \o/

6º Vários Níveis. Neste ponto (para mim um dos mais importantes) vou fazer os níveis em ficheiros AMP (Arkanoid Map Point) para que no futuro possamos adaptar um sistema de fazer mapas e também podermos mais facilmente corrigirmos erros nos já existentes.

1º, 2º, 3º, 4º - já tinhamos tratado num outro projecto. Mas o stor disse que quer com threads. -.-"

5º - estamos a pensar fazer um array com variaveis que vão ser os blocos. quando a bola bater na x posição então bate no bloco.

6º - estavamos a pensar em meter os niveis dentro do programa tipo muitas forms. Quando se passasse um nivel iamos para outra form. Mas gostei da tua ideia. Gravamos os mapas com o io.stream writter?

Bem obrigado desde já. É que estou num curso de programação no 12º ano e só demos vb.net e o que demos é muito basico.

Não percebo, alguns amigos meus estão num curso semelhante e já estão a dar c++ no primeiro ano. :s

Link to comment
Share on other sites

boas

boas ideias, o meu prof. diz k temos k fazer threads k é pa meter o jogo mais leve ou entao vai dar problemas... a bola tem k ser com thread e barra se calhar podiamos fazer tbm para livrar algum processamento ao programa.

foi uma idea dita pelo meu prof mas n ker dizer k façamos 😛

ja vi o programa e fikei a perceber a threading... 😛   obg gooden

obg pelo vosso apoio pessoal  😄🙂 :)

Link to comment
Share on other sites

Agora estou a tentar mexer a bola mas é dificil fazer com que ela saiba a direcção ao bater.

Tipo, para saber onde deve ir.

Se vier para baixo e para a esquerda deve ir para cima e para a direita, mas o pior é que a barra tem diferentes zonas onde pode bater. estou a pensar em dividir a barra em 4 e tenho de programar 4 vezes a direcção da bola.

Não há maneira mais facil? :S

Link to comment
Share on other sites

Sim.... mas se calhar não sei se funciona......

Tipo ao bateres na barra vês a % a que ele bateu...ou seja na ponta da barra é 0. na outra ponta é 100% ou seja após isso podes aumentar a inclinação... vou ver se consigo fazer um exemplo

Tens aqui um exemplo mesmo feito em 5 min... não te queixes dos erros 🙂

http://rapidshare.com/files/302425259/Secret.zip

Link to comment
Share on other sites

boas  😉

eu estou na etapa de com a bola (em threading) destruir um bloco feito em thread ou feito apenas normal (desenhado)... mas n consigo destrui-lo pois n consigo meter a threading da bola a interagir com a outra threading do bloco  ou o desenho normal.

esta ai um bocado do codigo...(n esta todo, falta os modulos e class)

se souberem fazer dêem uma apitadela 😉, eu tbm vou tentando  😄

Abraços

Public Class Form1

    Dim balls As New Bola1
    Dim bloco As New Bloco1

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        APP_OPEN = False
        APP_OPEN2 = False

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

        
        APP_OPEN = True
        Dim a As New Threading.Thread(AddressOf balls.pict)
        balls.obj = New PictureBox
        balls.obj.Image = Image.FromFile("c:\a.jpg")
        balls.obj.Width = 10
        balls.obj.Height = 10
        balls.obj.Location = New Point(60, 50)
        Me.Controls.Add(balls.obj)
        
        APP_OPEN2 = True
        Dim b As New Threading.Thread(AddressOf bloco.Pict1)
        bloco.obj2 = New PictureBox
        bloco.obj2.Image = Image.FromFile("c:\b.jpg")
        bloco.obj2.Width = 110
        bloco.obj2.Height = 18
        Me.Controls.Add(bloco.obj2)

        If balls.obj.Location.X Or balls.obj.Location.Y = b1 Or b2 Then
            MsgBox("WTF!")
        End If

        a.Start()

        
        

    End Sub
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

        Select Case (e.KeyData)
            Case Keys.Right
                If b1 >= 455 - 100 Then
                    Exit Sub
                Else
                    b1 = b1 + 8
                    b2 = b2 + 8
                End If
            Case Keys.Left
                If b1 <= 5 Then
                    Exit Sub
                Else
                    b1 = b1 - 8
                    b2 = b2 - 8
                End If
            Case Else
                Exit Sub
        End Select
        Dim formGraphics As Graphics
        formGraphics = Me.CreateGraphics()
        makedraw(formGraphics)

    End Sub

    Dim b1 As Integer = 170 ' barra
    Dim b2 As Integer = 270 ' barra

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.