• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ricafilipe

Arkanoid

35 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

Que erro dá e mostra lá como estás a usar as threads.

Já experimentaste usando um BackGroundWorker ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigadão. Já funciona. Estive montes de tempo aqui :thumbsup:

Vou ver outra maneira, com imagens.

Ou meter o thread só a actualizar a barra.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não testei, mas também deverá para o seguinte:

Parto do princípio que estás a usar uma picturebox1, então dentro da tread fazes picturebox1.invalidate, isto dispara o evento paint para a picturebox

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :thumbsup: (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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :P

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

obg pelo vosso apoio pessoal  :D:) :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado.

Vou ver o código e tentar melhorar alguns bugs, porque ele bate nas cores e continua sempre em frente.  :biggrin:

Depois adapto ao meu programa  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado.

Vou ver o código e tentar melhorar alguns bugs, porque ele bate nas cores e continua sempre em frente.  :biggrin:

Depois adapto ao meu programa  :)

Eu avisei-te :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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  :D

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

gooden n podes ver isso??? queria meter a bola (threading) a destruir um bloco(thread ou em desenho graphics) eu n estou a conseguir fazer isso.... preciso desta ajuda pa avançar ....

obrigado

obs: um bocado do codigo ta em cima o resto k falta é das classBOLA e do module

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu tenho aqui umas funções que te pode ajudar. ve essas 2 funções. eu estou a fazer um arkanoide. mas estou a fazer em sdl por tanto os sprites são objectos do sdl. muda para picturebox ou para o tipo de objecto que estejas a usar

    Private Function FunCheckCollision(ByVal pFigure1 As Sprite, ByVal pFigure2 As Sprite) As Boolean
        'Check for a collision in the next move, not this one, so the ball doesnt goes inside the brick
        If Not (pFigure1.Left + velx > pFigure2.Right Or _
                pFigure1.Right + velx < pFigure2.Left Or _
                pFigure1.Top + vely > pFigure2.Bottom Or _
                pFigure1.Bottom + vely < pFigure2.Top) Then
            FunCheckCollision = True
        End If
    End Function
    Private Sub SetBallDirection(ByVal pFigure1 As Sprite, ByVal pFigure2 As Sprite)
        'Get new direction according to direction before this bounce
        Select Case True
            Case velx < 0 And vely < 0
                If (pFigure2.Bottom - pFigure1.Top) < (pFigure2.Right - pFigure1.Left) Then
                    GoingUp = False
                Else
                    GoingLeft = False
                End If

            Case velx < 0 And vely > 0
                If (pFigure1.Bottom - pFigure2.Top) < (pFigure2.Right - pFigure1.Left) Then
                    GoingUp = True
                Else
                    GoingLeft = False
                End If

            Case velx > 0 And vely < 0
                If (pFigure2.Bottom - pFigure1.Top) < (pFigure1.Right - pFigure2.Left) Then
                    GoingUp = False
                Else
                    GoingLeft = True
                End If

            Case velx > 0 And vely > 0
                If (pFigure1.Bottom - pFigure2.Top) < (pFigure1.Right - pFigure2.Left) Then
                    GoingUp = True
                Else
                    GoingLeft = True
                End If
        End Select
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não creio que threads se justifiquem num joguito como o Arkanoid.

Acabei de fazer um todo desenhado no form, para exprimentar.

De qualquer maneira, mesmo em threads diferentes, penso que facilitarias a tarefa expondo as colecções de objectos em cena num nível inferior aos threads, isto para que cada objecto possa estar consciente do outro.

O que acabei de fazer está suportado nessa filosofia e levei coisa de 20 minutos a escrevê-lo. Não complica muito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(offtopic) É girinho, mas para ambiente windows prefiro XNA ou até mesmo DarkGDK.NET, em dias frios.

@Rjota

Queres o código fonte do arkanoid? Nem que seja para tirares ideias ou para te baseares e melhorares.

A detecção de colisão, por exemplo, foi um pouco negligenciada. Tem umas falhas. Ainda assim, detecta colisão nos 4 lados de cada tijolo, mas só reaje espelhando o movimento no eixo de impacto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora