ImagesCollide Bug
Übersicht

BlackNetrunnerBetreff: ImagesCollide Bug |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi Leutz!
So ich hab da nen nettes kleines Proggy gecodet. Das Programm bewirkt das wenn ein Bild mit einem Anderen kollidiert dass dann das eine Bild "abgestossen" wird, bzw ist es in meinem RPG dazu gut um Pixelgenau um Objekte herumzulaufen ohne durchzulaufen. In meinem Falle verwende ich aber KEIN Dim wie man normalerweise in den meissten 2D RPGs verwendet. Aber seht selbst was ich meine an einem Code Beispiel: Code: [AUSKLAPPEN] Graphics 640,480,16 Global berg =LoadImage("berg.png") MaskImage berg ,255,0,255 Global player =LoadImage("player.png") MaskImage player ,255,0,255 Global grass =LoadImage("grass.png") MaskImage grass ,255,0,255 Global map_pos_x Global map_pos_y Global map_pos_x_old Global map_pos_y_old Global frametimer =CreateTimer(30) SetBuffer BackBuffer() Repeat ;draw_map TileBlock grass ,map_pos_x,map_pos_y DrawImage berg ,map_pos_x,map_pos_y DrawImage berg ,map_pos_x,map_pos_y ;draw_player DrawImage player ,320,240 ;player_move If KeyDown(200) Then ;up map_pos_y = map_pos_y + 2 map_pos_y_old = map_pos_y - 2 EndIf If KeyDown(208) Then ;down map_pos_y = map_pos_y - 2 map_pos_y_old = map_pos_y + 2 EndIf If KeyDown(205) Then ;right map_pos_x = map_pos_x - 2 map_pos_x_old = map_pos_x + 2 EndIf If KeyDown(203) Then ;left map_pos_x = map_pos_x + 2 map_pos_x_old = map_pos_x - 2 EndIf ;collide_with_berg If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then map_pos_x = map_pos_x_old map_pos_y = map_pos_y_old EndIf Flip WaitTimer (frametimer) Until KeyHit(1) Und so sieht das dann aus: ![]() Und jetzt kann man mit den Pfeiltasten um den Berg herumlaufen. Ohne durch ihn durchzugehen ![]() Tja das dachte ich zumindest aber da hat sich ein Bug eingeschlichen Nämlich wenn man jetzt mahl an die Linke Seite des Berges geht ![]() Und dort nun die Linke die Mitlere und die Rechte Pfeiltaste gleichzeitig drückt bewegt sich das Mänchen einfach durch den berg hindurch und das war eigendlich nicht so gedacht ![]() ![]() Wer kann helfen? Ich denke mal durch einen zusatz Code könnte man diesen Fehler beseitigen. Aber da hab ich kein Plan mehr, das was ich probiert habe funzt nicht. Wers testen will kan einfach irgendwelche Pix verwenden. Wer Rechtschreibfehler findet darf sie sich salzen und braten ![]() |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
mach das mit deinen map_x_old anders!
speicher die nach der kollisionsabfrage einfach so: map_x_old_pos=map_x_pos usw...dann sollte es eigentlich funtzen! |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Besser ist es diese Zeilen direkt vor den Tastenabfrage-Block zu setzten!
da dort noch keine Kollision stattfand! Problematisch wird das erst wenn sich auch die Glocke bewegt! |
||
[BB2D | BB3D | BB+]
|
BlackNetrunner |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
meinst du das so:
Code: [AUSKLAPPEN] ;collide_with_berg If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then map_pos_x = map_pos_x_old map_pos_y = map_pos_y_old EndIf ;player_move If KeyDown(200) Then ;up map_pos_y = map_pos_y + 2 map_pos_y_old = map_pos_y - 2 EndIf If KeyDown(208) Then ;down map_pos_y = map_pos_y - 2 map_pos_y_old = map_pos_y + 2 EndIf If KeyDown(205) Then ;right map_pos_x = map_pos_x - 2 map_pos_x_old = map_pos_x + 2 EndIf If KeyDown(203) Then ;left map_pos_x = map_pos_x + 2 map_pos_x_old = map_pos_x - 2 EndIf Original: Code: [AUSKLAPPEN] ;player_move If KeyDown(200) Then ;up map_pos_y = map_pos_y + 2 map_pos_y_old = map_pos_y - 2 EndIf If KeyDown(208) Then ;down map_pos_y = map_pos_y - 2 map_pos_y_old = map_pos_y + 2 EndIf If KeyDown(205) Then ;right map_pos_x = map_pos_x - 2 map_pos_x_old = map_pos_x + 2 EndIf If KeyDown(203) Then ;left map_pos_x = map_pos_x + 2 map_pos_x_old = map_pos_x - 2 EndIf ;collide_with_berg If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then map_pos_x = map_pos_x_old map_pos_y = map_pos_y_old EndIf So funktioniert das erst recht nicht, da entsteht sogar noch nen kleiner Grafik Bug Und ausserdem ist das keine Glocke sondern ein Berg ![]() Probiert doch einfach mal selber: http://rapidshare.de/files/10798342/Cbug.zip.html Das Problem ist NUR vorhanden wenn ich 3 Tasten GLEICHZEITIG drücke unzwar die Linke die Mitlere UND die Rechte aufeinmahl. Und das passiert auch nur wenn sich die Figur an einer Schräge, die von Links unten nach Rechts oben verleuft, befindet. Das ist ein merkwürdiger Bug, testet doch bitte mal und kuckt euch den Code genau an. Ich kann mir vorstellen das ihr die Schnauze voll von Kollisions Topics habt, aber bitte nur dies eine mahl ![]() |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
also auf meine art klappts auch im original code super...
Code: [AUSKLAPPEN] Repeat ;draw_map TileBlock grass ,map_pos_x,map_pos_y DrawImage berg ,map_pos_x,map_pos_y DrawImage berg ,map_pos_x,map_pos_y ;draw_player DrawImage player ,320,240 ;player_move If KeyDown(200) Then ;up map_pos_y = map_pos_y + 2 EndIf If KeyDown(208) Then ;down map_pos_y = map_pos_y - 2 EndIf If KeyDown(205) Then ;right map_pos_x = map_pos_x - 2 EndIf If KeyDown(203) Then ;left map_pos_x = map_pos_x + 2 EndIf ;collide_with_berg If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then map_pos_x = map_pos_x_old map_pos_y = map_pos_y_old EndIf map_pos_x_old = map_pos_x map_pos_y_old = map_pos_y Flip WaitTimer (frametimer) Until KeyHit(1) |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
BlackNetrunner |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Manchmal hat man echt nen Brett vorm Kopf!
THX!!! ![]() |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Noch ein bisschen eleganter geht es mit Slidingkollision:
Code: [AUSKLAPPEN] ;Kollisionen If coll(x,y) Then If coll(x_old,y) Then y = y_old If coll(x,y_old) Then x = x_old EndIf Dadurch, dass die Achseln einzeln geprüft werden, kannst Du dann auch diagonal am Berg entlanglaufen und wirst nur in die Richtung gestoppt, in die es auch wirklich nicht weitergeht. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
was ist den coll für ein befehl??? | ||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
coll soll glaub ich ein array darstellen... | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ne, coll(x,y) soll denke ich eine Funktion sein, die für die übergegebene x und y Position des Männchens die Kollision überprüft! | ||
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle! Fraget euren Arzt oder Apotheker! |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
achos kann auch sein...wieso schreib er nich (wenn es eine funktion ist) die funktion drunter? | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jo, sorry sollte eine eigene Funktion sein:
Code: [AUSKLAPPEN] Function coll(x, y) . . ImagesCollide... . . End Function Spätestens wenn ein zweiter Berg dazukommt, wird er es so machen müssen... ![]() |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group