A comunidade brasileira de desenvolvimento e programação de jogos.
Bem-vindo: Qua Out 21, 2020 1:44 pm

Todos os horários são GMT - 3 horas




Criar novo tópico Responder  [ 13 mensagens ] 
Autor Mensagem
 Título: Colisao de imagens
MensagemEnviado: Sex Set 15, 2006 1:30 am 
Offline
Membro novo

Registrado em: Qui Set 14, 2006 10:59 pm
Mensagens: 7
Ola galera, preciso da ajua de voces.
preciso saber como faço para que as imagens colidam. por exemplo
quando eu movimentar uma imagem fazer com que ela nao passe por dentro da outra.
desde ja agradeço a todos!


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Sex Set 15, 2006 1:42 pm 
Offline
Membro intermediário
Avatar do usuário

Registrado em: Dom Mai 28, 2006 8:57 pm
Mensagens: 91
Localização: Rio Grande do Sul
FLOODER!

asiehaisueh
faz assim...
só dexa o cara anda quando...
O x (boneco principal) for menor que o x (inimigo)
E
se o x (boneco principal) for maior que o xfinal (inimigo)
E
O y (boneco principal) for menor que o y (inimigo)
E
O y (boneco principal) for maior que o yfinal (inimigo)

não sei se fui bem claro :D

_________________
Faça download das minhas músicas em midi: http://midimid.blogspot.com/

As midi's que mais gosto vão para o MySpace: http://www.myspace.com/endeldreyer

Meu blog sobre tecnologia: http://tecnologiatona.blogspot.com/


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Sáb Set 16, 2006 12:13 am 
Offline
Membro avançado
Avatar do usuário

Registrado em: Qui Jan 12, 2006 7:30 pm
Mensagens: 434
Localização: irc.voidzero.com - #gamedev
Uma mensagem só é o suficiente.


É mais ou menos como ele disse.
Você checa pela posição X mais a largura das imagens, o mesmo para o Y e altura delas.

Você pode ainda usar a função IntersectRect da WinAPI:
http://msdn.microsoft.com/library/en-us ... frame=true

Ela basicamente calcula pra você se houve interseção entre os dois retângulos (retornando verdadeiro ou falso).
Ela ainda retorna um outro retângulo, mostrando a área na qual as imagens se sobrepõem.

Para evitar que haja a sobreposição das imagens, basta que você, após chamar a função IntersectRect, verifique se ocorre a interseção. Caso ela já esteja ocorrendo, você simplesmente não move a imagem.

A menos, claro, que você deseja efetuar testes dinâmicos (chamados de sweep).
Este método é mais complexo, e você pode dar uma olhada em:
http://parallel.vub.ac.be/documentation ... node3.html

Para ter uma idéia bem básica de como ele funciona.

Você poderia, ainda, testar a colisão antes dela ocorrer, de modo que você faça uma cópia das coordenadas atuais, e utilizando a cópia, mova ela, e teste as colisões possíveis. Se houver colisão, não mova a imagem.

_________________
The best performance improvement is the transition from the nonworking state to the working state.
~J. Osterhout


Voltar ao topo
 Perfil  
 
 Título: colisao de imagens
MensagemEnviado: Seg Set 18, 2006 11:31 pm 
Offline
Membro novo

Registrado em: Qui Set 14, 2006 10:59 pm
Mensagens: 7
usando o intersectrect da um erro quando eu chamo a função


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Qua Set 20, 2006 7:56 pm 
Offline
Membro avançado
Avatar do usuário

Registrado em: Qui Jan 12, 2006 7:30 pm
Mensagens: 434
Localização: irc.voidzero.com - #gamedev
Não é necessário levar a sua dúvida para outros tópicos.

Seria mais interessante se você mostrasse qual erro é, e o código relacionado ao erro.

_________________
The best performance improvement is the transition from the nonworking state to the working state.
~J. Osterhout


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Sáb Set 23, 2006 3:04 am 
Offline
Membro novo

Registrado em: Qui Set 14, 2006 10:59 pm
Mensagens: 7
Aquela mensagem era para ser colocada neste topico,mas acho que acabei me embanando.A funçao é essa e quando eu chamo ela da o seguinte erro "argument not opcional"

