ricafilipe Posted October 26, 2009 at 11:23 PM Report Share #293489 Posted October 26, 2009 at 11:23 PM 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 More sharing options...
jpaulino Posted October 26, 2009 at 11:53 PM Report Share #293495 Posted October 26, 2009 at 11:53 PM 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 ? Link to comment Share on other sites More sharing options...
ricafilipe Posted October 27, 2009 at 12:14 AM Author Report Share #293499 Posted October 27, 2009 at 12:14 AM 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 More sharing options...
Gooden Posted October 27, 2009 at 09:30 AM Report Share #293513 Posted October 27, 2009 at 09:30 AM 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 More sharing options...
ricafilipe Posted October 27, 2009 at 09:55 AM Author Report Share #293519 Posted October 27, 2009 at 09:55 AM Obrigadão. Já funciona. Estive montes de tempo aqui 👍 Vou ver outra maneira, com imagens. Ou meter o thread só a actualizar a barra. Link to comment Share on other sites More sharing options...
nokPT Posted October 27, 2009 at 10:49 AM Report Share #293530 Posted October 27, 2009 at 10:49 AM 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 Ricardo Timóteo Link to comment Share on other sites More sharing options...
Gooden Posted October 27, 2009 at 10:57 AM Report Share #293533 Posted October 27, 2009 at 10:57 AM 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 More sharing options...
ricafilipe Posted October 27, 2009 at 12:39 PM Author Report Share #293552 Posted October 27, 2009 at 12:39 PM depois se fizeres mete ai para ver como fizeste 👍 Link to comment Share on other sites More sharing options...
Rjota Posted October 27, 2009 at 08:30 PM Report Share #293617 Posted October 27, 2009 at 08:30 PM 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 More sharing options...
Gooden Posted October 28, 2009 at 09:12 AM Report Share #293665 Posted October 28, 2009 at 09:12 AM 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 More sharing options...
ricafilipe Posted October 28, 2009 at 03:12 PM Author Report Share #293719 Posted October 28, 2009 at 03:12 PM 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 More sharing options...
Gooden Posted October 28, 2009 at 05:03 PM Report Share #293741 Posted October 28, 2009 at 05:03 PM ricafilipe... http://rapidshare.com/files/299163637/testar.zip.html tens ai um exemplo... está muito mal construído aviso já 😄 Link to comment Share on other sites More sharing options...
Rjota Posted October 28, 2009 at 07:30 PM Report Share #293762 Posted October 28, 2009 at 07:30 PM 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 More sharing options...
ricafilipe Posted October 28, 2009 at 08:43 PM Author Report Share #293770 Posted October 28, 2009 at 08:43 PM Obrigado 😄 Link to comment Share on other sites More sharing options...
Gooden Posted October 28, 2009 at 11:24 PM Report Share #293796 Posted October 28, 2009 at 11:24 PM De nada meninos 😄 se precisarem de mais algo basta dizer. =) Link to comment Share on other sites More sharing options...
ricafilipe Posted November 4, 2009 at 05:39 PM Author Report Share #294707 Posted November 4, 2009 at 05:39 PM 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 More sharing options...
Gooden Posted November 4, 2009 at 06:13 PM Report Share #294712 Posted November 4, 2009 at 06:13 PM 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 More sharing options...
ricafilipe Posted November 5, 2009 at 12:19 PM Author Report Share #294835 Posted November 5, 2009 at 12:19 PM Obrigado. Vou ver o código e tentar melhorar alguns bugs, porque ele bate nas cores e continua sempre em frente. 😁 Depois adapto ao meu programa 🙂 Link to comment Share on other sites More sharing options...
Gooden Posted November 5, 2009 at 01:51 PM Report Share #294846 Posted November 5, 2009 at 01:51 PM Obrigado. Vou ver o código e tentar melhorar alguns bugs, porque ele bate nas cores e continua sempre em frente. 😁 Depois adapto ao meu programa 🙂 Eu avisei-te 🙂 Link to comment Share on other sites More sharing options...
Rjota Posted November 19, 2009 at 11:59 PM Report Share #296961 Posted November 19, 2009 at 11:59 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now