Finde den Bug nicht... :/

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Sephka

Betreff: Finde den Bug nicht... :/

BeitragDi, Nov 30, 2010 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe in meinem Code neuerdings eingebaut das die Map gesrcollt wird.Dadurch wird dei Map nicht richtig gezecihnet oder ich hab nen andren Fehler gemacht,da ich erst neu Angefangen hab mit BMAX erbitte ich eure Hilfe Wink .
CODE:
Code: [AUSKLAPPEN]
'2D World
Graphics 1024,768
SeedRnd MilliSecs()
'ARRAY
 Global WH:Int=100 , WW:Int=100
Global World:Int[WH,WW]
For a=0 To WH 
 For b=0 To WW
 World[a,b]=Rand(0,1)
 Next
Next

'SPIELER VARS
Global PX:Int=90,PY:Int=90
Global PPY:Int=90,PPX:Int=90
Global SX:Int,Sy:Int
Global Range=20
Global Move:Int=0

'MAUS VARS
Global MX:Int,MY:Int

'FPS VARS
Global time#,oldtime#,FPS#

'##############################################
If World[PX/30+SX,PY/30+SY]=1 Then World[PX/30+SX,PY/30+SY]=0
'LOOP
While Not KeyHit(Key_L)
DrawText FPS,1,1

'STEUERUNG
If KeyHit(Key_W) And Move=0 Then Move=1;PPY=PY-30;PPX=PX
If KeyHit(Key_S) And Move=0 Then Move=2;PPY=PY+30;PPX=PX
If KeyHit(Key_A) And Move=0 Then Move=3;PPX=PX-30;PPY=PY
If KeyHit(Key_D) And Move=0 Then Move=4;PPX=PX+30;PPY=PY
If World[PPX/30+SX,PPY/30+SY]=1 Then Move=0;DebugLog "WAND"


 'MAUS
  MX=Int(MouseX()/30*30)
  MY=Int(MouseY()/30*30)
 If MouseDown(2) Then World(MX/30+SX,MY/30+SY)=0
 If MouseDown(1) Then World(MX/30+SX,MY/30+SY)=1
'RäNDER SIND NICHT BEGEHBAR:
'If PX<30 Then PX=30;Move=0
'If PX>WH*10-30 Then PX=WW*10-30;Move=0
'If PY<30 Then PY=30;Move=0
'If PY>WW*10-30 Then PY=WW*10-30;Move=0
'SCROOlVARIABLEN AKTUALISIEREN
 


'FLÜSSIGES LAUFEN
If Move=1 Then
PY:-3
If PY=PPY Then Move=0;SY:-1
End If

If Move=2  Then
PY:+3
If PY=PPY Then Move=0;SY:+1
End If

If Move=3 Then
PX:-3
If PX=PPX Then Move=0;SX:-1
End If

If Move=4 Then
PX:+3
If PX=PPX Then Move=0;SX:+1
End If 
'#########################
'ZEICHNEN
DrawWorld()
SetColor 255,20,40;DrawRect PX-SX*30,PY-SY*30,30,30;SetColor 255,255,255'PLAYER


DrawRect MX,MY,30,30

Flip
Cls

'FPS
 time# = MilliSecs()
  If time# - oldtime# <> 0 Then FPS# = Int(1000 / (time# - oldtime#))
  If FPS# = 0 Then FPS# = 1
  oldtime# = MilliSecs()
'#########################
Wend













Function DrawWorld()

Local Draw=True

For a=Int(PX/30)-Range To Int(PX/30)+Range
 For b=Int(PY/30)-Range To Int(PY/30)+Range

  Select world[a+SX,b+SY]
   Case 0
    Draw=False
   Case 1
    SetColor 255,255,2
    Draw=True
  End Select

  If Draw = True DrawRect a*30,b*30,30,30'Zeichnen wenn Block existiert

 Next
Next

End Function 
Mein Freund und Helfer:
Win7 Home Premium SP1
AMD Athlon II X4 645 3.1GHZ
8GB Ram
64bit

ToeB

BeitragDi, Nov 30, 2010 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also grob drübergeuckt hast du 2 Fehler gemacht (Denklfehler)

1. : Arrays die du z.Bl. auf 100 Einheiten erstellst, können nur mit dem Index von 0-99 aufgerufen werden, also :
Code: [AUSKLAPPEN]
Local array:int[100]
For Local i:int = 0 to 99
    array[ i ] = i*2
Next


Wenn du von 0 bis 100 machst würde es ja heißen das du 101 elemente Hast und nicht wie von dir angegeben 100.

