2008-12-01 6 views
16

Ce fut un long week-end de vacances, alors je suis le bug de codage à nouveau et commencé à jouer:physique 2d Platformer

Mario http://gfilter.net/junk/tileengine.jpg

j'ai écrit un moteur de carreau de base, mais ayant jamais essayé auparavant, je suis vraiment mal à gérer la détection de collision sprite et l'implémentation de la physique réaliste pour la gravité.

Pour tous les autres auteurs de passe-temps de jeu, pouvez-vous me montrer quelques pistes sur la meilleure façon d'aborder cela?

Mise à jour:

Je pensais que je partagerais un rapport d'étape:

http://www.youtube.com/watch?v=-RKNQ2UiiLY < - Jeu en action

Son encore vraiment bogué, mais la détection de collision fonctionne la plupart du temps, je J'ai commencé à travailler sur d'autres fonctionnalités (par exemple, cogner les blocs (notez le bug) et interagir avec les ennemis). Mario marche toujours comme s'il était sur la lune, j'utilise ces constantes, un conseil pour les peaufiner pour plus de réalisme?

const float AirDrag = 1.00f; 
    const float GroundFriction = .97f; 
    const float Gravity = 0.8f; 
+8

La vidéo est désactivée! –

Répondre

1

Ce peut être un détour, mais essayez le kit de démarrage de XNA 3.0 Platformer, qui contient des choses comme la physique et la détection de collision de base. Vous aurez besoin de changer les choses pour le faire fonctionner en dehors de XNA, mais ce n'est pas sorcier.

XNAGS 3.0 download

2

Gravity est facile:

const gravity = ... ; // pixels per timestep (eg. video frame) squared 
// while in freefall, each timestep: 
y_velocity += gravity; 
y_pos += y_velocity; 

Rappelez-vous, la plupart des jeux de plate-forme 2d j'ai joué ne pas avoir gravité réaliste. Faites juste ce qui rend le jeu amusant!

+4

Techniquement, je pense que vous devez d'abord mettre à jour la position (donc il utilise la vélocité du pas précédent), puis mettre à jour la vélocité. – gnovice

+0

@gnovice Encore plus techniquement, consultez verlet – super

-6

Jamais entendu parler de GameMaker?

+7

Cela prend tout le plaisir de sortir. – FlySwat

+0

vous voulez passer votre vie à faire les choses à la dure, être mon invité – wjhplano

2

jnrdev peut être utile. Il couvre la collision/réponse des tuiles et les pentes. Ce n'est pas le meilleur code que j'ai jamais vu, mais il fait le travail.

+0

Merci pour ce lien. J'allais le recommander aussi, mais il a depuis été perdu au fil des ans dans mes signets :) – grepsedawk

0

Je ne sais pas ce que vous utilisez pour un modèle physique, mais les modèles physiques qui utilisent fluid drag ont récemment été adressés dans another SO question. Je ne vais pas répéter tout ce que j'ai donné dans ma réponse, je vais juste link to it. En résumé, l'OP de la question voulait accélérer un objet de repos à une vitesse maximale. J'ai parcouru quelques dérivations pour modéliser la vitesse en fonction du temps pour deux types de traînées. Votre situation peut être légèrement différente, de sorte que les intégrales utilisées peuvent avoir différentes formes ou doivent être résolues avec des conditions initiales différentes, mais j'espère que ma réponse vous indiquera quelques directions informatives.

2

Il y a quelques tutoriels de plate-forme 2-D très utiles au http://www.metanetsoftware.com/technique/tutorialA.html et http://www.metanetsoftware.com/technique/tutorialB.html. Je pense qu'ils ont été référencés par d'autres ailleurs sur SO. Ils couvrent la détection et la réponse aux collisions, la radiographie, diverses techniques d'optimisation, etc. et ont une bonne explication de la théorie derrière tout cela pour ceux (comme moi) qui sont moins enclins mathématiquement. Cela ne va pas aussi loin que des trucs comme la dynamique du corps rigide, mais je ne pense pas que vous en auriez besoin pour le type de jeu que vous écrivez (bien que ce serait bien sûr cool si vous ajoutez ce genre de choses ..

+0

par le look de celui-ci, les tutoriels que j'ai suggéré couvrent des trucs similaires à jnrdev mentionnés par Zack Mulgrew. Je n'ai pas encore lu jnrdev (au-delà d'un premier coup d'œil) donc je ne peux pas vraiment les comparer. – bm212

0

Votre bug avec les blocs multiples étant bumped, vous pouvez résoudre ce problème en ne faisant que bouter le bloc qui est le plus aligné avec le playerprite, ou a le moins de décalage. Assurez-vous de ne pas le limiter à une seule direction. Les blocs peuvent être heurtés de n'importe quelle direction dans Mario. (Ci-dessus en faisant une masse au sol dans les mêmes jeux, ou la chose de percer-tourner) (Côtés en utilisant un shell)

0
UIGraphicsBeginImageContext(images.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    UIColor *color = [UIColor whiteColor]; 
    [color setFill]; 

    CGContextTranslateCTM(context, 1, images.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextSetBlendMode(context, kCGBlendModeDestinationOver); 
    CGRect rect = CGRectMake(0.0, 0.0, images.size.width, images.size.height); 
    CGContextDrawImage(context, rect, images.CGImage); 
    CGContextClipToMask(context, rect, images.CGImage); 
    CGContextAddRect(context, rect); 
    CGContextDrawPath(context, kCGPathFill); 
    images = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext();