player bewegt sich nicht, warum?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bobbleboy

Betreff: player bewegt sich nicht, warum?

BeitragFr, Jul 23, 2010 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
herrgott die funktionen
player bewegt sich nicht, warum?
Code: [AUSKLAPPEN]
;Tilemap versuch
AppTitle ("Tile map")
;___________Einstellungen
grax= 1024
gray= 768
timer = CreateTimer(60)
Graphics grax,gray,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
;___________bilder und sounds laden
Global tile1 = LoadImage ("tile1.bmp")
;Global tile2 = LoadImage ("tile2.bmp")
Global playerbild = LoadImage("player.bmp")
;___________Karte lesen
Dim map (10,10)
playerx=1
playery=1
Restore mapdata   
   For y=0 To 9      
      For x=0 To 9
         Read map(x,y)
      Next
   Next
;___________H A U P T S C H L E I F E
While Not KeyDown(1)
Cls
drawmap()
moveplayer(playerx,playery)
drawplayer(playerx,playery)
WaitTimer timer
Wend
End
;___________Functions
Function drawplayer(x,y)
   DrawImage playerbild , x*32 , y*32
End Function

Function drawmap()
   For y=0 To 9
      For x=0 To 9
         If map(x,y) = 1
            DrawImage tile1 , x*32 , y*32
         End If
      Next
   Next
End Function
Function moveplayer(x,y)
   
   If KeyDown(200) Or KeyDown(17);nach oben
         y=y-1
   End If
   If KeyDown(208) Or KeyDown(31);nach unten
         y=y+1
   End If
   If KeyDown(203) Or KeyDown(30);nach links
         x=x-1
   End If
   If KeyDown(205) Or KeyDown(32);nach rechts
         x=x+1
   End If
   ;Return
End Function
;___________die karte
.mapdata
Data 1,1,1,1,1,1,1,1,1,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,1,1,0,0,0,0,0,1
Data 1,0,0,1,0,0,0,0,0,1
Data 1,0,0,0,1,0,1,0,0,1
Data 1,0,0,0,0,0,0,1,1,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,1,1

Xeres

Moderator

BeitragFr, Jul 23, 2010 1:04
Antworten mit Zitat
Benutzer-Profile anzeigen
In den Funktionen sind x, y lokale Variablen die am ende der Funktion verfallen.
Arrow Global
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)

Pummelie

BeitragFr, Jul 23, 2010 1:04
Antworten mit Zitat
Benutzer-Profile anzeigen
flip fehlt
It's done when it's done.
 

Bobbleboy

BeitragFr, Jul 23, 2010 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
In den Funktionen sind x, y lokale Variablen die am ende der Funktion verfallen.
Arrow Global


ist es möglich, das x und y zurückgeben werden, ohne das ich sie global definiere?

ich will später diese funktion extern abspeichern und bei einem anderem projekt aufrufen können. bzw ich fühle mich besser, wenn die funktion auch "alleine" funktioniert.

edit: flip hat wirklich gefehlt, aber player steht immernoch

ToeB

BeitragFr, Jul 23, 2010 1:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein... kannst aber die Globale mit in deine Externe datei reinschreiben, also
Code: [AUSKLAPPEN]
Global x,y
Function MovePlayer()
;Dann hier mit den Tasten x und y ändern
end Function


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xeres

Moderator

BeitragFr, Jul 23, 2010 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Da BB keine Pointer anbietet wohl nicht ohne Umwege, die man sich mit zwei Globalen sparen könnte.
Du könntest den Spieler natürlich als Type erstellen und diesen in die Funktion einspeisen - wär wohl am einfachsten und sinnigsten.
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)
 

Bobbleboy

BeitragFr, Jul 23, 2010 1:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Da BB keine Pointer anbietet wohl nicht ohne Umwege, die man sich mit zwei Globalen sparen könnte.
Du könntest den Spieler natürlich als Type erstellen und diesen in die Funktion einspeisen - wär wohl am einfachsten und sinnigsten.


okay bis gleich

