vmbatlle / super-mario-kart Goto Github PK
View Code? Open in Web Editor NEWSuper Mario Kart clone using C++ with SFML
Home Page: https://sites.google.com/view/sper-mario-kart/inicio
License: GNU General Public License v3.0
Super Mario Kart clone using C++ with SFML
Home Page: https://sites.google.com/view/sper-mario-kart/inicio
License: GNU General Public License v3.0
Si se cierra el juego cuando hay un thread pendiente (p. ej cálculo del gradiente), sale un mensaje de error al no hacer join
Al igual que con EffectDrown
, hacer partículas cuando te chocas contra una pared (ver misc/particles.png
, las amarillas)
Efecto esperado:
La música debería permanecer reproduciéndose durante toda la carrera. Opcionalmente, modificar la pista reproducida durante la última vuelta por la correspondiente música acelerada.
Efecto actual:
La música termina a los 01' 40'' de juego (caso Mario Circuit 2).
La música termina a los 02' 54'' de juego (caso Donut Plain).
Etc.
Hay que tener en cuenta tres cosas:
getXXXDrawables(...)
de map.cpp
pueden devolver un segundo drawable que sea la sombra, situado en la misma posición que el jugador y con altura 0 (asegurar que la sombra se pinta detrás del jugador)Driver::getDrawable()
(ahora podría devolver dos drawables)Por ahora todavía te deja en sitios raros y lleva velocidad mientras te tiene en el aire, ¿debería ser estático? ¿cuál es el mejor sitio al que devolver al jugador?
Al pushear los dos a la vez se llama al init antes de que StateGPStandings le de tiempo a actualizar la clasificación
A veces tu followedPath no crece y solo tiene 1 elemento.
Observaciones:
Añadir al fichero objects.txt
de cada mapa:
ghost_valley_1
o derrapar/conducir por cualquier terreno de cualquier mapa)EffectDrown
(tanto para objetos como para jugadores que caigan al agua). Ver qué hacemos con la lavaEn algunos casos (que no he sabido diferenciar) se quedan atascados NPCs en las paredes de bowser castle (1/4 circuito y despues de los primeros saltos)
Al cargar el juego se leen todos los controles de un fichero. Si este no existe o hay algun problema al leerlo, se sustituye por los defaults
Efecto esperado:
Cuando a un jugador (cualquiera) le cae un rayo, se debería frenar su aceleración y poner a 0 su velocidad angular, similar a un oil slick.
Efecto actual:
Al caer un rayo encima de un player character, este puede seguir girando/mantiene su velocidad angular, dando un menor efecto de ralentización y pérdida de control.
StateCongratulations: Bandas negras, que ponga el puesto en el que has quedado/el resto de la clasificación etc.
StateRaceEnd: que se vea la clasificación a un lado conforme van terminando los corredores
Relacionada con #15
En game.cpp:86
se debería llamar a los métodos setWindowSize()
o setScale()
necesarios para que todos los elementos de la GUI sean escalados. Se puede asumir que el tamaño "normal" del juego es 512x448 píxeles y por tanto, la escala que se debería aplicar a todos los sprites es:
BACKGROUND_WIDTH = 512.0f
scale = window.getSize().x / BACKGROUND_WIDTH
Actualmente los saltos tienen algunos problemas:
Propongo los siguientes cambios para los saltos con rampa, para que sean más cómodos para el jugador:
Al saltar:
Ya diréis qué opináis sobre estos cambios
Versión del bug 2b2538a:
Por ejemplo, en la senda arcoiris. Si te caes mientras está presente el Lakitu de dirección errónea el sonido SFX no se detiene.
Para hacer un medio-fix, he puesto que a partir de ahora NO se puedan reproducir en bucle (loop = true
) dos SFX iguales. Aún con todo, deber arreglar lo del pitido porque sigue sonando cuando Lakitu te devuelve con caña de pescar.
Solución: actualizar currentTime de StateRace desde StateRaceEnd
Backtrace from GDB:
Thread 1 received signal SIGSEGV, Segmentation fault.
0x66b86358 in sf::Image::getPixel(unsigned int, unsigned int) const ()
from C:\mingw810\i686-810-posix-dwarf-rt_v6-rev0\mingw32\mingw\bin\sfml-graphics-2.dll
(gdb) bt
#0 0x66b86358 in sf::Image::getPixel(unsigned int, unsigned int) const ()
from C:\mingw810\i686-810-posix-dwarf-rt_v6-rev0\mingw32\mingw\bin\sfml-graphics-2.dll
#1 0x0044370c in Map::sampleAsset (asset=..., sample=...) at map/map.h:81
#2 0x004197c0 in Map::sampleMap (this=0x4b3e40 <Map::instance>, sample=...) at map/map.cpp:6
#3 0x00419cf1 in Map::mode7 (this=0x4b3e40 <Map::instance>, position=..., angle=-0.0132949613,
fovHalf=0.5, clipNear=0.000500000024, clipFar=0.0450000018, size=..., perspective=true)
at map/map.cpp:49
#4 0x0041bd39 in Map::circuitTexture (player=
std::shared_ptr<Driver> (use count 5, weak count 0) = {...}, circuitTexture=...) at map/map.cpp:384
---Type <return> to continue, or q <return> to quit---
#5 0x00428e4b in StateRace::draw (this=0xf37d328, window=...) at states/race.cpp:130
#6 0x004395ed in Game::run (this=0xf5fc80) at game.cpp:69
#7 0x0043a130 in main () at main.cpp:5
Para cada carrera, mejorar la animación de la cámara (puede hacer giros, etc.)
Si sobra tiempo, es posible hacer alguna animación en la pantalla de inicio si el jugador no pulsa ninguna tecla
Explicación más detallada:
Comprobar si la estrella:
Esto puede dar efectos indeseados, como usar un champiñón mientras estás dando vueltas y que el champiñón acelere tu vehículo.
Por ahora el jugador gana monedas, pero no pierde monedas en ningún momento:
Debería perder monedas:
Parece que el tiempo de animación SMALL no está bien ajustado en función de la posición de los jugadores en el momento de recibir el rayo. Si es posible acceder a la posición desde driver.cpp:234
, valdría con multiplicar SPEED_DOWN_DURATION
por un escalar en función de la posición.
Nota: ¿por qué estos tiempos no coinciden?
animator.small(SPEED_DOWN_DURATION + SPEED_DOWN_DURATION);
pushStateEnd(DriverState::SPEED_DOWN, StateRace::currentTime + SPEED_DOWN_DURATION);
En cualquier resolución que no sea la normal el efecto FALLING escala al revés (el tamaño aumenta en vez de disminuir)
La altura no se ajusta a la de lakitu
Cuando termina una carrera y se entra en el estado RaceEnd:
Al correr dos carreras o más seguidas en GP, el SFX de semáforo deja de sonar
Para asegurar que la IA no se queda bloqueada durante mucho tiempo, p. ej. contra una pared; comprobar si no ha salido de un área (p. ej. de 3x3 tiles) durante un tiempo. Utilizar la misma primitiva que cuando se salgan del circuito (TP con/sin Lakitu).
onLakitu
del driver puede no resetearse después de que te recoja Lakitu (y por tanto, no puedes caer)No tiene por qué ser diferente para cada pantalla, podría ser una música de fondo en bucle idéntica siempre que no se esté corriendo. Lo importante es que no se quede en silencio el juego.
Si al terminar la carrera hay un jugador que le está afectando el cambio de color por la estrella, este cambio de color se mantiene en pantallas posteriores (por ejemplo, en el estado congratulations donde se muestra a los corredores en el podio)
El color de la estrella (y bueno, creo que todos los efectos de items en general) deberían ser quitados cuando el player character termine cualquier carrera, para evitarnos este tipo de problemas.
Las comprobaciones de colisión solo se deberían hacer si los dos objetos (jugadores, items, etc.) están a una altura parecida (si se chocan A y B, abs(h_a - h_b) < valor_pequeño
)
Ahora los objetos los usa con un random, se puede añadir una puntuación de "cómo de bueno sería usar este objeto ahora mismo" y hacer que sea más probable usarlo en momentos buenos
Map::getDriverDrawables(...)
A veces fixedUpdate se ejecuta más de una vez por cada handleTryPop, haciendo que haya 2 trypops en espera
Por ahora la IA es incapaz de dar el salto, aún cuando toma la rampa de forma casi recta. Cualquiera de estas cosas vale:
En la pantalla de START
si se hace clic en ESCAPE
se sale directamente. Quizás sea mejor mostrar un mensaje de YES / NO
para "Exit game?"
También se aprecia que apareces fuera del mapa ya que ahora no se para al caer y se guarda como posición valida en el "log de posiciones" [@vmbatlle]
En la línea driver.cpp:413
se invoca a la animación de DriverAnimator::fall()
pero no es visible a causa de la relocalización instantánea de Lakitu. Se deben también retesar los efectos adversos y power-ups, tanto del estado del jugador como del sprite.
Quizás se podría hacer que el animator haga al jugador pequeño, luego se pase a fundido a negro la pantalla del jugador (parte superior), en ese momento se llama a Driver::relocateToNearestGoodPosition()
y finalmente se quita el fundido a negro.
Viendo que hay varios problemas al llamar directamente al sistema de audio desde cualquier sitio (issues #1 #2 #12 #13), propongo lo siguiente:
Audio::play(music)
para que ponga las canciones en bucle correctamenteAudio::play(music)
para la música (situada donde sea), a la que le puedas indicar donde estas (en carrera, en el menu 1, menu 2, etc.) y suene la música correspondienteMap
cual es la música del circuito acutal (tanto la normal como la de ir rápido)No se si me dejo algún caso especial, ya diréis qué os parece y cómo nos encargamos de esto
Evitaría los choques que ocurren al principio
Al dar estos problemas la música de la estrella, sugiero añadir alguna lógica a map
para que sepa qué música suena en cada momento (estrella/normal/last lap) y que se pueda cambiar entre ellas, pero solo pueda sonar una a la vez.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.