collision detection σε ορθογώνιο

Λύσεις προβλημάτων για το δημοφιλές πρόγραμμα κατασκευής παρουσιάσεων στο διαδίκτυο.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
HoMESICk_ALIEN
Δημοσιεύσεις: 77
Εγγραφή: 27 Μαρ 2004 16:24

collision detection σε ορθογώνιο

Δημοσίευση από HoMESICk_ALIEN » 12 Μάιος 2004 10:23

Γεια,

σε ένα παιχνίδι σε στυλ minigolf που θέλω να κάνω, πρέπει να βρίσκω για κάθε εμπόδιο σε ποια από τις τέσσερις πλευρές του γίνεται το hitTest έτσι ώστε να πηγαίνει το μπαλάκι στη κατάλληλη κατεύθινση. Έχει δει κανείς κάπου κάτι παρόμοιο ή έχει καμιά ιδέα σχετικά; Με τα τετράγωνα δουλεύει μια χαρά, αλλά θέλω και ορθογώνια :hammer:

Αν θέλετε ρίξτε μια ματιά στον κώδικα για το εμπόδιο:

Κώδικας: Επιλογή όλων

onClipEvent (load) {
	ball = _root.ball;
	//
	obsU = this._y - this._height / 2;
	obsD = this._y + this._height / 2;
	obsL = this._x - this._width / 2;
	obsR = this._x + this._width / 2;
}
onClipEvent (enterFrame) {
	//
	ballU = ball._y - ball._height / 2;
	ballD = ball._y + ball._height / 2;
	ballL = ball._x - ball._width / 2;
	ballR = ball._x + ball._width / 2;
	//
	_root.bU.text = ballU;
	_root.bD.text = ballD;
	_root.bL.text = ballL;
	_root.bR.text = ballR;
	//
	_root.oU.text = obsU;
	_root.oD.text = obsD;
	_root.oL.text = obsL;
	_root.oR.text = obsR;
	//
	if (this.hitTest(ball)) {
		if &#40;ballR > obsL and ballL < obsR and ballD > obsU&#41; &#123;
			// ballD hits obsU
			ball.speedY *= -1;
		&#125; else if &#40;ballR > obsL and ballL < obsR and ballU < obsD&#41; &#123;
			// ballU hits obsD
			ball.speedY *= -1;
		&#125; else if &#40;ballU < obsD and ballD > obsU and ballR > obsL&#41; &#123;
			// ballR hits obsL
			ball.speedX *= -1;
		&#125; else if &#40;ballU < obsD and ballD > obsU and ballL < obsR&#41; &#123;
			// ballL hits obsR
			ball.speedX *= -1;
		&#125;
	&#125;
&#125;

(και sorry για το μέγεθος :cry: )

Άβαταρ μέλους
|dD|
Honorary Member
Δημοσιεύσεις: 1161
Εγγραφή: 22 Ιαν 2004 16:47
Τοποθεσία: Greece

collision detection σε ορθογώνιο

Δημοσίευση από |dD| » 12 Μάιος 2004 13:16

8a se parakalusa na stilis ke to .fla

Άβαταρ μέλους
HoMESICk_ALIEN
Δημοσιεύσεις: 77
Εγγραφή: 27 Μαρ 2004 16:24

collision detection σε ορθογώνιο

Δημοσίευση από HoMESICk_ALIEN » 12 Μάιος 2004 15:08

Το έχω ανεβάσει εδώ:

http://www.grafistas.gr/alien/rectHitTest.zip

spookyb52
Δημοσιεύσεις: 1891
Εγγραφή: 23 Ιαν 2002 01:00
Τοποθεσία: Lost in the mansion
Επικοινωνία:

collision detection σε ορθογώνιο

Δημοσίευση από spookyb52 » 12 Μάιος 2004 15:37

Άν δέν χρησιμοποιείς πολλά ορθογώνια θα μπορούσες μέσα στο clip με το ορθογώνιο να σχεδιάσεις μικρότερα (πχ 4 clips) τα οποία θα ανιχνεύουν σύγκρουση

Άν καί δέν έχω φτιάξει κάτι σχετικό, αυτό που θές νομίζω είναι η εντολή getbounds (xMax, xMin κτλ) Είχα φτιάξει ένα λαβύρινθο με κώδικα μόνο πού έκανε χρήση hitTest με getbounds άν το βρώ θα στο στείλω.
Life is like a fast car on an icy road. Brakes don't work, yes I know it, but I step on the gas
Garage punk | Rockabilly | Rock 'n' Roll | Stoner

Άβαταρ μέλους
HoMESICk_ALIEN
Δημοσιεύσεις: 77
Εγγραφή: 27 Μαρ 2004 16:24

collision detection σε ορθογώνιο

Δημοσίευση από HoMESICk_ALIEN » 12 Μάιος 2004 16:20

Εννοεις μάλλον να φτιάξω το κάθε ορθογώνιο με χρήση πολλών μικρότερων τετραγώνων, σωστά; το σκέφτηκα, αλλά δεν είναι καλή λύση, γιατί θα έχει πολλούς ελέγχους να κάνει (ειδικά στα εξωτερικά περιθώρια)...

Όσον αφορά το "getBounds" δε με βοηθά ιδιαίτερα, καθώς ήδη έχω τις συντεταγμένες της περιμέτρου της μπάλας και του εμποδίου (που επιστρέφει η getBounds):

ballU = ball._y - ball._height / 2;
ballD = ball._y + ball._height / 2;
ballL = ball._x - ball._width / 2;
ballR = ball._x + ball._width / 2;


Καμιά άλλη ιδέα;

spookyb52
Δημοσιεύσεις: 1891
Εγγραφή: 23 Ιαν 2002 01:00
Τοποθεσία: Lost in the mansion
Επικοινωνία:

collision detection σε ορθογώνιο

Δημοσίευση από spookyb52 » 12 Μάιος 2004 19:55

Δέν έχω το κουράγιο να σου αναλύσω την getBounds αλλά βάλε τον παρακάτω κώδικα σέ ένα frame και τέσταρέ το.
Δέν είναι φτιαγμένο κανονικά αλλά απλά για να δείς. :P

Μπορείς να φτιάξεις βρόχους για να παίρνεις τις τιμές πολλών αντικειμένων και άν θές να αποθηκεύεις τις τιμές αυτές σε ένα πίνακα

πχ

myboard = []
for(i=0; i<10; ++i){
myboard = _root["clip"+i]._x
}

το παραπάνω θα έφτιαχνε ένα πίνακα με 9 τιμές

θα ήταν η θέση _χ των clips με instance name

clip1
clip2
.
..
...
clip9

Κώδικας: Επιλογή όλων

createEmptyMovieClip&#40;"backg", 1&#41;;
with &#40;backg&#41; &#123;
	beginFill&#40;0xD8EDFE, 100&#41;;
	lineTo&#40;0, 0&#41;;
	lineTo&#40;0, 296&#41;;
	lineTo&#40;396, 296&#41;;
	lineTo&#40;396, 0&#41;;
	endFill&#40;&#41;;
	_x = 1;
	_y = 0;
&#125;
createEmptyMovieClip&#40;"tetragon", 2&#41;;
with &#40;tetragon&#41; &#123;
	beginFill&#40;0x336699, 100&#41;;
	lineTo&#40;0, 0&#41;;
	lineTo&#40;0, 11&#41;;
	lineTo&#40;11, 11&#41;;
	lineTo&#40;11, 0&#41;;
	endFill&#40;&#41;;
	_x = 0;
	_y = 0;
&#125;
createEmptyMovieClip&#40;"walls1", 3&#41;;
with &#40;walls1&#41; &#123;
	beginFill&#40;0xFF0000, 100&#41;;
	lineTo&#40;0, 0&#41;;
	lineTo&#40;0, 111&#41;;
	lineTo&#40;51, 111&#41;;
	lineTo&#40;51, 0&#41;;
	endFill&#40;&#41;;
	_x = 111;
	_y = 44;
&#125;
duplicateMovieClip&#40;"walls1", "walls2", 8&#41;;
walls2._x = 231;
//---------------------
// Move & detect if player collide with walls
onEnterFrame = function &#40;&#41; &#123;
	for &#40;i=1; i<3; i++&#41; &#123;
		with &#40;_root.tetragon&#41; &#123;
			_y += &#40;_root._ymouse-_y&#41;*0.02;
			_x += &#40;_root._xmouse-_x&#41;*0.02;
			&#40;_root&#91;"walls"+i&#93;.hitTest&#40;getBounds&#40;_root&#41;.xMin, _y, true&#41;&#41; ? _x+= 3 &#58; spooky;
			&#40;_root&#91;"walls"+i&#93;.hitTest&#40;getBounds&#40;_root&#41;.xMax, _y, true&#41;&#41; ? _x -= 3 &#58; spooky;
			&#40;_root&#91;"walls"+i&#93;.hitTest&#40;_x, getBounds&#40;_root&#41;.yMin, true&#41;&#41; ? _y += 3 &#58; spooky;
			&#40;_root&#91;"walls"+i&#93;.hitTest&#40;_x, getBounds&#40;_root&#41;.yMax, true&#41;&#41; ? _y -= 3 &#58; spooky;
		&#125;
	&#125;
&#125;;
Life is like a fast car on an icy road. Brakes don't work, yes I know it, but I step on the gas
Garage punk | Rockabilly | Rock 'n' Roll | Stoner

Άβαταρ μέλους
|dD|
Honorary Member
Δημοσιεύσεις: 1161
Εγγραφή: 22 Ιαν 2004 16:47
Τοποθεσία: Greece

collision detection σε ορθογώνιο

Δημοσίευση από |dD| » 13 Μάιος 2004 09:21

perimeno mia apadisi apo tin Macromedia gia kapia bugs pu brika (sinartisi fps ke pix) sto hitTest, molis me enimervsun apostelv ke apadisi ;)

Άβαταρ μέλους
HoMESICk_ALIEN
Δημοσιεύσεις: 77
Εγγραφή: 27 Μαρ 2004 16:24

collision detection σε ορθογώνιο

Δημοσίευση από HoMESICk_ALIEN » 13 Μάιος 2004 15:46

Τώρα κατάλαβα τι εννοούσες spookyb52.
Έξυπνος ο κώδικας - μου βγάζει βέβαια κάποια bugs, ειδικά στις γωνίες, αλλά ελπίζω να τα διορθώσω :wink:

Ευχαριστώ πολύ πάντως!

|dD| περιμένω.. :roll: :pint:

Άβαταρ μέλους
|dD|
Honorary Member
Δημοσιεύσεις: 1161
Εγγραφή: 22 Ιαν 2004 16:47
Τοποθεσία: Greece

collision detection σε ορθογώνιο

Δημοσίευση από |dD| » 13 Μάιος 2004 15:56

HoMESICk_ALIEN έγραψε:Τώρα κατάλαβα τι εννοούσες spookyb52.
Έξυπνος ο κώδικας - μου βγάζει βέβαια κάποια bugs, ειδικά στις γωνίες, αλλά ελπίζω να τα διορθώσω :wink:
eki briskode ta bugs ;) , anamenv ke egv.

