°GELÖST° "Die folgende Variable hat eine Structure: 'WT

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag von Mok »

Kaeru Gaman hat geschrieben:> If ExamineKeyboard() = 0 Or ExamineMouse() = 0
hier brauchst du keinen Rückgabewert prüfen.
du brauchst nur beide inits benutzen.
prüfen tust du dann die Rückgabewerte der Auswertungsfunktionen...
und wenn du die rückgaben von MouseX() und MouseY() schon zwischenspeicherst,
solltest du im Display auch die Variablen und nicht die Funktionen verwenden.
[Dummheit ein]Ich versteh einfach nicht's mehr[Dummheit aus]
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

boah :roll: /:->

Code: Alles auswählen

  If ExamineKeyboard() = 0 Or ExamineMouse() = 0 ;Eines der Beiden oder beides ist NULL (warum?)
    CloseScreen()
    MessageRequester("Info","Fehler!",0)
    End
  EndIf 
ist überflüssig.

Code: Alles auswählen

  ExamineKeyboard()
  ExamineMouse()
genügt.


und du hast

Code: Alles auswählen

MouseX = MouseX() : MouseY = MouseY() 
du packst also die Rückgaben der Prüffunktionen in Variablen.
also solltest du später, im DisplaySprite, die Variablen verwenden nicht die Funktionen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag von Mok »

Ja, ok, jetzt hab ich's verstanden, aber mich hauts na ca. einer halben Sekunde wieder raus, und PB motzt auch noch wegen dem StartDrawing() (eben weil der Screen nimmer aktiv ist)
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

na das ist ja schön für dich, dann bau halt keine Bugs ein! /:->
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag von Mok »

Kaeru Gaman hat geschrieben:na das ist ja schön für dich, dann bau halt keine Bugs ein! /:->
Na danke
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Mok hat geschrieben:
Kaeru Gaman hat geschrieben:na das ist ja schön für dich, dann bau halt keine Bugs ein! /:->
Na danke
zu deutsch: wenn du hilfe brauchst, frag konkret und poste code. ;)

ansonsten kann ich dir nur so helfen:

> aber mich hauts na ca. einer halben Sekunde wieder raus
dann stell den Raushau-Timer auf mehr als 500ms

> und PB motzt auch noch wegen dem StartDrawing() (eben weil der Screen nimmer aktiv ist)
dann nimm nen aktiven screen
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag von Mok »

War da der Erfinder der Stupidedia am Werk :mrgreen: "dann stell den Raushau-Timer auf mehr als 500ms"

Die Sache ist die: Normalerweise müsste die kurze Schleife doch laufen, tja, das tut sie auch, aber in der Schleife drin is das Problem: Examinekeyboard() und/oder ExamineMouse() liefern den Wert NULL (auch wenn das Code-Stück, wie du gesagt hast, umsonst war). Jedenfalls ist da irgend ein Hund drin, der den Screen wieder schließt.
Ich poste jetzt mal den kanzen Ko...Code bis zur Schleife:

Code: Alles auswählen