edit:
herrgott ich hasse funktionen
Code: [AUSKLAPPEN]
;Tilemap versuch
AppTitle ("Tile map")
;___________Einstellungen
grax= 1024
gray= 768
timer = CreateTimer(60)
Graphics grax,gray,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
;___________bilder und sounds laden
Global tile1 = LoadImage ("tile1.bmp")
;Global tile2 = LoadImage ("tile2.bmp")
Global playerbild = LoadImage("player.bmp")
;___________Karte lesen
Dim map (10,10)
Restore mapdata   
For y=0 To 9      
   For x=0 To 9
      Read map(x,y)
   Next
Next
;___________PLayer spawn
a.player = New player
a\bild = playerbild
a\x=1
a\y=1
a\s=1 ;s für speed
;___________H A U P T S C H L E I F E
While Not KeyDown(1)
Cls
drawmap()
moveplayer(a\x,a\y)
drawplayer(a\x,a\y)
Flip 0
WaitTimer timer
Wend
End
;___________Types
Type player
Field x#
Field y#
Field s#
Field bild
End Type
;___________Functions
Function drawplayer(x,y)
   DrawImage playerbild , x*32 , y*32
End Function

Function drawmap()
   For y=0 To 9
      For x=0 To 9
         If map(x,y) = 1
            DrawImage tile1 , x*32 , y*32
         End If
      Next
   Next
End Function
Function moveplayer(x,y)
   If KeyDown(200) Or KeyDown(17);nach oben
         y=y-1
   End If
   If KeyDown(208) Or KeyDown(31);nach unten
         y=y+1
   End If
   If KeyDown(203) Or KeyDown(30);nach links
         x=x-1
   End If
   If KeyDown(205) Or KeyDown(32);nach rechts
         x=x+1
   End If
   a\x = x
   a\y = y
   Return a
End Function
;___________die karte
.mapdata
Data 1,1,1,1,1,1,1,1,1,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,1,1,0,0,0,0,0,1
Data 1,0,0,1,0,0,0,0,0,1
Data 1,0,0,0,1,0,1,0,0,1
Data 1,0,0,0,0,0,0,1,1,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,1,1


"Variable must be a type"

in der funktion moveplayer() in der das erste mal a\x vorkommt

Xeres

Moderator

BeitragFr, Jul 23, 2010 1:37
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Bitte zitiere nicht deine direkten vorposter
2. Bitte rücke deinen Code ein, damit du und wir ihn besser lesen können.
3. Übergebe das Objekt, nicht seine Felder:

Code: [AUSKLAPPEN]
Function moveplayer(p.player)
   If KeyDown(200) Or KeyDown(17);nach oben
      p\y=p\y-1
[...]
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)
 

Bobbleboy

BeitragFr, Jul 23, 2010 1:47
Antworten mit Zitat
Benutzer-Profile anzeigen
habe es jetzt wie folgt gelöst:
Code: [AUSKLAPPEN]
;Tilemap versuch
AppTitle ("Tile map")
;___________Einstellungen
grax= 1024
gray= 768
timer = CreateTimer(60)
Graphics grax,gray,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
;___________bilder und sounds laden
Global tile1 = LoadImage ("tile1.bmp")
;Global tile2 = LoadImage ("tile2.bmp")
Global playerbild = LoadImage("player.bmp")
;___________Karte lesen
Dim map (10,10)
Restore mapdata   
For y=0 To 9      
   For x=0 To 9
      Read map(x,y)
   Next
Next
;___________PLayer spawn
Global a.player = New player
a\bild = playerbild
a\x=1
a\y=1
a\s=1 ;s für speed
;___________H A U P T S C H L E I F E
While Not KeyDown(1)
   Cls
   drawmap()
   moveplayer(a\x,a\y)
   collision()
   drawplayer(a\x,a\y)
   Flip 0
   WaitTimer timer
Wend
End
;___________Types
Type player
Field x#
Field xalt#
Field y#
Field yalt#
Field s#
Field bild
End Type
;___________Functions
Function drawplayer(x,y)
   DrawImage playerbild , x*32 , y*32