2. : Du möchtest nur den ausschnitt der Tilemap zeichnen den man auch sieht. Das für sich genommen ist schonmal ein guter ansatz, aber falsch umgesetzt (meiner meinung nach). Entweder du musst die Playerposition und die daraus resoltierenden X/Y/W/H Koordinaten des Spielfeldes errechnen (dann aber in einzellschritten und nicht in dert For/Next schleife), bietet dir aber nicht viel Spielraum, besser wäre es, mit der For/Next schleife alle Felder durchzugehen und anhand der Scroll koordinaten (Scroll und Spieler Koordinaten würde ich AUF JEDEN FALL GETRENNT behandeln ! ) kannst du mit ein paar If Abfragen noch schnell prüfen ob das Tile zu sehen ist, wenn ja, malen.

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!

BladeRunner

Moderator

BeitragDi, Nov 30, 2010 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum sollte er alle Felder durchgehen wenn er berechnen kann von wo bis wo er einzeichnen muss? Das ist doch blanke Verschwendung von Rechenzeit.
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

Sephka

BeitragDo, Dez 02, 2010 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Klappt trotzdem nicht (hab 1.Fehler behoben)
Mein Freund und Helfer:
Win7 Home Premium SP1
AMD Athlon II X4 645 3.1GHZ
8GB Ram
64bit

grafe

BeitragDo, Dez 02, 2010 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Sephka

du solltest bei einem Array nicht in den Negativ bereich kommen
folgende Zeilen:
BlitzMax: [AUSKLAPPEN]
For a=Int(PX/30)-Range To Int(PX/30)+Range 
For b=Int(PY/30)-Range To Int(PY/30)+Range

wie du wahrscheinlich merkst prüft er hier world[-17,-17]

darum noch schnell eine abfrage rein die eigentlich selbsterklärend ist:
BlitzMax: [AUSKLAPPEN]
Function DrawWorld() 

Local Draw=True

For a=Int(PX/30)-Range To Int(PX/30)+Range
For b=Int(PY/30)-Range To Int(PY/30)+Range

If a=>0 And b=>0 And a<WH And b<WW '<<----------------------Abfrage das man nicht unter null oder über's Maximum gerät!
Select world[a+SX,b+SY]
Case 0
Draw=False
Case 1
SetColor 255,255,2
Draw=True
End Select

If Draw = True DrawRect a*30,b*30,30,30'Zeichnen wenn Block existiert
EndIf
Next
Next

End Function


mfg grafe

Sephka

BeitragSa, Dez 04, 2010 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht immer noch nicht Sad
Mein Freund und Helfer:
Win7 Home Premium SP1
AMD Athlon II X4 645 3.1GHZ
8GB Ram
64bit

Xeres

Moderator

BeitragSa, Dez 04, 2010 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehlermeldung? Code?
Wie oft muss man es sagen: Ohne Infos sind wir hier auch machtlos.
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)

mpmxyz

BeitragSa, Dez 04, 2010 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Sephka, überprüfe am Besten auch die gegebenen Verbesserungen! (-> Traue niemandem! Wink)
Dann fällt nämlich auf, dass die Kontrollzeile so aussehen muss:
BlitzMax: [AUSKLAPPEN]
If a+SX=>0 And b+SY=>0 And a+SX<WH And b+SY<WW

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Sephka

BeitragMi, Dez 15, 2010 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier der Code....
Geht leider immer noch nicht Embarassed :Ich kann durch gelbe Blöcke gehen oder nicht über schwarz....
Code: [AUSKLAPPEN]
'2D World
Graphics 1024,768
SeedRnd MilliSecs()
'ARRAY
 Global WH:Int=100 , WW:Int=100
Global World:Int[WH,WW]
For a=0 To WH-1
 For b=0 To WW-1
 World[a,b]=Rand(0,1)
 Next
Next

'SPIELER VARS
Global PX:Int=90,PY:Int=90
Global PPY:Int=90,PPX:Int=90
Global SX:Int,Sy:Int
Global Range=20
Global Move:Int=0

'MAUS VARS
Global MX:Int,MY:Int

'FPS VARS
Global time#,oldtime#,FPS#

'##############################################
If World[PX/30+SX,PY/30+SY]=1 Then World[PX/30+SX,PY/30+SY]=0
'LOOP
While Not KeyHit(Key_L)
DrawText FPS,1,1

