Funktion für Dim-Feld

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

MrColorkiller

Betreff: Funktion für Dim-Feld

BeitragMo, Okt 01, 2012 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

Ich bin neu hier, also verzeiht mir, wenn die Begriffe nicht ganz richtig da stehen.

Ich habe folgendes Problem:
Ich will, dass meine Figur auf der Plattform springt, die gezeichnet wird, wenn das Dim-Feld abgelesen wird.

Function:
Code: [AUSKLAPPEN]
Function tiles()


For y=1 To mapsy
   For x=1 To mapsx
      If readinfo = 1 Then Read array(x,y)
   
      If array(x,y) = 2 Then
            DrawImage(img_tile1,(x*50)-50,(y*50)-50)
         
      
      While ImagesCollide     (img_player1,plx,ply,0,img_tile1,(x*50)-50,(y*50)-50,0)
         yspeed=0
         ply=ply-gravitation#
      Wend

   
        EndIf
   
      
   Next
Next


readinfo = 0

End Function


mainloop:
Code: [AUSKLAPPEN]
SetBuffer BackBuffer()

Const gravitation#=0.55,jumpspeed#=10

 Repeat
 Cls

DrawImage img_player1,plx,ply

yspeed=yspeed+gravitation#
ply=ply+yspeed

tiles()


 If KeyHit(57) And yspeed=0 Then yspeed=-jumpspeed
 

 If KeyDown(203) plx=plx-5
 If KeyDown(205) plx=plx+5




 Flip

 Until KeyHit(1)


WaitKey


End


Das Problem ist, dass meine Figur zwar kurz auf der Plattform stehen bleibt, dann jedoch hindurch fällt.

Ich bedanke mich jetzt schon für eure Hilfe

mfg, Mrcolorkiller

Xeres

Moderator

BeitragMo, Okt 01, 2012 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Von oben an:
BlitzBasic: [AUSKLAPPEN]
If readinfo = 1 Then Read array(x,y)

Das würde ich aus der Schleife herausnehmen. Code wird mit der Zeit immer unübersichtlicher und Bedingungen die nur einmal ausgeführt werden, machen die Sache nicht besser. Ich würde das nach dem Laden der Medien einmal ausführen - passt auch besser, wenn du auf externe Level umstellst.

BlitzBasic: [AUSKLAPPEN]
While ImagesCollide (img_player1,plx,ply,0,img_tile1,(x*50)-50,(y*50)-50,0)
yspeed=0
ply=ply-gravitation#
Wend

Was du als erstes brauchst, ist eine Konstante (const)"Tilesize" oder so. Überall den Zahlenwert 50 zu ändern wird später mal sehr schmerzhaft.
Wenn eine Kollision stattfindet, bewegst du den Spieler? Da fehlt irgendwie ein not. Wenn das funktionieren würde, und der Spieler stehen bliebe, hingest du ja in einer Endlosschleife an der Stelle.
Und auch diese Kollisionsgeschichte sollte nichts in der Zeichenroutine zu suchen haben - man kann ja Tiles direkt ansprechen. Da jedes Tile mit dem Spieler auf Kollision zu prüfen bringt nur performance Verlust und ist nicht wirklich nötig.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

MrColorkiller

BeitragMo, Okt 01, 2012 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If readinfo = 1 Then Read array(x,y)

Zitat:
Das würde ich aus der Schleife herausnehmen.

wenn ich das aus der schleife herausnehme heisst es "out of data". deshalb habe ich es eigentlich reingetan.

was die whileschleife angeht: sollte ich die im mainloop vor der function tiles() oder danach platzieren?

Zu deiner Frage: Ich bewege den Spieler nicht und wo soll ich ein not hinsetzen?

Xeres

Moderator

BeitragMo, Okt 01, 2012 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst natürlich das Array einmal befüllen. Ansonsten: In welcher Zeile kommt der Fehler? Wie lädst du deine Karte?

Ich würde erst die Kollision abarbeiten und dann zeichnen.
Aus der Spielerposition kannst du ja die umgebenen Tiles berechnen. Wenn sich kein festes Tile unter dem Spieler befindet, lässt du ihn ein Stück fallen, ansonsten setzt du ihn auf das Bodenniveau (y position) des Tiles.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragMo, Okt 01, 2012 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehler liegt im Zurücknehmen der letzten Addition in der Kollision.

Hier hast Du richtig gedacht: Wenn der Spieler auf einem Tile zu stehen kommt, dann sollte sich sein Y-Wert nicht mehr ändern können und der letzte Schritt wird rückgängig gemacht.

Allerdings hattest Du zuvor yspeed# zu ply# addiert. Jetzt ziehst Du aber nur gravitation# ab!

Richtig wäre:
BlitzBasic: [AUSKLAPPEN]
While ImagesCollide     (img_player1,plx,ply,0,img_tile1,(x*50)-50,(y*50)-50,0)
ply=ply-yspeed
yspeed=0
Wend
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

MrColorkiller

BeitragMo, Okt 01, 2012 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kann ich es schreiben, dass das programm das array nur einmal befüllt?
 

MrColorkiller

BeitragMo, Okt 01, 2012 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster schrieb:
Zitat:
While ImagesCollide (img_player1,plx,ply,0,img_tile1,(x*50)-50,(y*50)-50,0)
ply=ply-yspeed
yspeed=0
Wend

wenn ich das mache hängt sich das programm aber auf. es befindet sich in einer endlosschleife

Midimaster

BeitragMo, Okt 01, 2012 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ohja!

jetzt versteh ich erst deinen code... dann vergiß erst mal meinen einwand, es muss dann an was anderem liegen!

sorry...

Frage:

Ist den ply# und yspeed# irgendwo als GLOBAL defniert?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragMo, Okt 01, 2012 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
MrColorkiller hat Folgendes geschrieben:
Wie kann ich es schreiben, dass das programm das array nur einmal befüllt?
Du weißt ja, welche Befehle dafür nötig sind, nicht? Bevor du die Hauptschleife startest, musst du nur einmal das Array durchgehen und in jedes Feld mir read einen Wert aus dem Data-feld einlesen.

Und bitte editiere Beiträge anstatt hintereinander zu posten, danke.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

MrColorkiller

BeitragMo, Okt 01, 2012 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ist den ply# und yspeed# irgendwo als GLOBAL defniert?


ply schon aber yspeed nicht

was ich auch noch komisch finde: wenn ich die While schleife aus der funktion rausnehme und in den mainloop setze fällt der spieler nur durch und hält gar nicht mehr an

Midimaster

BeitragMo, Okt 01, 2012 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich denke, es liegt an den fehlende GLOBALs für alle Variablen, die in der Funktion vorkommen:

Zitat:
img_tile1%
img_player1%
plx#
ply#
yspeed#
gravitation#
readinfo%


folgendes läuft bei mir fehlerfrei:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()

Global img_player1=CreateImage(40,40)
SetBuffer ImageBuffer(img_player1)
Color 255,0,0
Rect 0,0,40,40

Global img_tile1=CreateImage(40,40)
SetBuffer ImageBuffer(img_tile1)
Color 0,255,0
Rect 0,0,40,40
Global mapsy=16, mapsx=15, plx#,ply#,yspeed#

Dim Array(20,20)
For i%=0 To 20
Array(i,Rnd(5,10))=2
Next
SetBuffer BackBuffer()

Const gravitation#=0.55,jumpspeed#=10

Repeat
Cls

DrawImage img_player1,plx,ply

yspeed=yspeed+gravitation#
ply=ply+yspeed

tiles()


If KeyHit(57) And yspeed=0 Then yspeed=-jumpspeed


If KeyDown(203) plx=plx-5
If KeyDown(205) plx=plx+5




Flip 1

Until KeyHit(1)


WaitKey


End








Function tiles()


For y=1 To mapsy
For x=1 To mapsx
; If readinfo = 1 Then Read array(x,y)

If array(x,y) = 2 Then
DrawImage(img_tile1,(x*50)-50,(y*50)-50)

While ImagesCollide (img_player1,plx,ply,0,img_tile1,(x*50)-50,(y*50)-50,0)
DebugLog "Hallo"
yspeed=0
ply=ply-gravitation#
Wend


EndIf


Next
Next


readinfo = 0

End Function




Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

MrColorkiller

BeitragMo, Okt 01, 2012 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah endlich funktioniert es!!!

Danke viel viel mals Very Happy Very Happy

Ein echt gutes Forum

Addi

BeitragMo, Okt 01, 2012 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dir auserdem noch empfehlen RectsOverlap(...) anstatt ImagesCollide(...) zu benutzen, weil es einfach schneller ist.
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group