vale lembrar que eu sou super iniciante em programação


Private Function Collided(imgA As Image, imgB As Image) As Integer

Dim A As tRect
Dim B As tRect
Dim ResultRect As tRect


A.Left = Image1.Left
A.Top = Image1.Top
B.Left = Image2.Left
B.Top = Image2.Top

A.Right = A.Left + Image1.Width - 1
A.Bottom = A.Top + Image1.Height - 1

B.Right = B.Left + Image2.Width - 1
B.Bottom = B.Top + Image2.Height - 1

Collided = IntersectRect(ResultRect, A, B)
End Function

‘No modulo
Option Explicit

Type tRect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Declare Function IntersectRect Lib "user32" (lpDestRect As tRect, lpSrc1Rect As tRect, lpSrc2Rect As tRect) As Long


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Sáb Set 23, 2006 5:40 pm 
Offline
Membro avançado
Avatar do usuário

Registrado em: Qui Jan 12, 2006 7:30 pm
Mensagens: 434
Localização: irc.voidzero.com - #gamedev
A única observação sobre o código é que
Código:
A.Right = A.Left + Image1.Width - 1
A.Bottom = A.Top + Image1.Height - 1

B.Right = B.Left + Image2.Width - 1
B.Bottom = B.Top + Image2.Height - 1


Deveria ser:
Código:
A.Right = A.Left + Image1.Width
A.Bottom = A.Top + Image1.Height
B.Right = B.Left + Image2.Width
B.Bottom = B.Top + Image2.Height


Mas talvez, você deseja explicitamente reduzir o retângulo da colisão, então, isso não é um problema.

Não vejo mais nada no código que possa causar o erro.

Então, você poderia tentar fazer isso manualmente, por exemplo:

Código:
    left1 = object1.left;
    left2 = object2.left;
    right1 = object1.left + object1.width;
    right2 = object2.left + object2.width;
    top1 = object1.top;
    top2 = object2.top;
    bottom1 = object1.top + object1.height;
    bottom2 = object2.top + object2.height;

    if (bottom1 < top2) return(0);
    if (top1 > bottom2) return(0);

    if (right1 < left2) return(0);
    if (left1 > right2) return(0);

    return(1);



Você pode ver em
http://www.gamedev.net/reference/articl ... cle735.asp

Mais alguns métodos de colisão (que são pequenas variações deste)

_________________
The best performance improvement is the transition from the nonworking state to the working state.
~J. Osterhout


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Ter Set 26, 2006 11:39 pm 
Offline
Membro novo

Registrado em: Qui Set 14, 2006 10:59 pm
Mensagens: 7
Cara eu ainda não entendi.
Olha o codigo esta exatamente assim. em qual evento eu chamo a função Collided.
Imaginei que fosse no próprio KeyDown mas da a seguinte mensagem
“Argument not optional”


Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyLeft Then
Image1.Left = Image1.Left - 70
End If

If KeyCode = vbKeyRight Then
Image1.Left = Image1.Left + 70
End If

If KeyCode = vbKeyUp Then
Image1.Top = Image1.Top - 70
End If

If KeyCode = vbKeyDown Then
Image1.Top = Image1.Top + 70
End If

End Sub

Private Function Collided(imgA As Image, imgB As Image) As Integer

Dim A As tRect
Dim B As tRect
Dim ResultRect As tRect


A.Left = imgA.Left
A.Top = imgA.Top
B.Left = imgB.Left
B.Top = imgB.Top

A.Right = A.Left + imgA.Width
A.Bottom = A.Top + imgA.Height

B.Right = B.Left + imgB.Width
B.Bottom = B.Top + imgB.Height

Collided = IntersectRect(ResultRect, A, B)
End Function

‘NO MODULO
Option Explicit

Type tRect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Declare Function IntersectRect Lib "user32" (lpDestRect As tRect, lpSrc1Rect As tRect, lpSrc2Rect As tRect) As Long


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Qua Set 27, 2006 7:24 pm 
Offline
Membro avançado
Avatar do usuário

Registrado em: Qui Jan 12, 2006 7:30 pm
Mensagens: 434
Localização: irc.voidzero.com - #gamedev
Eu não faço a menor idéia do que pode estar causando este erro "Argument not optional", porque você não colocou o código relacionado ao erro, mas, como você disse, também não tem muita idéia de onde colocar o teste por colisão, então, considerando que eu não conheço os comandos do Visual Basic, vou tentar exemplificar, e note que a função Collided, não sofre nenhuma alteração neste exemplo.

Código:
Private Function Collided(imgA As Image, imgB As Image) As Integer
[Fica tudo como está]
End Function


Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim Movendo_Para as Image // cria uma variável temporária, que mostra para onde a imagem está tentando se mover

  If KeyCode = vbKeyLeft Then
    Movendo_Para.Left = Image1.Left - 70
   End If
   
  If KeyCode = vbKeyRight Then
    Movendo_Para.Left = Image1.Left + 70
  End If

  If KeyCode = vbKeyUp Then
    Movendo_Para.Top = Image1.Top - 70
  End If

  If KeyCode = vbKeyDown Then
    Movendo_Para.Top = Image1.Top + 70
  End If

// até aqui, a imagem Movendo_Para irá conter a posição na qual a Image1 deve mover, caso não haja colisão.
//Então, agora testa a colisão da Movendo_Para contra a Image2.
// Caso não haja colisão entre elas, a Image1 poderá mover,
// caso haja colisão, a Image1 não poderá mover.

  If Collided(Movendo_Para, Image2) = False then // Se não houver colisão, move a Image1
     Image1.Top = Movendo_Para.top
     Image1.Left = Movendo_Para.left
  End If
   
End Sub


Acredito que era esse o seu problema, entender onde colocar o teste de colisão.

Não sei se "//" é comentário em VB, mas, você entendeu :wink:

Funcionou?

_________________
The best performance improvement is the transition from the nonworking state to the working state.
~J. Osterhout


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Sáb Set 30, 2006 8:05 pm 
Offline
Membro novo

Registrado em: Qui Set 14, 2006 10:59 pm
Mensagens: 7
Cara, nao funcionou :cry:
mas agora nao da mais a mensagem de erro.
Voce conhece alguma outra função que eu possa usar.(uma mais simples)

Muito obrigado pela sua paciencia


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Sáb Set 30, 2006 9:53 pm 
Offline
Membro avançado
Avatar do usuário

Registrado em: Qui Jan 12, 2006 7:30 pm
Mensagens: 434
Localização: irc.voidzero.com - #gamedev
Essa:
Nameless Stranger escreveu:
Então, você poderia tentar fazer isso manualmente, por exemplo:

Código:
    left1 = object1.left;
    left2 = object2.left;
    right1 = object1.left + object1.width;
    right2 = object2.left + object2.width;
    top1 = object1.top;
    top2 = object2.top;
    bottom1 = object1.top + object1.height;
    bottom2 = object2.top + object2.height;

    if (bottom1 < top2) return(0);
    if (top1 > bottom2) return(0);

    if (right1 < left2) return(0);
    if (left1 > right2) return(0);

    return(1);



Você pode ver em
http://www.gamedev.net/reference/articl ... cle735.asp

Mais alguns métodos de colisão (que são pequenas variações deste)


Coloca o código que você tem pra ver como ficou.

_________________
The best performance improvement is the transition from the nonworking state to the working state.
~J. Osterhout


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Sáb Set 30, 2006 10:02 pm 
Offline
Membro novo

Registrado em: Qui Set 14, 2006 10:59 pm
Mensagens: 7
este codigo vai funcionar no vb?
Agora to no trampo e aqui nao tenho vb,entao vou testar o codigo so amanha.


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Dom Out 08, 2006 12:40 pm 
Offline
Membro intermediário
Avatar do usuário

Registrado em: Dom Dez 11, 2005 8:28 pm
Mensagens: 82
isso me será bem útil, eu tava procurando uma API, no caso a WinApi vai me ajudar.


Voltar ao topo
 Perfil  
 
Exibir mensagens anteriores:  Ordenar por  
Criar novo tópico Responder  [ 13 mensagens ] 

Todos os horários são GMT - 3 horas


Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante


Enviar mensagens: Proibido
Responder mensagens: Proibido
Editar mensagens: Proibido
Excluir mensagens: Proibido
Enviar anexos: Proibido

Ir para:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzido por: Suporte phpBB