'STEUERUNG
If KeyHit(Key_W) And Move=0 Then Move=1;PPY=PY-30;PPX=PX
If KeyHit(Key_S) And Move=0 Then Move=2;PPY=PY+30;PPX=PX
If KeyHit(Key_A) And Move=0 Then Move=3;PPX=PX-30;PPY=PY
If KeyHit(Key_D) And Move=0 Then Move=4;PPX=PX+30;PPY=PY
If World[PPX/30+SX,PPY/30+SY]=1 Then Move=0;DebugLog "WAND"


 'MAUS
  MX=Int(MouseX()/30*30)
  MY=Int(MouseY()/30*30)
 If MouseDown(2) Then World(MX/30+SX,MY/30+SY)=0
 If MouseDown(1) Then World(MX/30+SX,MY/30+SY)=1
'RäNDER SIND NICHT BEGEHBAR:
'If PX<30 Then PX=30;Move=0
'If PX>WH*10-30 Then PX=WW*10-30;Move=0
'If PY<30 Then PY=30;Move=0
'If PY>WW*10-30 Then PY=WW*10-30;Move=0
'SCROOlVARIABLEN AKTUALISIEREN
 


'FLÜSSIGES LAUFEN
If Move=1 Then
PY:-3
If PY=PPY Then Move=0;SY:-1
End If

If Move=2  Then
PY:+3
If PY=PPY Then Move=0;SY:+1
End If

If Move=3 Then
PX:-3
If PX=PPX Then Move=0;SX:-1
End If

If Move=4 Then
PX:+3
If PX=PPX Then Move=0;SX:+1
End If 
'#########################
'ZEICHNEN
DrawWorld()
SetColor 255,20,40;DrawRect PX-SX*30,PY-SY*30,30,30;SetColor 255,255,255'PLAYER


DrawRect MX,MY,30,30

Flip
Cls

'FPS
 time# = MilliSecs()
  If time# - oldtime# <> 0 Then FPS# = Int(1000 / (time# - oldtime#))
  If FPS# = 0 Then FPS# = 1
  oldtime# = MilliSecs()
'#########################
Wend













Function DrawWorld()

Local Draw=True

For a=Int(PX/30)-Range To Int(PX/30)+Range
 For b=Int(PY/30)-Range To Int(PY/30)+Range

If a+SX=>0 And b+SY=>0 And a+SX<WH And b+SY<WW'<<----------------------Abfrage das man nicht unter null oder über's Maximum gerät!
  Select world[a+SX,b+SY]
   Case 0
    Draw=False
   Case 1
    SetColor 255,255,2
    Draw=True
  End Select

  If Draw = True DrawRect a*30,b*30,30,30'Zeichnen wenn Block existiert
EndIf
 Next
Next

End Function
Mein Freund und Helfer:
Win7 Home Premium SP1
AMD Athlon II X4 645 3.1GHZ
8GB Ram
64bit

amon

BeitragMi, Dez 15, 2010 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
[x] Du willst SuperStrict verwenden um von der besseren Fehlerüberprüfung zu profitieren Smile

[x] Du willst uns mitteilen warum Du die Mauskoordinaten zuerst durch 30 dividierst um gleich wieder mit 30 zu multiplizieren

[ ] Du kennst den Unterschied zwischen einem Funktionsaufruf und den dem Verändern eines Wertes in einem Array (Funktionsaufruf mit Parametern x,y - World(x, y) <--> Element an Pos x,y setzen World[x,y] = 0


Ich glaub zwar noch immer nicht, dass dann das Programm das macht was du willst, aber nachdem die ganzen Fehler bezüglich Datentypen usw. raus sind, kannst du auch besser den eigentlichen Fehler suchen Razz

Sephka

BeitragDo, Dez 16, 2010 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Kommt ein Error("Compile Error Expression of type 'Int Array' cannot be invoked") bei
Code: [AUSKLAPPEN]

If MouseDown(2) Then World(MX/30+SX,MY/30+SY)=0
If MouseDown(1) Then World(MX/30+SX,MY/30+SY)=1

2.Fällt mir nicht mehr ein...
3.Wo hab ich das Falsch gemacht.....Ich weiß den Unterschied Surprised
Mein Freund und Helfer:
Win7 Home Premium SP1
AMD Athlon II X4 645 3.1GHZ
8GB Ram
64bit
 

undefined

BeitragDo, Dez 16, 2010 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Error("Compile Error Expression of type 'Int Array' cannot be invoked")

Falsche Klammern "()" bei "World" --> müssen "[]" sein. Die Fehlermeldung sagt Dir, dass Du versuchst, dass Int-Array "World" als Funktion aufzurufen. Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group