;-Initialisierung:
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  MessageBox_(#Null,"Eine oder mehrere Libraries für das Programm"+Chr(13)+"Aimer v1.00 konnten nicht initialisiert werden!"+Chr(13)+"Neuinstallation des Programmes könnte das Problem beheben.","Fehler beim Initialisieren",#MB_OK | #MB_ICONSTOP)
  End
EndIf

;KONSTANTEN
#NoAction = 0
#Released = 1
#Clicked  = 2
#Dragged  = 3

Define MLB.l    ; Mouse Left Button
Define MRB.l    ; Mouse Right Button 

;VARIABLEN
Global rand_backgrnd.b
Global released
Global MouseX, MouseY
Global ZielX, ZielY
Global speed
Global Console, Cheat ;Die kommen dann nachher zum Einsatz
Global WType.s
Global ChosenGun

WType.s = ""
Cheat = #False
ShotsLeft = Magazine
speed = 1

;-STRUKTUREN
Structure Weapons
  Name.s
  Magazine.b
  ShootSound.s
  DrySound.s
  MuniSprite.s
  TickShot.b
  TickDry.b
  TickReload.b
EndStructure



Select ProgramParameter()
  Case "/SETTINGS"
    If RunProgram("startmgr.exe")
      End
    Else
      MessageBox_(#Null,"startmgr.exe kann nicht gefunden werden!"+Chr(10)+"Neuinstallation könnte den Fehler beheben","Fehler",#MB_OK | #MB_ICONERROR | #MB_DEFBUTTON1)
      End
    EndIf
  Case "/CONSOLE"
    Console = #True ;ebenfalls für nachher
EndSelect
    
;-Vorbereitung:
If OpenPreferences("settings.prefs")
  width = Val(ReadPreferenceString("ScreenWidth","1024"))
  height = Val(ReadPreferenceString("ScreenHeight","768"))
  depth = Val(ReadPreferenceString("Depth","32"))
Else
  MessageBox_(#Null,"settings.prefs kann nicht gefunden werden!"+Chr(10)+"Neuinstallation könnte den Fehler beheben","Fehler",#MB_OK | #MB_ICONERROR | #MB_DEFBUTTON1)
  End
EndIf
If OpenScreen(width,height,depth,"Aimer v1.00") = 0
  MessageBox_(#Null,"Es konnte kein "+Str(width)+"x"+Str(height)+"x"+Str(depth)+" Bildschirm erstellt werden!","Fehler",#MB_OK | #MB_ICONERROR | #MB_DEFBUTTON1)
  End
EndIf

rand_backgrnd = Random(3)
rand_backgrnd = rand_backgrnd + 1

fontID = LoadFont(100,"Arial",12,#PB_Font_Bold)

Global Dim Guns.Weapons(2)

;PUMPGUN SETTINGS
Guns(0)\Name = "Pump"
Guns(0)\Magazine = 8
Guns(0)\TickShot = 10
Guns(0)\TickDry = 2
Guns(0)\TickReload = 17

;AK74 SETTINGS
Guns(1)\Name = "AK74"
Guns(1)\Magazine = 30
Guns(1)\TickShot = 2
Guns(1)\TickDry = 3
Guns(1)\TickReload = 23

;GLOCK 19 SETTINGS
Guns(2)\Name = "Glock"
Guns(2)\Magazine = 30
Guns(2)\TickShot = 7
Guns(2)\TickDry = 3
Guns(2)\TickReload = 10 

LoadSprite(1,"data\gfx\ak74thm.bmp");
  TransparentSpriteColor(1,RGB(255,0,255));
LoadSprite(2,"data\gfx\glock19thm.bmp");
  TransparentSpriteColor(2,RGB(255,0,255));
LoadSprite(3,"data\gfx\ak74thm.bmp");
  TransparentSpriteColor(3,RGB(255,0,255));
LoadSprite(012,"data\gfx\mouse.bmp")
  TransparentSpriteColor(012,RGB(255,0,255));
cont = 0
;Problemschleife:
Repeat
  
  ExamineKeyboard()
  ExamineMouse()
  
  MouseX = MouseX() : MouseY = MouseY()
  
  DisplayTransparentSprite(1,0,0);
  DisplayTransparentSprite(2,500,200);
  DisplayTransparentSprite(3,800,400);
  DisplayTransparentSprite(012,MouseX,MouseY);
  
  If MouseButton(#PB_MouseButton_Left)
    WType.s = "ak74"
    ChosenGun = 0
    cont = 1
  EndIf
  
  If MouseButton(#PB_MouseButton_Right)
    WType.s = "glock"
    ChosenGun = 2
    cont = 1
  EndIf
  
  If MouseButton(#PB_MouseButton_Middle)
    WType.s = "pump"
    ChosenGun = 1
    cont = 1
  EndIf
  ;Hat irgendwas mit SpritePixelCollision() nicht gefunzt, deshalb vorübergehend auf Linksklick, Rechts- und Mittelklick geändert.
  StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawingFont(fontID)
      DrawText(5,20,Str(coll),RGB(255,255,255))    
    DrawText(5,5,"ESC - Beenden" )
  StopDrawing()
  
  FlipBuffers()
  
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
Until cont <> 0
MfG, Mok
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

noja... testen kann ich da nix, viel zu viele abhängigkeiten.
selbst wenn ich versuche die sprites zu ersetzen nölt der weil er keine prefs findet. ätzend.
setz doch wenigstens ein paar vorab konstanten, dass man mal was starten kann!
aber wenn man ne halbe stunde arbeiten muss, um das zum laufen zu bringen, macht es keinen spaß, zu versuchen, dir zu helfen!


an der schleife seh ich nix, keine ahnung was du anstellst dass das nicht läuft.

[edith]

also:
nachdem ich die variablen width, height, depth manuell gesetzt hab, geht es.

und es geht wirklich.
abgesehen davon, dass du kein ClearScreen verwendest und alles übereinanderschmiert,
läuft die schleife bei mit rund durch.
mit beliebigem mausklick wird beendet.

die sprites sitzen etwas unglücklich, und du lädst zweimal das gleiche.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag von Mok »

Tja, dann ist das wohl Prefs-bedingt, aber bei ReadPreferenceString() wird ja auch ein "Notfalls"-parameter angegeben, falls die Prefs nicht gefunden werden können.
Was für ne 1337-Maschine hast du überhaupt, dass du das zum Laufen bringst? Asus Rampage 2 Extreme mit 4 Intel i7 und 2 nVidia GeForce Geforce 9800 GT oder was? :mrgreen:
Ich probier's morgen weiter, aber wo zum Teufel lade ich da etwas zweimal?
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> aber bei ReadPreferenceString() wird ja auch ein "Notfalls"-parameter angegeben, falls die Prefs nicht gefunden werden können.

aber trotzdem brichst du mit nem msgreq ab, wenn die prefs nicht da ist, du Künstler! :mrgreen:


> wo zum Teufel lade ich da etwas zweimal?
sprite #1 und #3 lädst du aus dem selben file.


hier ist mein testcode:
- ersatz-routine fürs sprite-laden eingebunden
- prefs-loader auskommentiert
- clearscreen ergänzt

-> funzt

Code: Alles auswählen

;-Initialisierung:
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  MessageBox_(#Null,"Eine oder mehrere Libraries für das Programm"+Chr(13)+"Aimer v1.00 konnten nicht initialisiert werden!"+Chr(13)+"Neuinstallation des Programmes könnte das Problem beheben.","Fehler beim Initialisieren",#MB_OK | #MB_ICONSTOP)
  End
EndIf

;KONSTANTEN
#NoAction = 0
#Released = 1
#Clicked  = 2
#Dragged  = 3

Define MLB.l    ; Mouse Left Button
Define MRB.l    ; Mouse Right Button

;VARIABLEN
Global rand_backgrnd.b
Global released
Global MouseX, MouseY
Global ZielX, ZielY
Global speed
Global Console, Cheat ;Die kommen dann nachher zum Einsatz
Global WType.s
Global ChosenGun

WType.s = ""
Cheat = #False
ShotsLeft = Magazine
speed = 1

;-STRUKTUREN
Structure Weapons
  Name.s
  Magazine.b
  ShootSound.s
  DrySound.s
  MuniSprite.s
  TickShot.b
  TickDry.b
  TickReload.b
EndStructure



Select ProgramParameter()
  Case "/SETTINGS"
    If RunProgram("startmgr.exe")
      End
    Else
      MessageBox_(#Null,"startmgr.exe kann nicht gefunden werden!"+Chr(10)+"Neuinstallation könnte den Fehler beheben","Fehler",#MB_OK | #MB_ICONERROR | #MB_DEFBUTTON1)
      End
    EndIf
  Case "/CONSOLE"
    Console = #True ;ebenfalls für nachher
EndSelect

width = 1024 : height = 768 : depth = 32
   
;-Vorbereitung:
; If OpenPreferences("settings.prefs")
;   width = Val(ReadPreferenceString("ScreenWidth","1024"))
;   height = Val(ReadPreferenceString("ScreenHeight","768"))
;   depth = Val(ReadPreferenceString("Depth","32"))
; Else
;   MessageBox_(#Null,"settings.prefs kann nicht gefunden werden!"+Chr(10)+"Neuinstallation könnte den Fehler beheben","Fehler",#MB_OK | #MB_ICONERROR | #MB_DEFBUTTON1)
;   End
; EndIf
If OpenScreen(width,height,depth,"Aimer v1.00") = 0
  MessageBox_(#Null,"Es konnte kein "+Str(width)+"x"+Str(height)+"x"+Str(depth)+" Bildschirm erstellt werden!","Fehler",#MB_OK | #MB_ICONERROR | #MB_DEFBUTTON1)
  End
EndIf

rand_backgrnd = Random(3)
rand_backgrnd = rand_backgrnd + 1

fontID = LoadFont(100,"Arial",12,#PB_Font_Bold)

Procedure ALoadSprite( Nr.l, Name.s )
  CreateSprite( Nr, 192,192 )
  StartDrawing(SpriteOutput(Nr))
    Box( 0,0, 192,192, $FF00FF)
    For n=0 To 15
      Line( n,     0, 192, 192, $FFFF00 )
      Line( 0,     n, 192, 192, $FFFF00 )
      Line( n, 191-0, 192,-192, $FFFF00 )
      Line( 0, 191-n, 192,-192, $FFFF00 )
    Next
    DrawText(0,0,Name)
  StopDrawing()
EndProcedure

Global Dim Guns.Weapons(2)

;PUMPGUN SETTINGS
Guns(0)\Name = "Pump"
Guns(0)\Magazine = 8
Guns(0)\TickShot = 10
Guns(0)\TickDry = 2
Guns(0)\TickReload = 17

;AK74 SETTINGS
Guns(1)\Name = "AK74"
Guns(1)\Magazine = 30
Guns(1)\TickShot = 2
Guns(1)\TickDry = 3
Guns(1)\TickReload = 23

;GLOCK 19 SETTINGS
Guns(2)\Name = "Glock"
Guns(2)\Magazine = 30
Guns(2)\TickShot = 7
Guns(2)\TickDry = 3
Guns(2)\TickReload = 10

ALoadSprite(1,"data\gfx\ak74thm.bmp");
  TransparentSpriteColor(1,RGB(255,0,255));
ALoadSprite(2,"data\gfx\glock19thm.bmp");
  TransparentSpriteColor(2,RGB(255,0,255));
ALoadSprite(3,"data\gfx\ak74thm.bmp");
  TransparentSpriteColor(3,RGB(255,0,255));
ALoadSprite(012,"data\gfx\mouse.bmp")
  TransparentSpriteColor(012,RGB(255,0,255));
cont = 0
;Problemschleife:
Repeat
 
  ExamineKeyboard()
  ExamineMouse()
 
  MouseX = MouseX() : MouseY = MouseY()
ClearScreen(0) 
  DisplayTransparentSprite(1,0,0);
  DisplayTransparentSprite(2,500,200);
  DisplayTransparentSprite(3,800,400);
  DisplayTransparentSprite(012,MouseX,MouseY);
 
  If MouseButton(#PB_MouseButton_Left)
    WType.s = "ak74"
    ChosenGun = 0
    cont = 1
  EndIf
 
  If MouseButton(#PB_MouseButton_Right)
    WType.s = "glock"
    ChosenGun = 2
    cont = 1
  EndIf
 
  If MouseButton(#PB_MouseButton_Middle)
    WType.s = "pump"
    ChosenGun = 1
    cont = 1
  EndIf
  ;Hat irgendwas mit SpritePixelCollision() nicht gefunzt, deshalb vorübergehend auf Linksklick, Rechts- und Mittelklick geändert.
  StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawingFont(fontID)
      DrawText(5,20,Str(coll),RGB(255,255,255))   
    DrawText(5,5,"ESC - Beenden" )
  StopDrawing()
 
  FlipBuffers()
 
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
Until cont <> 0 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten