Propuesta desarrollo para megadrive - BasiegaXorz

Después de leer los tutoriales de theelf (por cierto estupendos), visitar su página y mirar este compilador basic (hacer mis pruebas y demás), me gustaría proponer realizar un videojuego para esta plataforma, presentarlo a concursos, etc... y que fuera la misma página EOL la referencia de éste homebrew... no se si será posible, si habrá gente interesada y demás... de momento pongo esto aquí a ver si alguien se anima, ideas y ganas no faltan así que.... ya direis.

El tema de programación no es problema, precisamente empecé con Basic hace años, pascal, c, c++, java, vb, .net, y ahora php, lo que si no he tocado nunca es trabajo con gráficos (tiles, mapas, sprites, etc...) Para la web del juego (a nivel de código tampoco), alquien debería hacer las plantillas HTML, CSS, imágenes, etc... alojamiento tampoco...

bueno, aquí dejo esto. En un futuro me gustaría llegar a desarrollar algo para NeoGeo, pero quizá sea bueno empezar por esta plataforma muy similiar y con mucha más documentación.

Saludos.
Suerte con el proyecto, veo q ya saves programar, si igualmente necesitas algo, me dices
Bueno... me defiendo.... :D

hay una cosilla que no sé si comentas en los tutoriales que has hecho... en los ejemplos del sonic, el movimiento del personaje va en línea recta, la pregunta es, como se detecta cuando el personaje debe subir y bajar en vertical es decir, cuando el camino que recorre hace subida o bajada... ??

gracias !!
Creo mejor preguntalo en el hilo de programacion, asi otros pueden leer las respuestas

Sobre lo q dices, ten en cuenta que la megadrive, no tiene nada por hardware practicamente, ni BEX incorpora rutinas de colicion, gravedad..etc que puedas utilizar a tu favor, asi q te tocara programar todo a mano

Si el nivel es simple, tal vez te convendria comenzar con algun codigo, al estilo

"si X>20 y X<50 y sonic caminando, entonces, sonicY++"

Pero si el escenario es mas complejo, yo optaria por algun array multidimensional, que se adaptara al fondo, eso si, no olvides de dos cosas, que la limitacion de 64x64 del buffer no interfiere con tu array, ni que la memoria de la MD es de 64k, asi q tampoco pasarse con el tamaño del mismo ;)

Si te defiendes, ambas opciones te seran facil de programar

salu2
Ok, gracias por la ayuda,
he estado mirando la documentación técnica de la megadrive escrita por NEMESIS y creo que me decantaré por hacerlo todo en ASM, tengo por ahí tb el código del Sonic así que primero me toca empaparme los manuales y luego empezar con el típico "Hola mundo"

La idea que yo tenía era leer de la VDP en la posición en la que se encuentra el personaje (pero en este caso el plano A o B), la duda es que no se si leyendo esa posición devuelve el color en que está pintada la pantalla (y así utilizar un color específico para el "suelo") dependiendo de donde esté el color que me indica la altura de el suelo, pinto el personaje más arriba o más abajo....

¿Se podría?
La idea que yo tenía era leer de la VDP en la posición en la que se encuentra el personaje (pero en este caso el plano A o B), la duda es que no se si leyendo esa posición devuelve el color en que está pintada la pantalla (y así utilizar un color específico para el "suelo") dependiendo de donde esté el color que me indica la altura de el suelo, pinto el personaje más arriba o más abajo....


Esto ya me lo habia planteado tiempo atras,la posible respuesta es que es mala idea. Al menos en la genesis, porque, para leer un punto en particular de la VRAM, necesitas al menos 10 o 12 instrucciones (lo que le lleva a BEX transformar la direccion de la VRAM que uno le pasa como argumento, a la forma en la que es necesario escribir en la VDP para que lo tome como correcto) contra unas 2 o 3 intrucciones que te llevaria si lo cargas desde la RAM. Por desgracia no es tan facil (o tan rapido) ni leer ni escribir en la VRAM

Por ahi se comentaba que una posible solucion, seria hacer un buffer en ram, y leer desde ahi

Este ejemplo, lee el color de un punto, aunque es en basic, si dices q prefieres ASM, no tiene gracia

   dim text(7) as string
   dim nib(3) as integer
   
   text$(0) = "Black  "
   text$(1) = "Red    "
   text$(2) = "Green  "
   text$(3) = "Blue   "
   text$(4) = "Yellow "
   text$(5) = "Magenta"
   text$(6) = "Cyan   "
   text$(7) = "White  "
   
   palettes tile_pallette,0,0,8
   loadtiles tile_data,3,1
   
   drawtile 2,4,4
   drawtile 3,5,4
   
   sprite = addsprite(1,1)
   propsprite sprite,1,0
   
   x = 16
   y = 24
   
   do
      j = joypad(0)
      
      x+= j.3-j.2
      y+= j.1-j.0
      
      movesprite sprite,128+x,128+y
      
      tile_x = (x+3)>>3
      tile_y = (y+3)>>3
      
      tile = readtile(tile_x,tile_y)
      
      pixel_x = x+3-(tile_x<<3)
      pixel_y = y+3-(tile_y<<3)
      
      address = pixel_x>>2*2+(pixel_y*4)+(tile*32)
      word = vdpramread(address)      
      o = 0
      
      nib(0) =  word   /4096: o+= nib(0)*4096
      nib(1) = (word-o)/256 : o+= nib(1)*256
      nib(2) = (word-o)/16  : o+= nib(2)*16
      nib(3) =  word-o
      
      color = nib(pixel_x-((pixel_x>>2)*4))
      
      locate 0,0
      print text$(color)
      
      sleep 3
   loop

tile_pallette:
   dataint $000,$00E,$0E0,$E00,$0EE,$E0E,$EE0,$EEE
   
tile_data:
   datalong $00010000
   datalong $00010000
   datalong $00010000
   datalong $11101110
   datalong $00010000
   datalong $00010000
   datalong $00010000
   datalong $00000000
   
   datalong $00001111
   datalong $00001111
   datalong $00001111
   datalong $00001111   
   datalong $44445555
   datalong $44445555
   datalong $44445555
   datalong $44445555
   
   datalong $22223333
   datalong $22223333
   datalong $22223333
   datalong $22223333
   datalong $66667777
   datalong $66667777
   datalong $66667777
   datalong $66667777


suerte en asm,m ya nos diras tus avances

salu2
Muchas gracias, tendré en cuenta tus consejos... you are the King [360º]
Que tal ASM?

Estos dias estuve haciendo algo de codigo asm para un juego q estoy programando y me acorde de ti (concretamente estaba con el Z80)

Ya comentaras los avances
Pues está la cosa compilacada eh!! ... de momento tengo la documentación técnica de la megadrive que me estoy leyendo, a parte, he pillado la documentación del 68000 standar para ir conociendo el hardware... espero en los próximos días por lo menos poder inicializar la mega y mostrar aunque sea un hello world. Ya te comentaré... :)
Para el sonic no se hacía así.
Se tenía una tabla de tiles asociados a un ángulo. En una tabla en memoria se define el seno y coseno de esos ángulos predefinidos. La posición del movimiento de Sonic es:
Para la posición horizontal:

x+= velocidad *cos(angulo);
y+= velocidad *sin(angulo);

Para la posición vertical:
x+= gravedad *sin(angulo);
y+= gravedad *cos (angulo);


No se que capacidad tendrá la megadrive, pero si puedes hacer una detección de ángulo es todo más fácil. Calculas el ángulo de la superficie sobre la que se apoya y listo. Luego depende de ti cambiar la velocidad conforme al ángulo. Si es mayor que cero acelerar hacia la izquierda, si es menor, hacia la derecha, si saltas, calcular la potencia del salto con respecto a la superficie, etc...

Todo con esas cuatro fórmulas. Evidentemente la megadrive no puede operar con decimales a menos que quieras un sonic a 0.5 fps. Debes convertir las unidades a fixed point y operar con ellas, precalcular los ángulos que vayas a usar y guardarlos en una tabla. Y todas esas multiplicaciones que sean de tipo fixed point.

Si no sabes que es fixed point, es una medida donde se utilizan bits fijos para determinar los decimales, y se opera con ellos como si fuesen enteros.

Así por ejemplo, un entero lo dividimos en 128 unidades en lugar de en 100 (en caso de usar solo dos decimales). Por lo tanto tienes que operar pensando que 0.5 es en realidad 64, 1 es 128, 2 es 256, y 2.25 es 288.

Para calcular el entero real, se hace un desplazamiento de bits. Si usamos 256 (8 bits) para determinar los decimales, entonces hacemos un desplazamiento de bits "posicion >> 8", y tendrás la parte entera real del número.

Espero que te ayude.
Ostras que bueno !!.
Muchas gracias, toda la info recibida es bienvenida ... :)
Sin problemas. Si tienes dudas, solo consulta.
11 respuestas