HispaMSX

RE: [hispamsx] Dudas assembler "The elemmental, dear Watson"

2005-03-10 16:10:24
Buenas, hay van algunas respuestas que creo pueden ser adecuadas:
 
    Tienes varias soluciones para lo de la colisión:
            - antes de hacer esa resta comprueba cual de las dos coordenadas
(que llamaremos x1 y x2) es mayor y después haz la resta ya de la forma
correcta para que no te de signo negativo
            - también puedes, una vez hecha la resta, calcular el valor
absoluto del resultado. Dado que este viene dado en complemento a 2 si es
negativo (o eso creo, nunca lo comprobé en el Z80!!) deberás mirar el bit de
signo (el de más a la izquierda del todo) y en caso de ser un 1 (es decir,
nº negativo), pues tendrás que calcular el complemento a 2 de dicho valor:
                                    BIT 7,A    //suponiendo en A el
resultado de la resta
                                    JR NZ, positivo   //como Flag Z == 0 -->
signo 0 = positivo
                                    NEG    //calcula complemento a 2 de A,
es decir, lo pone en positivo
                        positivo: ...
                 Tambien, si no me equivoco y dado que el valor de A en tu
caso viene de hacer una resta (SUB) pues dicha instrucción afecta al flag de
signo, por lo que puedes usar JP P, etiqueta de la siguiente forma:
                                    JP P, positivo
                                    NEG
                        positivo: .....
Lo malo es que el JP ocupa más que el JR (aunque te ahorras el BIT). Bueno,
eso como tu veas.
    
                Pido perdón por si el código no está bien porque yo de Z80
ando muy pez, vengo de 8086 y mezclo cosas, jeje (siento cometer este
sacrilegio), pero la idea es esta. 
 
            De todos modos, yo te aconsejo que la colisión entre objetos,
por lo menos como primera aproximación, la hagas considerando intersección
entre rectángulos (y considerar que cada sprite es un rectángulo). El código
en ensamblador es algo más complejo (pero con cuidadiín se saca bien) y te
permitirá tener objetos de cualquier tamaño. El codigo en pseudocodigo/C++
sería algo así
 
        

bool Colision(objeto1,objeto2)
{
if(objeto2.y > objeto1.y)
{
    alturaMayor = objeto1.alto; //la altura del primer objeto (considerado
como un rectangulo)
} 
else
{
    alturaMayor = objeto2.alto;
}
if(objeto2.x > objeto1.x)
{
    anchuraMayor = objeto1.ancho; //la anchura del primero
}
else
{
    anchuraMayor = objeto2._ancho;
}
if(abs(objeto2.x - objeto1.x) < anchuraMayor && 
    abs(objeto2.y-objeto1.y) < alturaMayor )
{
    hayColision = true;
}
return hayColision; 
}

 
                -y por último: para hacer el if a < 5, que lo necesitarás en
lo anterior, pues tendrás que hacer algo de la siguiente forma:
                             
                            CP 5  //resta A - 5
                             JP M, if     //si el resultado fue negativo -->
A < 5 --> saltamos a la etiqueta if
                        else: ...
 
                        if: ....          
¡Uff menuda chapa que te acabo de meter!. No sé si te habrá servido de algo,
si no entiendes, vuelve a preguntar que cualquiera de los sabios de este
foro te va a responder ;-) Y de nuevo disculpar mis errores porque casi no
hice nada en este ensamblador y lo tengo muy verde
 
Saludos,
Dani
                    
                                  
                                                               
        

-----Mensaje original-----
De: Darth Fistro [mailto:idrisbenali(_en_)yahoo(_punto_)es] 
Enviado el: jueves, 10 de marzo de 2005 13:36
Para: hispamsx(_en_)yahoogroups(_punto_)com
Asunto: [hispamsx] Dudas assembler "The elemmental, dear Watson"



Hola de nuevo,

Pues sí que va bien la cosa, ayer mismo empiezo a usar algo más que 
llamadas a las rutinas 4ah y 4dh de la BIOS y ya estoy con problemas 
hasta el cuello :)

Gracias a los que se tomaron con sentido del humor mi mensaje, jejeje, 
prometo seguir y sobre todo hacer juegos como churros (ahí queda eso :
))

El primer escollo es la detección de choques.

En Basic, más o menos haría así (no sé si es muy elegante):

x1,x2=coord. x de los sprites 1 y 2 (16x16)
y1,y2=coord. y de los sprites 1 y 2

if abs(x1-x2)<16 and abs(y1-y2)<16 then hostiazo padre

Pero en asm, una vez tengo en D la coordenada x del 1ºsprite, y en el 
acumulador acabo de leer la del segundo:

LD HL,6913
CALL 4ah
LD D,A

LD HL,6945
CALL 4ah

SUB D
CP 16
JP M, hostiazo

Bueno, habría que comparar las coord y también, pero pongo sólo la x 
para abreviar.

El caso es que funciona bien siempre y cuando x1<x2, pues si la coord.
x del sprite 1 es mayor que la del 2, entonces la cosa se desmadra y 
chocan a una gran distancia. Supongo que tendrá algo que ver el hecho 
de que si x2>x1 entonces la resta de negativo, y ahí igual se jode la 
cosa. Pero por más que miro en el librillo que tengo, no encuentro 
cómo arreglarlo. Además, ¿cómo hacer como en basic la función abs(x) e 
ignoro el signo?

Otra cosa es que no entendí muy bien si se puede hacer en asm algo 
como:

if a<5 then...

o

if a>5 then...

Vamos, se comparar igualdades, pero ¿cómo se hace para ver si es mayor 
o menor que un valor?

Ayyy, siento estas preguntas y no debería hacerlas, pero es que llevo 
toda la mañana con el libro y no saco nada en claro, y ayer acabé 
abatido :(

Un saludo y gracias,

Juanma








*HispaMSX. La mailing-list de MSX en castellano*
Para cualquier duda: hispamsx-owner(_en_)yahoogroups(_punto_)com
Web de lista: http://www.hispamsx.org 



Patrocinio de Yahoo! Grupos     
        


  _____  

Enlaces a Yahoo! Grupos


*       Para visitar tu grupo en la web, accede a :
http://es.groups.yahoo.com/group/hispamsx/
  

*       Para cancelar tu suscripción a este grupo, envía un mensaje a:
hispamsx-unsubscribe(_en_)yahoogroups(_punto_)com
<mailto:hispamsx-unsubscribe(_en_)yahoogroups(_punto_)com?subject=Unsubscribe> 
  

*       El uso que hagas de Yahoo! Grupos está sujeto a las Condiciones del
servicio de  <http://es.docs.yahoo.com/info/utos.html> Yahoo!. 




[Se han eliminado los trozos de este mensaje que no contenían texto]


<Anterior en la conversación] Conversación actual [Siguiente en la conversación>