End Function
Function drawmap()
   For y=0 To 9
      For x=0 To 9
         If map(x,y) = 1
            DrawImage tile1 , x*32 , y*32
         End If
      Next
   Next
End Function
Function moveplayer(x,y)
   a\xalt = x
   a\yalt = y
   If KeyHit(200) Or KeyHit(17);nach oben
         y=y-1
   End If
   If KeyHit(208) Or KeyHit(31);nach unten
         y=y+1
   End If
   If KeyHit(203) Or KeyHit(30);nach links
         x=x-1
   End If
   If KeyHit(205) Or KeyHit(32);nach rechts
         x=x+1
   End If
   a\x = x
   a\y = y
End Function
Function collision()
   If map(a\x,a\y) = 1
      a\x = a\xalt
      a\y = a\yalt
   End If
End Function
;___________die karte
.mapdata
Data 1,1,1,1,1,1,1,1,1,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,0,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,0,1,1,0,0,0,0,0,1
Data 1,0,0,1,0,0,0,0,0,1
Data 1,0,0,0,1,0,1,0,0,1
Data 1,0,0,0,0,0,0,1,1,1
Data 1,0,0,0,0,0,0,0,0,1
Data 1,1,1,1,1,1,1,1,1,1


ist daran etwas unschön gelöst?

im prinzip habe ich einfach a.player global gemacht, aber ich bin für verbesserungen offen Very Happy

Xeres

Moderator

BeitragFr, Jul 23, 2010 1:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest...
- Alle Variablen deklarieren
- Aussagekräftige Variablennamen verwende:
Code: [AUSKLAPPEN]
Local player.Tplayer = New Tplayer

Wenn du den player Global deklarierst, macht es wenig Sinn, ihn an die Funktion zu übergeben...
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)

ToeB

BeitragFr, Jul 23, 2010 2:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Und ich finde das trotzdem unsinnig, extra einen Type zu Diffinieren, bei dem von vornherein klar ist, das es nur einen Eintrag geben wird. Mach es lieber mit den Globalen, ist erstens die Schönere Lösung und zweitens weniger code..

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Noobody

BeitragFr, Jul 23, 2010 6:58
Antworten mit Zitat
Benutzer-Profile anzeigen
An sich ist ein Type schon sinnvoll. Types werden nicht nur dort angewendet, wo es mehrere Vorkommnisse von etwas geben wird, sondern auch da, wo man mehrere Variablen in einem griffigen Namen zusammenfassen will.

Für alle Spielervariablen nun Globale zu benutzen erscheint mir schon sehr unschön. Das umfasst ja nicht nur Werte wie X und Y, sondern später auch noch Lebenspunkte, Munition, Timer, Score, Geschwindigkeit, Items etc. etc. Diese Variablen dann alle im globalen Namensraum umherschwirren zu lassen schreit nach irgendwelchen Komplikationen, da man dann plötzlich mal eine Globale definiert, die man schon lokal in einer Funktion verwendet.

Und so nebenbei, wenn man alle Funktionen auf einen Spielertype ausrichtet, kann man auch ohne weiteres einen Mehrspielermodus einbauen Wink Obwohl das hier ja wohl kaum das Ziel ist.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Blitzjockey

BeitragFr, Jul 23, 2010 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Bobbleboy hat Folgendes geschrieben:
habe es jetzt wie folgt gelöst:
Code: [AUSKLAPPEN]
;
Global a.player = New player
a\bild = playerbild
a\x=1
a\y=1
a\s=1 ;s für speed
;___________H A U P T S C H L E I F E
While Not KeyDown(1)
   Cls
   drawmap()
   moveplayer(a\x,a\y)
   collision()
   drawplayer(a\x,a\y)
   Flip 0
   WaitTimer timer
Wend
End
;___________Types
Type player
Field x#
Field xalt#
Field y#
Field yalt#
Field s#
Field bild
End Type
;___________Functions