Άβαταρ μέλους
|dD|
Honorary Member
Δημοσιεύσεις: 1161
Εγγραφή: 22 Ιαν 2004 16:47
Τοποθεσία: Greece

collision detection σε ορθογώνιο

Δημοσίευση από |dD| » 24 Μάιος 2004 12:30

parolo oti akoma den exv pari apadisi apo tin Macromedia gia to parapanv bug, para8etv to mail apostolis mu ke to final project (elpizv na proxorisis ;)).
|dD| έγραψε: Technical Issues on HitTest in Macromedia Flash

The philosophy upon which Flash has been developed although achieves certain goals on movement and animation it brings forth though several confinements in programming. A serious problem arising is controlling colliding objects. Since flash assumes an objects&#8217; movement and splits it frames movement is not linear and instead is "jumping".
In example, we have a 10x10 pixels ball in x,y (0,200) in frame 1 and a square in (400,200) and we move the ball over to (500,200) in 10 frames.
We put in a clip event on the square the hitTest trigger control. The ball actually passes, touches and goes from the square triggering the event. However, if the ball started from a different position (90,200) it would never touch the square and would pass right through it. In a pool game that would be a serious bug!
That happens because flash takes the movement and slices it in frames because it cares only for what the user see. In fast movements the objects are projected in each frame in places that are far from each other and by the programmers scope the objects never pass over the points between the projected ones. This causes the several bugs in collision detection in flash within fast paced action games.

Download File

Άβαταρ μέλους
HoMESICk_ALIEN
Δημοσιεύσεις: 77
Εγγραφή: 27 Μαρ 2004 16:24

collision detection σε ορθογώνιο

Δημοσίευση από HoMESICk_ALIEN » 24 Μάιος 2004 14:56

ευχαριστώ-μόνο που δεν έχω το MX 2004 και δε μπορώ να ανοίξω το fla σου :(

αν μπορείς να κάνεις κάτι..

Άβαταρ μέλους
|dD|
Honorary Member
Δημοσιεύσεις: 1161
Εγγραφή: 22 Ιαν 2004 16:47
Τοποθεσία: Greece

collision detection σε ορθογώνιο

Δημοσίευση από |dD| » 24 Μάιος 2004 15:11

xanadokimase tvra ;)

Panoulis
Δημοσιεύσεις: 337
Εγγραφή: 02 Αύγ 2002 02:15
Τοποθεσία: Αθήνα

collision detection σε ορθογώνιο

Δημοσίευση από Panoulis » 25 Μάιος 2004 18:35

Αυτό που είπε ο spooky με τα 4 movie clips μέσα στο ορθογώνιο είναι ο πιο εύκολος και ο πιο γρήγορος τρόπος γιατί προσπαθείτε με άλλους τρόπους; που είναι το δύσκολο; Όσο για το πρόβλημα που υπάρχει όταν ένα movie clip κινείται με μεγάλη ταχύτητα και συνήθως υπάρχει πρόβλημα με την ανίχνευση της σύγκρουσης... η μόνη λύση είναι να κατεβάσεις την ταχύτητα που θα κινείτε σε κάθε frame το αντικείμενο και να ανεβάσεις το framerate...

Άβαταρ μέλους
HoMESICk_ALIEN
Δημοσιεύσεις: 77
Εγγραφή: 27 Μαρ 2004 16:24

collision detection σε ορθογώνιο

Δημοσίευση από HoMESICk_ALIEN » 26 Μάιος 2004 09:22

Τελικά ό,τι και αν δοκίμασα είχε πρόβλημα στις γωνίες. Την λύση έδωσε ένα άλλο παιδί που έκανε κάτι παρόμοιο με ray casting (!) αν και έγινε αρκετά δαπανηρό σε υπολογιστική ισχύ.. Το κακό είναι ότι δεν έχω άλλο χρόνο για να το προσεγγίσω με άλλο τρόπο (πχ να βάλω μερικά σημεία στην περίμετρο της μπάλας κ να κάνω με εκείνα ελέγχους). Ευχαριστώ πάντως για τις απαντήσεις! 8)

Απάντηση

Επιστροφή στο “Flash γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες