Dim-Felder

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen

 

sprime

BeitragSa, Jan 09, 2010 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
und konkret als code ?

BladeRunner

Moderator

BeitragSa, Jan 09, 2010 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Nix Konkret als Code. Wenn ich dir dein Spiel programmieren soll wirst Du mich dafür bezahlen müssen.
Sorry, aber Du postest in Allgemein, also muss ich annehmen dass Du die Grundlagen beherrschst und was Du fragst ist simpelste Mathematik.
Du musst nur die Spielerkoordinaten in Arraykoordinaten umwandeln, was extrem simpel ist wenn Du weist wie Groß deine Figur ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Midimaster

BeitragSa, Jan 09, 2010 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dann schreib doch mal kurz, wie du momentan die Kollision feststellst? und den code dazu.

Normalerweise macht man das ja so, dass man die Spielerpos kennt und da schno "ahnt" mit welchen Bananen es einen Zusammenstoß geben könnte. Dein Ansatz war da auch schon gut, wurde aber von vielen hier zerredet.

Die Aktuelle (Spielpos+16)/32 ergibt in welchen Feld du gerade stehst.


z.b.
Spieler ist bei 300,200

316/32=9
216/32= 6

dann steht der spieler etwa bei feld(9,6)

die zu testenden bananen wären dann in den Feldern.

links und rechts davon:
(9,5), (9,6) und (9,7)

darüber
(8,5), (8,6) und (8,7)

darunter:
(10,5), (10,6) und (109,7)



als for-Schleife

for y=y-1 to y+1
for i=x-1 to y+2
imagecollide testen
wenn ja dann
banane bei (i,j) verschwinden lassen
next
next


verstehst du den ansatz?
 

sprime

BeitragSa, Jan 09, 2010 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
den ansatz versteh ich, muss jetz nur noch versuchen das umzusetzen Wink

die kollision mit der banane ?

Midimaster

BeitragSa, Jan 09, 2010 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, wenn du immer so wenig von deinem code hier reinstellst, musst du es wohl alleine machen.

dann bis gleich....
 

sprime

BeitragSa, Jan 09, 2010 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
If banane((Player_pos_x +16) /32,(Player_pos_y +16) /32)>=1 Then ;banane is das dim-feld
banane((Player_pos_x +16) /32,(Player_pos_y +16) /32)=0
EndIf


das funktioniert nicht.. warum ?? ich habe es so gemacht, dass wenn die banane an der spielerpositition ist, bzw der spieler bei der banane, das dann die banane and er stelle wo der spieler ist = 0 ist (also verschwindet).. wo ist mein denkfehler ?

Midimaster

BeitragSa, Jan 09, 2010 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
nicht immer gleich übers funktionieren sprechen, erst mal sehen, ob der code funzt...

schreib mal keine so monsterzeilen, das hilft keinen außer dem fehlerteufel

also nochmal langsam:

schritt 1 aus Playerpos_X und -Y die FeldX und -Y des Player ausrechnen und gleich in zwei Variable merken

schritt 2 nicht nur die FeldX,FeldY-Banane checken, sondern auch die 9 anderen

Code: [AUSKLAPPEN]
0 0 0 0 0
0 1 1 1 0
0 1 P 1 0
0 1 1 1 0
0 0 0 0 0


...das eben mit der For-Schleife

schreib das mal ganz an das Ende des Codes:

BlitzBasic: [AUSKLAPPEN]

Function KollisionsCheck()
TestX=(Player_X+16)/32
TestY=(Player_Y+16)/32
For I=X-1 To X+1
For J=Y-1 To Y+1
TesteFeld I, J
Next
Next
End Function

Function TesteFeld(i% ,j%)
DebugLog " Teste Pos: " + i + "/" + j
DebugLog "Banane dort: " + Banane(i,j)
End Function


Das ist jetzt mal eine Funktion, die Du einfach so an der gewünschten Stelle deines Codes aufrufen kannst:

KollisionsCheck()

Die Funktion testet noch keine Collision, und kann auch noch keine Banane verschwinden lassen,aber sie zeigt im DEBUGGER, ob wir überhaupt die richtige Ecke des Spielfelds checken....
 

sprime

BeitragSa, Jan 09, 2010 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
hab jetz für die berechnung der dimfelder 2 variablen:

i = (player_pos_x + 16) /32

und

j= (player_pos_y + 16) /32

dann hab ich:

For i= i-1 To i+1
For j=j-1 To j+1

If munze(i,j)>=1 Then
munze(i,j)= 0

EndIf

Next
Next

die zwei funktionen funktionieren i.wie nicht, der sagt mir zu wenig parameter

Midimaster

BeitragSo, Jan 10, 2010 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
die zweite funktion nutzt du gar nicht direkt.


in der 1.funktion wird sie automatsich aufgerufen (siehe mein bespiel)

sie erwartet als "Parameter" zwei Werte: ein Feld-X und ein Feld-Y. Damit checkt sie, was auf dem Feld los ist.


Warum baust Du die funktionen nicht einfach so ein, wie sie gepostet habe?

So wie du es geschrieben hast, müßten die Bananen schon verschwinden. Kannst Du das beobachten? Wird der Bildschirm wirklich wieder neu aufgebaut?

Hast Du dazu schon mein Tutorial "Spiel-Ablauf" Lektion I -IV gelesen?


Was ist jetzt wieder munze()?
  • Zuletzt bearbeitet von Midimaster am So, Jan 10, 2010 0:18, insgesamt einmal bearbeitet
 

sprime

BeitragSo, Jan 10, 2010 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@ das tutorial hab ich noch nicht gelesen

@ munze, da mein ich banane mit, hab ich mich vrschrieben xD

Midimaster

BeitragSo, Jan 10, 2010 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ob munze() oder banane() ist ja egal, später machen eh bloß die bilder das Spiel zum einen oder anderen....

Ganz genau genommen müßte diese Variable wenn schon, dann Feld() heißen. Den das beschreibt sie eigentlich: ein Spielfeld auf dem GesamtBrett.

Dieses umbenennen hatte ich dir auch schon mal vorgeschlagen. Eigentlich hast Felder Feld(X,Y) auf denen nix=0 liegt feld(Y,Y)=0 oder eine Banane=1 liegt: Feld(x,y)=BANANE, oder eine MÜNZE=2, oder ....

verstehst du?
DIM Feld%(35,16)
NIX=0
BANANE=1
MUNZE=2



Jetzt mal was zur IMAGECOLLIDE

von den 9 möglichen Felder prüfen wir, ob dort bei Feld (i,J) überhaupt eine Banane ist

IF Feld(i,j)=BANANE

Wenn ja, prüfen wir, ob das Bild, das dort (i*32,j*32) gemalt ist, mit dem Bild des Spielers auf Spieler_X, Spieler_Y ist Überschneidungen hat:

IF ImageCollide BananeBild, i*32, j*32, 0, PlayerBild, Player_x, Player_Y, 0)

Wenn ja setzen wir das Feld (i,j) auf 0

Feld(i,j)=NIX

Jamagin

BeitragSo, Jan 10, 2010 9:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kann doch nicht so schwer sein! Midimaster sagt eh schon wie's geht! Tja, die Umsetzung mußt du schon selbst machen sonst siehe Beitrag BladeRunner!!

Ich hab eine Funktion in meinem Spiel wo man Goodies einsammelt und hab das auch mit DIM und mit TYPES erstellt. Außerdem wenn ich was auf Kollision prüfe, warum sollte ich checken ob in den umherliegenden Feldern was drin ist?? Wenn eine Banane dort liegt, wird die Funktion sowieso abgearbeitet, wenn keine dort liegt ist der Wert sowieso Null, da ja bei der Kollisionsprüfung die Banane aus der Liste gelöscht wird.

Also, Das Spielfeld in DIM feld(x,y) und die Banane als Type-List. Somit wären deine Probleme gelöst. Viel. stell ich meine Funktion rein...


lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Gehe zu Seite Zurück  1, 2, 3

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group