Discord
Login
Community
DARK THEME

Thank you so much to everyone who helped me with collisions // Muito obrigado a todos que me ajudaram com as colisões

Thank you so much to everyone who helped me! After a lot of effort, I finally managed to learn how to make collisions. One day, I watched a video about a very simple 2D engine. When I saw it and tested it, I loved it. It had everything I needed in an extremely simple way, until one day I encountered a problem: collisions. During an English class, a way to handle collisions using X and Y popped into my head. Eventually, that wasn't enough. It was too complicated and time-consuming (and I program in Python, so I always have to adapt the code of the people who helped me). Then, I finally found a way to make collisions by importing libraries, and I thought that was really cool. I’ve tried switching engines, but I couldn’t get used to any of them. I’m really grateful to everyone who helped me get this far!

tradução ----------------------------------------------------------

Muito obrigado a todos que me ajudaram! Depois de muito esforço, finalmente consegui aprender a fazer as colisões. Um dia, vi um vídeo falando sobre uma engine 2D muito simples. Quando vi e fui testar, adorei. Ela tinha tudo o que eu precisava de forma extremamente simples, até que um dia encontrei um problema: as colisões. Durante uma aula de inglês, surgiu na minha cabeça uma forma de fazer as colisões usando X e Y. Até que um dia isso não foi mais suficiente. Era muito complicado de fazer e demorava (e eu programo em Python, então eu sempre preciso adaptar os códigos das pessoas que me ajudavam). Até que finalmente encontrei uma forma de fazer colisões, importando bibliotecas, e achei isso muito legal. Já tentei trocar de engine, mas não me adaptei a nenhuma delas. Agradeço muito a todos que me ajudaram até aqui!

oi, sou br igual vc, quer me ajudar em projetos? Uso microscript mas sei python e meu projeto atual é em JS.

dúvida, vc usou distancia euclidiana ou AABB ou até OBB? Queria saber, pq em alguns projetos espécificos pode nn ser útil algumas coisas; Você tinha dificuldade com tilemaps? Pois também tenho. A distancia euclidiana é um metódo eficaz e rápido

//Python, but is only solve small things/Python, mas apenas resolver pequenas coisas em outras linguagens, já que a lógica é a mesma 
update = function()
  dx = player.x - enemy.x // Não é obrigatorio assim, mas economiza bastante tempo
  dy = player.y - enemy.y

  distance = Math.sqrt((dx**2)+(dy**2)) //Crucial ter o sqrt
  if distance < 10:
    print("collide!")


Exemplos para o que você usaria distancia euclidiana:

  • Mapas retos(sem colisão com mapa)
  • Normalização de velocidade do inimigo

Esse é um exemplo para distancia euclidiana que envolve teorema de pitagoras. Parece complexo, mas eu te garanto, é fácil.

Pra você ter noção, foi criado pelos babilônios, que foi confirmado por pitágoras, criando teorema de pitagoras. Não vou entrar em detalhes, mas ele vê o valor de C(caso C não seja nenhum cateto, já que a hipotenusa pode ser A, B, C, D, contudo, precisa ser a soma dos catetos ao quadrado. Usei C de exemplo, pois é um dos mais comuns para a hipotenusa), fazendo raiz quadrada de cateto^2 + cateto^2 = hipotenusa. Mas pra criar jogo bom, não precisa entender o teorema de pitagoras, mas entender pra quê ele é útil.

Existe uma forma melhor de fazer distancia euclidiana(economizando), e aqui te mostro:

def distance(x1, y1, x2, y2)
  local dx = x2 - x1
  local dy = y2 - y1
  local distance = Math.sqrt((dx**2) + (dy**2))
  return distance
end

Agora, AABB é o classico, acho que não preciso explicar né.

def check_collision(a, b) 
   return (a.x < b.x + b.w and 
           a.x + a.w > b.x and 
           a.y < b.y + b.h and
           a.y + a.h > b.y)

bom, acho que é o método comum colocar numa função com return, isso vai economizar MUITO tempo, assim você precisa fazer apenas

if check_collision(obj1, obj2):
   print("Collide")

se eu soubesse OBB eu até te ensinava, mas é um bagulho complexo, e pelo menos 90% dos projetos não precisam de OBB

Vlw flw e obrigado pela atenção

ah oi, estou um tempo sem entrar na comunidade. Valeu pela ajuda!

eu fiz um projeto para um "jornal da escola" com essa colisão euclidiana, se quiser testar:

https://microstudio.io/milho/projeto_jornal_capitulo1/TESTANDO/

eu uso (em projetos que exigem bastante colisões) tipo um AABB, só que com objetos:

esse é para identificar as colisões (tu pode só deixar no topo do projeto, pois não precisa mexer aqui, e sim no resto (para fazer as colisões):

class Object: def init(self, x, y, width, height, sprite): self.x_pos = x self.y_pos = y self.width = width self.height = height self.sprite = sprite

def draw(self):
    screen.drawSprite(self.sprite, self.x_pos, self.y_pos, self.width, self.height)

def collides_with(self, other):
    return (self.x_pos - self.width / 2 < other.x_pos + other.width / 2 and
            self.x_pos + self.width / 2 > other.x_pos - other.width / 2 and
            self.y_pos - self.height / 2 < other.y_pos + other.height / 2 and
            self.y_pos + self.height / 2 > other.y_pos - other.height / 2)

def move(self, dx, dy):
    self.x_pos += dx
    self.y_pos += dy

def set_position(self, x, y):
    self.x_pos = x
    self.y_pos = y

def change_sprite(self, new_sprite):
    self.sprite = new_sprite

aqui, é o código normal onde adiciona as colisões e todo o resto do jogo:

obj = Object(0, 0, 50, 50, "sprite") obj1 = Object(12, 12, 50, 50, "sprite2")

def update(): screen.clear() obj.draw() obj1.draw() obj1.set_position(mouse.x, mouse.y) if obj.collides_with(obj1): print("Collision!")

com isso, tu pode fazer as colisões fácilmente, mas ele não vê como é o sprite, se for um círculo, ele ainda vai colidir como um quadrado

Post a reply

Progress

Status

Preview
Cancel
Post
Validate your e-mail address to participate in the community