2016-04-24 9 views
1

Ich habe dieses kleine Spiel ähnlich wie flappy Vögel gemacht, wo man verwenden kann, um mit Maus und Tastatur auf und ab zu fliegen.Wie brich ich das Spiel, wenn Objekte auf Matlab kollidieren?

Ich werde nicht den vollständigen Code posten, weil es ein Universitätsprojekt ist und ich nicht für irgendein mögliches Plagiat erwischt werden möchte.

Was ich tat, war, benutzte ich zwei Objekte:

Ein Rechteck als Vogel:

r= rectangle('Position', pos, 'curvature', [0.99,0.1], 'FaceColor', 'r', 'EraseMode','xor'); 

Dicke Linien die Wände darstellen:

line([ 100 100], [10 400], 'color', 'm', 'LineWidth', 10, 'EraseMode', 'background') 

Mein Problem: 01 Das Problem ist, dass sich der Vogel durch die Wände bewegt, als ob die Wände transparent wären. Wie Sie sich vorstellen können, möchte ich das Spiel brechen und etwas wie "Spiel über" zeigen, wenn der Vogel die Wand trifft (nicht durch sie gehen). Wie mache ich es so, dass mein Spiel bricht, wenn der Vogel (Objekt 1) mit den Wänden (anderen Objekten) kollidiert?

Vielen Dank für das Lesen meiner Frage!

Antwort

2

Wenn Sie die Mapping Toolbox installiert haben, bietet sie eine Funktion polyxpoly, mit der Sie polylines schneiden können, so dass Sie den Schnittpunkt des ganzen Rechtecks ​​an jeder Wand finden können und Sie sich nicht um das Aufteilen jeder Kante kümmern müssen des Rechtecks.

Hier haben Sie ein voll funktionierendes Beispiel einer Kollision mit einer Wand:

% Bird (rectangle). 
% Position. 
xr = 30; 
yr = 100; 

% Length of rectangle edges. 
deltaxr = 10; 
deltayr = 10; 

% Vector for rectangle object. 
vr = [xr, yr, deltaxr, deltayr]; 

% Bird polyline. 
a = [xr, yr]; 
b = [xr + deltaxr, yr]; 
c = [xr + deltaxr, yr + deltayr]; 
d = [xr, yr + deltayr]; 
r = [a; b; c; d]; 

% Wall (line). 
% Wall polyline. 
l = [40 0; 40 105]; 

% Draw objects. 
r1 = rectangle('Position',vr,'LineWidth',2); 
line(l(:,1), l(:,2),'LineWidth',2,'Color','r'); 
axis equal; 

% Find intersections. 
[xi,yi] = polyxpoly(r(:,1),r(:,2),l(:,1),l(:,2)); 

% Are there any intersections? If so, GAME OVER. 
if ~isempty(xi) 
    % Stop the game and display GAME OVER. 
    text(xr-20,yr-20,'GAME OVER','Color','b','FontSize', 20); 
end 

Sie können mit verschiedenen Positionen des Vogels versuchen, die Kollisionserkennung zu testen:

Collision detection flappy bird

2

Sie sollten einen Schnittalgorithmus verwenden, um zu überprüfen, ob es einen Schnittpunkt einer der Wandlinien (überprüfen Sie es vier Mal) mit dem Rechteck gibt. Das Rechteck besteht grundsätzlich auch aus 4 Zeilen, dh Sie sollten die 4 Rechtecklinien gegen die vier Wandlinien überprüfen (wenn Sie einen Linien-Linien-Schnittalgorithmus verwenden).

z. Überprüfen Sie dieses Thema: How to find the intersection point between a line and a rectangle?

Es ist im Grunde eine einfache mathematische Gleichung zu lösen, siehe https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection.

Verwandte Themen