La détection div collision?
C'est ce que je suis en train de faire maintenant:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>untitled</title>
<meta name="generator" content="TextMate http://macromates.com/">
<style type="text/css" media="screen">
body { font-family:"HelveticaNeue-Light"; margin: 0px; }
input { width: 75%; }
#wrap { background: #f1f1f1; border: 1px solid #d9d9d9; padding: 0px; }
/* #sprite { position: relative; background: #909090; width: 20px; height: 20px; padding: 20px; }*/
#spriteChatBubble { position: relative; background: #fff; border: 1px solid #000; font-size: 10px; max-width: 200px; }
#controlArea { margin-top: 50px; }
.button { background: #fff; color: #0080ff; padding: 5px; border: 1px solid #0050ff; text-decoration: none; }
.button:active { background: #0080ff; color: #fff; }
</style>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
//on load
updatePos();
//get it ready
$("#sprite").css("background-image", "url(left100by100.png)");
//our main block
function detectCollision() {
var spritePos = $("#sprite").position();
var spritePosLeft = spritePos.left;
var spritePosTop = spritePos.top;
var chunkPos = $("#chunk").position();
var chunkPosLeft = chunkPos.left;
var chunkPosTop = chunkPos.top;
//show the chunk's position values (test)
$("#posLeftChunk").text(posLeftChunk);
if (spritePosLeft == chunkPosLeft || spritePosTop == chunkPosTop) {
//make it go somewhere random! :D
var randomLeft = Math.floor(Math.random() * 100);
var randomTop = Math.floor(Math.random() * -100);
//$("#chunk").hide();
$("#chunk").css("top", randomTop + "px");
$("#chunk").css("left", randomLeft + "px");
//$("#spriteChatBubble").animate({"top": "-=" + randomTop}, "fast");
}
}
setInterval(detectCollision, 500);
function insertValues(name){
var name = "foop";
var spritePosition = $("#sprite").position();
var leftVal = spritePosition.left;
var topVal = spritePosition.top;
}
insertValues("");
function showMessage(message) {
$("#spriteChatBubble").show('slow');
$("#messageText").text(message);
$("#spriteChatBubble").delay(5000).hide('slow');
}
function updatePos() {
var position = $("#sprite").position();
$("#posLeft").text(position.left);
$("#posTop").text(position.top);
//updatePos();
//insert the values into a database
insertValues("");
}
$(document).keydown(function(ee) {
$("#spriteChatBubble").hide(); //no need to show this!
//if ($("#sprite").position.left < 0) {
// alert();
// } //fail
if (ee.keyCode == 37) {
//going left!
$("#sprite").css("background-image", "url(left100by100.png)");
//alert("going left!");
$("#sprite").animate({"left": "-=50px"}, "fast");
$("#spriteChatBubble").animate({"left": "-=50px"}, "fast");
updatePos();
}
if(ee.keyCode == 39) {
//going right!
$("#sprite").css("background-image", "url(right100by100.png)");
//alert("going right!");
$("#sprite").animate({"left": "+=50px"}, "fast");
$("#spriteChatBubble").animate({"left": "+=50px"}, "fast");
updatePos();
}
if(ee.keyCode == 38) {
$("#sprite").animate({"top": "-=50px"}, "fast");
$("#spriteChatBubble").animate({"top": "-=50px"}, "fast");
updatePos();
}
if(ee.keyCode == 40) {
$("#sprite").animate({"top": "+=50px"}, "fast");
$("#spriteChatBubble").animate({"top": "+=50px"}, "fast");
updatePos();
}
});
$("#left").click(function() {
$("#sprite").animate({"left": "-=50px"}, "fast");
updatePos();
});
$("#right").click(function() {
$("#sprite").animate({"left": "+=50px"}, "fast");
updatePos();
});
$("#talkButton").click(function() {
showMessage($("#speakField").val());
$("#speakField").val("") ;
});
});
</script>
<!-- Date: 2011-05-23 -->
</head>
<body>
<!-- <div id="spriteChatBubble">
<a class="mt" id="messageText">message</a>
</div> -->
<!-- avatar (you, the player) -->
<div id="sprite" style="position: relative; background: url('right100by100.png'); width: 100px; height: 100px;">
</div>
<!-- chunks -->
<div id="chunk" style="position: relative; background: #909090; width: 20px; height: 5px; top: 100px; left: 80px;"></div>
<div id="controlArea">
position.left: <a id="posLeft">0</a><br>
position.top: <a id="posTop">0</a><br>
<br><br>
position.left (chunk): <a id="posLeftChunk">0</a><br>
position.top (chunk): <a id="posTopChunk">0</a><br>
<!-- <input type="text" id="speakField" onchange="javascript:void(0);">
<a href="javascript:void(0);" class="button" id="talkButton">talk!</a>
<a href="javascript:void(0);" onclick="showMessage('foo');" class="button" id="">test it</a>
<br><br>
<a href="javascript:void(0);" class="button" id="left">(</a>
<a href="javascript:void(0);" class="button" id="right">)</a>
-->
</div>
</body>
</html>
Qui se déplace de 50 pixels dans la direction souhaitée, cependant la détection div collision (le sprite de frapper le "bloc") et qu'il doit ensuite être déplacés. Connaissez-vous une meilleure façon de détecter les divs en collision? Merci.
Cela ressemble beaucoup à cette question ... stackoverflow.com/questions/4230029/...
OriginalL'auteur Tim | 2011-05-08
Vous devez vous connecter pour publier un commentaire.
Je vais vous donner une réponse théorique:
Vous souhaitez calculer votre div à l'limites -- obtenir votre x,y du coin de valeurs et de voir si une autre div limites de croiser vos autres div valeurs. Si il y a une intersection de coordonnées, alors vous avez vous-même une collision.
Comment obtenir les coordonnées de l'emplacement:
la mise à jour de ma réponse avec comment.
Merci. Je vais essayer ça.
Bien sûr, je vous suggère de faire un $.chacun() sur chaque div, vous allez comparer et de créer un objet avec les attributs ci-dessus et de les comparer sur le même objet que de la div vous êtes en mouvement.
OriginalL'auteur Atticus
Essayer jquery-collision. La divulgation complète: je l'ai écrit récemment et venez de télécharger. J'ai couru dans ce me récemment, et ne pas voir une solution évidente, j'ai donc décidé de faire un plugin de moi-même et de le poster sur source-forge.
Il permet de faire:
ou "#chunk" peut être une sorte de ".obstacle" et il sera de retour tous class="obstacle" qui se chevauchent id="sprite".
OriginalL'auteur eruciform
Essayer ce?
OriginalL'auteur
J'utilise cette technique ... la fonction peut être optimisé, mais j'ai laissé un peu verbeux pour plus de clarté:
Cela fonctionne très bien, assez utilisé dans quelques petits jeux. Vous pouvez remplacer
position()
avecoffset()
si vous voulez en compte pour les bordures et les marges.Je vous le recommande le remplacement de cette:
avec quelque chose comme:
Ce sera un peu plus rapide, pas de raison de l'utiliser pour animer linéaire de mouvement interactif. Aucune raison de constamment sélectionnez
#sprite
, vous devriez le sélecteur.OriginalL'auteur Zevan
J'ai peut-être la lecture de quelque chose de mal, mais certains de ces exemples semblent erronées, ou pas assez instructif. Lors de la vérification de collision, vous ne pouvez pas il suffit de cocher un côté, parce que vous êtes à découper un plan entier. Vous aussi vous ne pouvez pas il suffit de cocher une div, parce que celui que vous essayez de place peut engloutir le div, et vous pourriez avoir besoin de vérifier que la collision.
J'ai été de tenter de détection de collision sur les images, mais il peut facilement être converti pour les divs. J'ai inclus toutes les fonctions qui s'y rapportent. Mon objectif était d'être en mesure de placer une div n'importe où je veux sur la page, et aléatoire des images, ainsi que leur placement, sans affecter de toute autre chose sur la page. Évidemment, si vous souhaitez utiliser cette fonction, vous devez changer les noms des images à vos images avec vos propres chemins.
Aussi, si vous utilisez cette fonction avec beaucoup d'images, ou dans un espace restreint, ou tout simplement veulent un failsafe, un compteur peut être ajouté à la
while
boucle, ce qui serait utilisée pour briser la boucle si un certain nombre n'a jamais été atteint. Cela permettrait d'éviter la page de verrouillage vers le haut si c'était d'avoir des problèmes à trouver un endroit pour tout.J'espère que quelqu'un qui se retrouve ici, comme je l'ai fait, peut l'utiliser.
CSS
Fonction retourne un nombre aléatoire
Fonction renvoie une position aléatoire
Fonction Principale
Exemple de l'appeler
OriginalL'auteur user2592690