Function moveplayer(x,y)
   a\xalt = x
   a\yalt = y
   If KeyHit(200) Or KeyHit(17);nach oben
         y=y-1
   End If
   If KeyHit(208) Or KeyHit(31);nach unten
         y=y+1
   End If
   If KeyHit(203) Or KeyHit(30);nach links
         x=x-1
   End If
   If KeyHit(205) Or KeyHit(32);nach rechts
         x=x+1
   End If
   a\x = x
   a\y = y
End Function



Was Xeres meint, um es schöner zu machen, ist Player nicht Global zu schreiben. Dann hast Du von den Types ja kaum noch das vorteil.

Schöner wäre es, wenn Du Player "normal" als local bevor/in der Hauptschleife deklarierst.
Anschliessend nicht jede einzenle Wert aus der Player-Type rüberschickst, sondern nur der Typ ansich:

BlitzBasic: [AUSKLAPPEN]

Local a.player = New player
a\bild = playerbild
a\x=1
a\y=1
a\s=1 ;s für speed
;___________H A U P T S C H L E I F E
While Not KeyDown(1)
Cls
moveplayer(a)
Flip 0
WaitTimer timer
Wend
End
;___________Types
Type player
Field x#
Field xalt#
Field y#
Field yalt#
Field s#
Field bild
End Type

Hier habe ich Player als local deklariert, und in der Funktion nur noch als "a" übergeben, anstatt jede wert einzelne.
Damit kannst Du später der "move"-funktion für mehrere Objekten benutzen, ohne nach zu fragen zu müssen wer gemeint ist. Der Funktion bearbeitet immer denn, der gerade in der Funktionsaufruf genannt wird.
Ansonsten (weil es sich nur um ein Beispiel handelt) habe ich noch ein bisschen geschnitten.


BlitzBasic: [AUSKLAPPEN]

;___________Functions

Function moveplayer(a.player)
a\xalt = a\x
a\yalt = a\y
If KeyHit(200) Or KeyHit(17);nach oben
a\y = a\y-1
End If

If KeyHit(208) Or KeyHit(31);nach unten
a\y = a\y+1
End If

If KeyHit(203) Or KeyHit(30);nach links
a\x = a\x-1
End If

If KeyHit(205) Or KeyHit(32);nach rechts
a\x = a\x+1
End If

End Function

Der Funktionsdefinition ist jetzt geändert. Hier wird nicht mehr x und y "MovePlayer(x, y)" übergeben, sondern nur noch der Name vom genannte Objekt. "MovePlayer(a)"
Du könntest auch den "a" innerhalb diese Funktion durch etwas anderes ersetzen, um das unterschiedt deutlicher zu machen.
Innerhalb diese Funktion habe ich "x" und "y" durch "a\x" und "a\y" ersetzt. Damit brauchst Du am ende nicht jede Wert in der Funktion zu überschreiben.
Das vorteil, wie gesagt, ist das man diese Funktion (oder, vielleicht besseres beispiel, Deine Draw-Funktion) nun für alle Objekten benutzen kannst, ohne schwierigkeiten zu bekommen.

Wenn Du später die "Inhalt" des Player-Types erweiterst (leben, waffen, kleidung, usw) dann brauchst Du trotzdem immer nur "a" zu übergeben, der Funktion weisst dan genug. (Wie Noobody schon erwähnt hat)

BladeRunner

Moderator

BeitragFr, Jul 23, 2010 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ToeB hat Folgendes geschrieben:
Und ich finde das trotzdem unsinnig, extra einen Type zu Diffinieren, bei dem von vornherein klar ist, das es nur einen Eintrag geben wird. Mach es lieber mit den Globalen, ist erstens die Schönere Lösung und zweitens weniger code..

mfg ToeB

Setzen 6!

Was Du als unsinnig empfindest ist die deutlich saubere und elegantere Lösung, wie Noobody ja schon ausführte. Ein Type ist mit wenigen Zeilen Code drinne und erhält später massiv die Ordnung im Code.
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group