Post by nemezes on Oct 23, 2019 19:51:28 GMT -5
I adapted bresenham algorithm to work in BEX, it can be used to make an enemy that shot an projectile towards player.
it is a simples algorithm that uses only sums and subtracions, avoiding to use product and divisions.
here is a video preview:
here is the code, just copy/paste in BEX (it also work in SecondBASIC):
it is a simples algorithm that uses only sums and subtracions, avoiding to use product and divisions.
here is a video preview:
here is the code, just copy/paste in BEX (it also work in SecondBASIC):
spriteA = AddSprite(1,1) 'jogador
PropSprite spriteA,65,0
spriteB = AddSprite(1,1) 'inimigo
PropSprite spriteB,66,0
spriteP = AddSprite(1,1) 'projetil
PropSprite spriteP,3,0
'''posicao inicial do jogador A
jogadorX = 100
jogadorY = 150
'''posicao inicial do inimigo B
inimigoX = 200
inimigoY = 100
'''posicao do projetil disparado por B
projetilX = 0
projetilY = 0
'''gatilho pra disparar o projetil
dispara = 0
Do
'''''''''''''''''''''''''''''''''''''
jj = j
j = JoyPad(0) 'controle do jogador A
eixoX = j.3-j.2
eixoY = j.1-j.0
jogadorX+=eixoX
jogadorY+=eixoY
'''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''
jjB = jB
jB = JoyPad(1) 'controle do jogador B
eixoXb = jB.3-jB.2
eixoYb = jB.1-jB.0
inimigoX+=eixoXb
inimigoY+=eixoYb
'''''''''''''''''''''''''''''''''''''
'se o projetil nao foi disparado (ou chegou no ponto final), dispara ele
If dispara = 0 Then
dispara = 1
projetilX = inimigoX
projetilY = inimigoY
dXa = inimigoX - jogadorX
dYa = inimigoY - jogadorY
dXa = valorAbsoluto(dXa)
dYa = valorAbsoluto(dYa)
'determina o valor que se acrescenta no X a depender da posicao do jogador e inimigo
If inimigoX = jogadorX Then
xInc = 0
ElseIf inimigoX > jogadorX Then
xInc = -1
ElseIf inimigoX < jogadorX Then
xInc = 1
EndIf
'determina o valor que se acrescenta no Y a depender da posicao do jogador e inimigo
If inimigoY = jogadorY Then
yInc = 0
ElseIf inimigoY > jogadorY Then
yInc = -1
ElseIf inimigoY < jogadorY Then
yInc = 1
EndIf
'INICIO DO ALGORITMO DE BRESENHAM PARA FAZER O PROJETIL ANDAR
erro = dXa - dYa
erroTemp = dXa - dYa
ElseIf dispara = 1 Then
'PRIMEIRO PASSO DO ALGORITMO
eXY = erro
eX = erro + dYa
eY = erro - dXa
tempX = eX + eXY
If (tempX < 32767) Then
projetilX+=xInc
erroTemp-=dYa
EndIf
tempY = eY + eXY
If (tempY > 32767) Then
projetilY+=yInc
erroTemp+=dXa
EndIf
erro = erroTemp
dispara = 2
ElseIf dispara >= 2 Then
'PASSO DE RECORRENCIA DO ALGORITMO
eXY = erro + dXa - dYa
eX = erro + dYa
eY = erro - dXa
tempX = eX + eXY
If (tempX < 32767) Then
projetilX+=xInc
erroTemp-=dYa
EndIf
tempY = eY + eXY
If (tempY > 32767) Then
projetilY+=yInc
erroTemp+=dXa
EndIf
erro = erroTemp
EndIf
'se o projetil fica fora do campo de visao da tela, redispara ele
If (projetilX > 320 Or projetilX < 4 Or projetilY < 4 Or projetilY > 224) Then
dispara = 0
EndIf
MoveSprite spriteP,projetilX+128,projetilY+128
MoveSprite spriteA,jogadorX+128,jogadorY+128
MoveSprite spriteB,inimigoX+128,inimigoY+128
Sleep 1
Loop
'funcao valor absoluto
Declare Function valorAbsoluto(teste As Integer)
If teste > 32767 Then
valor = teste*(-1)
valor-=1
Return valor
Else
valor = teste
Return valor
EndIf
End Function