Sir Ababol Remaster; 20160412

Ideas para implementar los objetos (basado un poco en el planteamiento original, aunque seguramente la implementación concreta final será diferente): [no recordaba que] en cada pantalla sólo puede haber un cerrojo y un objeto. Hay un array con los cerrojos y otro con los objetos [que tendré que generar en el conversor de la forma más adecuada y] que se emplea para detectar y para renderizar.

El conversor de mapas saca un “0” si hay un objeto o un cerrojo, aunque quizás podría ahorrar algo si codificase de otra manera, le daré una vuelta [NOTA: 45=pollo, 46=ababol, 47=llave; 15=cerrojo]. El renderer lo detecta y, al hacerlo, mira qué debe hacer: si pintar o no el cerrojo/objeto.

El código general los trataba por separado ya que al encontrar un cero no sabía bien qué hacer. Puede parecer que hacer una detección más exhaustiva podría funcionar, pero estaríamos metiendo dos IFs por tira en lugar de uno que puede desembocar en otros dos. No sé bien que hacer. En realidad me queda bastante tiempo de frame, así que lo suyo es tomar la vía que ocupe menos código.

Tengo que darle una vuelta. Voy a echar un ojal al código a ver cómo sería la modificación y decido.

Um – va a ser complicado meter en el código unrolled que tengo… ¿Podré meterlo a posteriorir? POSTERIORIRRRR. ¿Y si creo una estructura en RAM con información sobre las 128 columnas? ¿Tengo sitio para 128 bytes?

También puedo detectar la posición “X” precalculada del objeto y del cerrojo. Esto ocuparía menos memoria… Pero sería más complejo. Hum. Voy a tirar por la vía del array de 128 posiciones. Voy a irlo creando, a ver si compila.

~~

Necesito un nuevo enfoque. Esto no me da la granularidad suficiente: necesito a nivel de columna de tiles, pero me sale a nivel de chunk (2 columnas). Tengo que darle una pensada a esto.

Debe haber una forma perfe sin tener que hacer un pifostier.

Pensawr.

~~

Apunto cosas en plan brainstorming. Todos los bytes del mapa son >= 0x10 – esto no me lleva a ningún sitio.
Hm – me queda una media de 1/3 de tiempo de frame, joder, creo que puedo darle fran a eso sin ralentizar. Tengo que detectar un 0 en la tira y sustituir, o algo.

Pero hacer eso sería de cobardes. Venga, que esto me lo ventilo yo con medio cojón.

~~

A ver, empezamos de nuevo.

  • Tengo 48 pantallas.
  • Tengo 2 items por pantalla (un objeto y un cerrojo).
  • Puedo representar la posición en un byte.
  • Hay un objeto por chunk que puede aparecer en la izquierda o en la derecha.
  • Tengo RAM de sobra para 384 bytes y representar todos los posibles objetos.
  • ¿Mejor sería simplemente guardar 3 bytes por pantalla (48×3 = 144) y detectar?

La mejor forma sería detectar y sustituir. Pero me estoy empezando a marear. Creo que hoy ha sido mal día para elegir ponerme a resolver este problema.

tengo:

  • col_idx es el índice del chunk (0-127)
  • (col_ctr >> 1) es el offset de la columna en el chunk (0-1)
  • (col_idx >> 3) es el número de pantalla donde está.

Puedo tener obj_x, obj_y y obj_t, tres arrays de 48 elementos.

if ((col_idx << 1) + (col_ctr >> 1) = obj_x [(col_idx >> 3)]) {
	// en esta columna que vamos a dibujar hay un objeto.

}

Voy a duplicar el dibujado y a poner esa detección, por ahora. Sin más. A ver el rendimiento cómo queda.

Por ahora se queda prácticamente igual. Veamos adonde nos lleva esto… Seguiré por esta vía. Pero ahora me tengo que iwr.

~~~

¡Creo que he dado con ello! Usaré esa detección a posteriori para sobreescribir el buffer, retrocediendo 20 – y*2 espacios en el buffer y escribiendo ceros si la variable correspondiente está a 1. Genius!

O sea, pinto la columna tal cual. Los objetos/cerrojos están en el mapa, así que se pintarán con la columna. Pero luego, si detecto que en esa columna hay objeto y este está consumido, retrocedo 20 – y*2 espacios y escribo un par de ceros – directamente en el buffer de actualización. Así el objeto no se pintará.

La putada sigue siendo el tema de que tengo dos tipos de mierdas que no sé muy bien como apañar juntas. Probablemente, duplicando.

Si hago (col_idx >> 3) << 1 y tengo intercaladas ambas mierdas… Hmmm. Podía funcionar. Vamos a ver si puedo medio apañarlo.

// espera que me lío.

pantalla = (col_idx >> 3).
pantalla*2 = indice de los arrays de objetos = (col_idx >> 3) << 1.
columna real dentro de la pantalla = ((col_idx & 7) << 1) + (col_ctr >> 1)

Ok.

~~

¡¡Lo he resuelto!!

	// Any object here?
	rdx = col_idx >> 3;			// Screen where we are
	rdt = obj_strip_base + (rdx << 1);	// Index to object arrays.
	rda = (col_idx << 1) + (col_ctr >> 1);	// Tile x coord in screen

	rdy = 0;
	if (obj_x [rdt] == rda && !obj_t [rdt]) rdy = obj_y [rdt] << 1;
	if (obj_x [rdt + 1] == rda && !obj_t [rdt + 1]) rdy = obj_y [rdt + 1] << 1;
	if (rdy) {
		*(gp_ul - 20 + rdy) = 0;
		*(gp_ul - 19 + rdy) = 0;
	}

Joder, lo que es un día entero pensando para luego producir 10 lineas de código. Asín es.

Ahora tengo que hacer estas cosas:

[X] Detectar colisión con el objeto.
[X] Detectar colisión con el hotspot.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s