Entrar
Últimos assuntos
Enquete
[Resolvido] Duvida com lógica de tiros
2 participantes
Página 1 de 1
[Resolvido] Duvida com lógica de tiros
Olá denovo gentem!!!
Pessoal, négocio seguinte, eu quero saber como eu posso atirar a cada vez que uma tecla for precionada, é mais dificil do que eu pensava.
Eu consegui com uma função e arrays fazer tiros infinitos, porem a memoria desse jeito vai acumulando sem se limpar!!!
Tudo que eu quero é uma dica de como atirar a cada vez que uma tecla for precionada, só isso, mas sem ser com uma só "bala" e sem ficar pesado(no Game Maker era tão fácil...).
Desde já, valeu.
Pessoal, négocio seguinte, eu quero saber como eu posso atirar a cada vez que uma tecla for precionada, é mais dificil do que eu pensava.
Eu consegui com uma função e arrays fazer tiros infinitos, porem a memoria desse jeito vai acumulando sem se limpar!!!
Tudo que eu quero é uma dica de como atirar a cada vez que uma tecla for precionada, só isso, mas sem ser com uma só "bala" e sem ficar pesado(no Game Maker era tão fácil...).
Desde já, valeu.
Última edição por tblima123 em Ter 05 Out 2010, 14:43, editado 1 vez(es)
tblima123- Ocasional
- Mensagens : 54
Data de inscrição : 06/11/2009
Re: [Resolvido] Duvida com lógica de tiros
E ae amigão blz?
Bom, é feito com arrays ou com variaveis simples ou com listas. Pra fazer isso, voce precisa de um marcador pra dizer quando uma variavel se torna novamente disponivel. Por exemplo vamos supor que voce tenha um array de 4 posicoes que pode usar para ser seus tiros ou seja, voce atira, depois atira novamente, gastou entao 2 posicoes até agora, quando voce for dar o terceiro tiro pode ser que o primeiro ja tenha acertado algo ou chagado ao final da tela, com isso ele pode ser usado novamente. Em código ficaria mais ou menos assim:
Da uma olhada nesse exemplo e veja que eu reaproveito o vetor e assim não gasta memoria.
Duvidas? Posta ai!
Bom, é feito com arrays ou com variaveis simples ou com listas. Pra fazer isso, voce precisa de um marcador pra dizer quando uma variavel se torna novamente disponivel. Por exemplo vamos supor que voce tenha um array de 4 posicoes que pode usar para ser seus tiros ou seja, voce atira, depois atira novamente, gastou entao 2 posicoes até agora, quando voce for dar o terceiro tiro pode ser que o primeiro ja tenha acertado algo ou chagado ao final da tela, com isso ele pode ser usado novamente. Em código ficaria mais ou menos assim:
- Código:
#Include "fbgfx.bi"
Using FB
Const DISABLED = -999999 'se for DISABLED pode ser usado
Const MAX_TIRO = 10 'Maximo de tiros ao mesmo tempo
Const MAX_ENEMY = 15 'Maximo de inimigos ao mesmo tempo
Type TObject
As Integer x, y 'Posicao do tiro/nave
End Type
Declare Sub Novo_tiro(x As Integer, y As Integer) 'Prepara novo tiro
Declare Sub Atira() 'Move todos os tiros
Declare Sub Novo_inimigo(x As Integer, y As Integer) 'Prepara novo inimigo
Declare Sub Ataca() 'Move todos os inimigos
Declare Sub Hud() 'Desenha o HUD
Dim Shared Tiros(1 To MAX_TIRO) As TObject 'Declara um vetor para os tiros
Dim Shared Inimigos(1 To MAX_ENEMY) As TObject 'Decalra um vetor para os inimigos
Dim Shared Nave As TObject 'Declara a nave
Dim i As Integer 'Variavel contadora geral
Dim Shared Pode_atirar As Integer 'Tempo entre um tiro e outro
Dim Shared game_over As Byte = 0 'Fim de jogo?
Dim Shared pontos As Integer = 0 'Pontos
Dim cmd As String
'----------------------------
'Programa Principal
'----------------------------
Windowtitle "Ataque Mortal"
Screenres 640, 480, 32, 2, 0
For i = 1 To MAX_TIRO:Tiros(i).y = DISABLED:Next
For i = 1 To MAX_ENEMY:Inimigos(i).y = DISABLED:Next
Nave.x = 320
Nave.y = 340
Pode_atirar = 0
Screenset 1, 0 'Trabalha na 1 e Mostra a 0
While (game_over = 0)
Cls
cmd = "BM" + Str(Nave.x) + "," + Str(Nave.y) + "L10E10F10L20S10"
Draw cmd
If Int(Rnd() * 100) < 2 Then Novo_inimigo(Int(Rnd() * 580) + 40, -10)
Atira()
Ataca()
Hud()
If (Pode_atirar > 0) Then Pode_atirar -= 1
Screencopy
If (Multikey(SC_ESCAPE)) Then game_over = 1
If (Multikey(SC_LEFT)) Then Nave.x -= 1
If (Multikey(SC_RIGHT)) Then Nave.x += 1
If (Multikey(SC_SPACE) And Pode_atirar = 0) Then Novo_tiro(Nave.x, Nave.y - 10)
Sleep(5)
Wend
Sub Novo_tiro(x As Integer, y As Integer)
Dim i As Integer
For i = 1 To MAX_TIRO
If Tiros(i).y = DISABLED Then 'Achou um slot vazio? Pega e vaza!
Tiros(i).y = y
Tiros(i).x = x
Pode_atirar = 20
Exit Sub
EndIf
Next
End Sub
Sub Atira()
Dim i As Integer
For i = 1 To MAX_TIRO
If Tiros(i).y <> DISABLED Then 'Atira!
Tiros(i).y -= 3
Circle(Tiros(i).x, Tiros(i).y), 2, Rgb(255,0,0)
If (Tiros(i).y < -10) Then Tiros(i).y = DISABLED 'Proto para usar novamente
EndIf
Next
End Sub
Sub Novo_inimigo(x As Integer, y As Integer)
Dim i As Integer
For i = 1 To MAX_ENEMY
If Inimigos(i).y = DISABLED Then 'Achou um slot vazio? Pega e vaza!
Inimigos(i).y = y
Inimigos(i).x = x
Pode_atirar = 20
Exit Sub
EndIf
Next
End Sub
Sub Ataca()
Dim As Integer i, j, d
For i = 1 To MAX_ENEMY
If Inimigos(i).y <> DISABLED Then 'Atira!
Inimigos(i).y += 1
Line(Inimigos(i).x - 5, Inimigos(i).y - 5)-(Inimigos(i).x + 5, Inimigos(i).y + 5), Rgb(255,255,255), B
If (Inimigos(i).y > 490) Then Inimigos(i).y = DISABLED 'Proto para usar novamente
For j = 1 To MAX_TIRO
d = Sqr((Inimigos(i).x - Tiros(j).x)^2 + (Inimigos(i).y - Tiros(j).y)^2)
If (d < 10) Then
Inimigos(i).y = DISABLED
Tiros(j).y = DISABLED
pontos += 10
EndIf
Next
EndIf
Next
End Sub
Sub HUD()
Draw String (10, 10), "Pontos: " + Str(pontos)
End Sub
Da uma olhada nesse exemplo e veja que eu reaproveito o vetor e assim não gasta memoria.
Duvidas? Posta ai!
Re: [Resolvido] Duvida com lógica de tiros
Valeu Vinians, mais uma vez você nos surpreendendo
Deu super certinho, era exatamente o que eu queria!!!
Logo estou de volta, Ok?
Deu super certinho, era exatamente o que eu queria!!!
Logo estou de volta, Ok?
tblima123- Ocasional
- Mensagens : 54
Data de inscrição : 06/11/2009
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|
Qua 16 Mar 2011, 08:49 por vinians
» C++? ajuda
Qui 17 Fev 2011, 16:42 por Henrique_GJ
» dúvida em centralizar arma e player
Dom 30 Jan 2011, 17:08 por AndersonXD
» GO linguagem de programação da Google !!
Qui 27 Jan 2011, 21:04 por vinians
» [Duvida]esqueci o código pra mudar o tamanho da room
Qui 13 Jan 2011, 15:12 por mystery_boy_maker
» show_message_ext duvida
Qua 22 Dez 2010, 21:36 por mystery_boy_maker
» Testes com C & Allegro
Seg 13 Dez 2010, 14:31 por vinians
» FreeBasic - Código completo Snake
Seg 13 Dez 2010, 11:13 por tblima123
» Me apresentando...
Sáb 11 Dez 2010, 22:26 por vinians
» URL Reverse
Sáb 11 Dez 2010, 22:23 por vinians