Erkennen von div Kollision?
Dies ist, was ich bin jetzt tun:
<!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>
Bewegt er sich um 50 Pixel in die gewünschte Richtung, jedoch erkennen von div Kollision (die sprite-treffen der "chunk") und dann muss es verlegt werden. Kennen Sie eine bessere Art und Weise zu erkennen, die divs zu kollidieren? Danke.
Das sieht sehr ähnlich zu dieser Frage ... stackoverflow.com/questions/4230029/...
InformationsquelleAutor Tim | 2011-05-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gebe ich dir eine theoretische Antwort:
Möchten Sie berechnen Sie Ihre div - Grenzen-Holen Sie sich Ihre x -, y-Ecke-Werte und sehen, wenn alle anderen div-Grenzen schneiden Sie Ihre anderen div-Werte. Wenn es einen Schnittpunkt der Koordinaten dann müssen Sie sich eine Kollision.
Wie man Lage-Koordinaten:
die Aktualisierung meiner Antwort mit wie.
Danke. Ich werde versuchen, dass.
Sicher-ich würde vorschlagen, tun ein $.each() auf die einzelnen div-Sie sind im Vergleich zu, und erstellen Sie ein Objekt mit den Attributen oben und vergleichen gegen das gleiche Objekt, das der div, die Sie bewegen.
InformationsquelleAutor Atticus
Versuchen jquery-Kollision. Vollständige Offenlegung: ich schrieb vor kurzem, und gerade hochgeladen. Ich lief in dieser mir vor kurzem, und nicht sehen, eine offensichtliche Lösung, also beschloss ich, ein plugin selbst, und posten Sie es auf source-forge.
Ermöglicht es Ihnen zu tun ist:
oder "#chunk" eine Art ".Hindernis" und wird es wieder alle class="Hindernis", das überlappen id="sprite".
InformationsquelleAutor eruciform
Versuchen?
InformationsquelleAutor
Ich verwende diese Technik ... die Funktion könnte optimiert werden, aber ich habe es etwas Ausführlicher für Klarheit:
Dies funktioniert gut genug - in ein paar kleine Spiele. Sie können ersetzen
position()
mitoffset()
wenn Sie wollen Konto für Rahmen und Polsterung.Ich auch empfehlen, ersetzen Sie diese:
mit so etwas wie:
Dieser wird ein bisschen schneller, kein Grund zur Nutzung zu animieren für lineare interaktive Bewegung. Kein Grund, ständig wählen Sie
#sprite
sollten Sie den Selektor.InformationsquelleAutor Zevan
Ich könnte das Lesen etwas falsch, aber einige der Beispiele scheinen entweder falsch, oder nicht informativ genug. Bei der überprüfung auf Kollision, können Sie nicht nur überprüfen, die eine Seite, denn Sie schneiden sich ein ganzes Flugzeug. Man kann auch nicht einfach prüfen, div, weil die, die Sie versuchen zu platzieren, kann verschlingen die platziert div, und Sie müssen, um zu überprüfen, dass die Kollision als gut.
Ich habe schon versucht die Kollisionserkennung auf den Bildern, aber kann leicht umgewandelt werden, für divs. Ich habe alle Funktionen, die auf diese beziehen. Mein Ziel war es, in der Lage, ein div-überall möchte ich auf der Seite, und zufällig Bilder, sowie deren Anordnung, ohne die alles andere auf der Seite. Natürlich, wenn Sie dies nutzen wollen, müssen Sie "Bild ändern" Namen, um auf Ihre Bilder, mit Ihrer eigenen Wege.
Auch, wenn Sie diese mit einer Menge von Bildern, oder in einem engen Raum, oder einfach nur wollen, ein failsafe, ein Zähler Hinzugefügt werden könnten, um die
while
Schleife, die verwendet werden würde, die Schleife zu brechen, wenn eine bestimmte Anzahl wurde nie erreicht. Dies würde verhindern, dass die Seite aus verschlossen war, wenn es Probleme bei der Suche nach Orten für alles.Hoffentlich jemand, der hier landet, wie ich es Tat, kann es verwenden.
CSS
Funktion gibt eine zufällige Zahl
Funktion gibt eine zufällige position
Main-Funktion
Beispiel zu nennen
InformationsquelleAutor user2592690