PBtoHTML5 Compiler [pre-alpha]

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: PBtoHTML5 Compiler

Beitrag von ts-soft »

Kevin hat geschrieben:Sound kommt mit dem nächsten Release!
das Problem ist nur das jeder Browser andere Formate unterstützt...
Ich dachte, das wäre in HTML5 klar definiert? Naja, OGG sollte in jedem Falle dabei sein und würde mir reichen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: PBtoHTML5 Compiler

Beitrag von c4s »

Sprechen wir von HTML5?
Der Trick hierbei ist, mehrere Formate anzubieten, sodass jeder Browser bekommt, was er benötigt:

Code: Alles auswählen

<audio>
	<source src="music.mp3" type="audio/mpeg" />
	<source src="music.ogg" type="audio/ogg" />
</audio>
Längerfristig wird sich aber wohl (hoffentlich) das OGG-Format durchsetzen.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: PBtoHTML5 Compiler

Beitrag von Kevin »

ts-soft hat geschrieben:
Kevin hat geschrieben:Sound kommt mit dem nächsten Release!
das Problem ist nur das jeder Browser andere Formate unterstützt...
Ich dachte, das wäre in HTML5 klar definiert? Naja, OGG sollte in jedem Falle dabei sein und würde mir reichen :wink:
c4s hat geschrieben:Sprechen wir von HTML5?
Der Trick hierbei ist, mehrere Formate anzubieten, sodass jeder Browser bekommt, was er benötigt:

Code: Alles auswählen

<audio>
	<source src="music.mp3" type="audio/mpeg" />
	<source src="music.ogg" type="audio/ogg" />
</audio>
Längerfristig wird sich aber wohl (hoffentlich) das OGG-Format durchsetzen.
hab mich belesen und um PB kompatibel zu bleiben werde ich es dem Programmiere überlasen zu überprüfen welches Format funktioniert und welches nicht
also zb so:

Code: Alles auswählen

if LoadSound(#sound,"X.ogg")=#false
if LoadSound(#sound,"X.mp3")=#false
...
endif
endif
OGG sollte aber bis auf IE und Safarie funktionieren...

mfg kevin
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: PBtoHTML5 Compiler

Beitrag von Kevin »

Hi,

Hat etwas länger gedauert aber jetzt gibt's die neue Version :D

Download (118 KB)
changelog hat geschrieben:[r53] 19:12 18.09.2012
R viele bugs
+ output ist jetzt kleiner


[r52] 16:23 15.09.2012
+ Binär-Zahlen z.B. %111110100
+ MouseWheel()
+ LoadFont() nur normal,Bold&Italic
+ DrawingFont()
+ FreeFont()
+ IsFont()


[r51] 23:44 14.09.2012
R \r \R repariert
+ SoundLib ohne channel unterstützung!
+ InitSound()/UseFLACSoundDecoder()/UseOGGSoundDecoder()
+ FreeSound(ID)
+ IsSound(ID)
+ LoadSound(ID,path$ [,flag])
+ PlaySound(ID,[Flag]) gibt immer 'true' zurück
+ SoundPan(ID,Pan)
+ SoundVolume(ID,Volume)
+ StopSound(ID)
mfg Kevin
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: PBtoHTML5 Compiler

Beitrag von Rings »

ich muss nochmals nachhaken wegen der Commandline-Unterstützung.

ich habe im Editor folgendes als Startparameter eingefügt:
"%File" %executable.html /c /q /r
trotzdem werde ich noch 'Nachgefragt' ob ich die html überschreiben möchte.
was mache ich denn hier noch falsch ?

Als Testreferenz für die Sprites&Sound habe ich mir mal 'Waponez'
vorgenommen.
Nachdem ich die Joystick befehle, den Delay und den CHR() rausgeschmissen habe,
wird auf alle fälle schon mal ohne Fehler kompiliert.
dann kommt beim html erstellen allerdings Fehler:
JSL unknow 0 check
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: PBtoHTML5 Compiler

Beitrag von bobobo »

%File %Executable.html /R /c
compiliert und überschreibt ohne Nachfrage
Das automatische Ausführen bekomme ich auch nicht hin
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: PBtoHTML5 Compiler

Beitrag von Kevin »

Rings hat geschrieben:ich muss nochmals nachhaken wegen der Commandline-Unterstützung.

ich habe im Editor folgendes als Startparameter eingefügt:
"%File" %executable.html /c /q /r
trotzdem werde ich noch 'Nachgefragt' ob ich die html überschreiben möchte.
was mache ich denn hier noch falsch ?

Als Testreferenz für die Sprites&Sound habe ich mir mal 'Waponez'
vorgenommen.
Nachdem ich die Joystick befehle, den Delay und den CHR() rausgeschmissen habe,
wird auf alle fälle schon mal ohne Fehler kompiliert.
dann kommt beim html erstellen allerdings Fehler:
JSL unknow 0 check
Download (122 KB) mit dieser Version sollte \R \q funktionieren (\r fragt nach, \R fragt nicht nach)
Es ist jetzt auch noch ein neues Beispiel dabei "testgame_sound.pb" man muss aber erst die beiden Sounds von Waponez (Lazer.wav/Explosion.wav) in den "examples" Ordner kopieren...
JSL unknow 0 check
liegt am Gosub/Return da der Compiler die Direktiven nicht kennt sind es Variablen für in und bei "Gosub label" ist dann ein nicht erwartetes Zeichen da statt einem Leerzeichen ein +=-* oder so sein sollte...

bobobo hat geschrieben:
%File %Executable.html /R /c
compiliert und überschreibt ohne Nachfrage
Das automatische Ausführen bekomme ich auch nicht hin
ja ich hab leider nur das "nicht fragen" getestet und nicht ob alles insgesamt funktioniert...

mfg kevin
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: PBtoHTML5 Compiler

Beitrag von Rings »

Commandline geht nun genauso wie ich es brauche, thx.
Kevin hat geschrieben:
JSL unknow 0 check
liegt am Gosub/Return da der Compiler die Direktiven nicht kennt sind es Variablen für in und bei "Gosub label" ist dann ein nicht erwartetes Zeichen da statt einem Leerzeichen ein +=-* oder so sein sollte...
mfg kevin
komischer parser hast du , keine Whitespace erkennung ?
Normalerweise müsste dann ein 'SYNTAX ERROR' oder so kommen .....

Nützliche infos zu java findet man auch hier:
http://www.mcmanis.com/chuck/java/index.html

Ein Ziel sollte sein das man Waponez compilieren kann, des wäre ein Meilenstein.
Ich habe die Gosub/returns rausgeschmissen, kommt immer noch besagter obiger JSL unknown Check:

Code: Alles auswählen

;
; **************
;               *
; Waponez II     **********************************************
;                                                              *
;   Origninal Waponez is from NC Gamez ! Check it on Aminet...  *
;                                                                *
; *****************************************************************
;
; NOTE: This file doesn't compile with the demo version !
;

;
; Initialization of all the used ressources
;

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf


If InitSound() = 0
  MessageRequester("Error", "Can't open DirectX 7 Or Sound Card is not present", 0)
  End
EndIf

; If InitJoystick()
;   EnableJoystick = 1
; EndIf

;
; Our bullet structure, which will be used by the linkedlist Bullet()
;

Structure Bullet
  x.w
  y.w
  Width.w
  Height.w
  Image.w
  SpeedX.w
  SpeedY.w
EndStructure

Global NewList Bullet.Bullet()


Structure Explosion
  x.w
  y.w
  State.w
  Delay.w
EndStructure

Global NewList Explosion.Explosion()


Structure Alien
  x.w
  y.w
  Width.w
  Height.w
  Speed.w
  StartImage.w
  EndImage.w
  ImageDelay.w
  NextImageDelay.w
  ActualImage.w
  Armor.w
EndStructure

Global NewList Aliens.Alien()


Procedure AddBullet(Sprite, x, y, SpeedX, SpeedY)
  AddElement(Bullet())           
  Bullet()\x      = x
  Bullet()\y      = y
  Bullet()\Width  = SpriteWidth(Sprite)
  Bullet()\Height = SpriteHeight(Sprite)
  Bullet()\Image  = Sprite
  Bullet()\SpeedX = SpeedX
  Bullet()\SpeedY = SpeedY
EndProcedure
    

MessageRequester("Welcome !", "It's the first game done with PureBasic x86 !"+"Use the Arrows + Space To blast them all !!"+"Enjoy :-) !", 0)

;
; Now, open a 640*480 - 16 bits colours screen
;

Path$ = "Data\"

; SetRefreshRate(60)
If OpenScreen(640, 480, 16, "Waponez II")

  PlayerSpeedX = 6
  PlayerSpeedY = 6

  BulletSpeed = 10
  
  ;
  ; Load the sound effects
  ;
  
  LoadSound(0, Path$+"Lazer.wav")
  LoadSound(2, Path$+"Explosion.wav")
    
  ;
  ; Load the 3 player sprites
  ; 
    
  LoadSprite(3, Path$+"Player_1.bmp", 0) 
  LoadSprite(0, Path$+"Player_2.bmp", 0)
  LoadSprite(2, Path$+"Player_3.bmp", 0)
 
  ;
  ; Load the bullets
  ;
  
  LoadSprite( 4, Path$+"Bullet_1.bmp", 0)
  LoadSprite( 6, Path$+"Bullet_Right.bmp", 0)
  LoadSprite( 7, Path$+"Bullet_Left.bmp", 0)
  LoadSprite( 8, Path$+"Bullet_Diag1.bmp", 0)
  LoadSprite( 9, Path$+"Bullet_Diag2.bmp", 0)
  LoadSprite(55, Path$+"Bullet_Bottom.bmp", 0)

  ;
  ; Sprite 10 to 15 reserved for the rotating animated alien..
  ;
  
  For k=0 To 5
    LoadSprite(k+10, Path$+"Ennemy_3_"+Str(k+1)+".bmp", 0)
  Next
  
  ;
  ; Sprite 20 to 30 reserved for the explosions...
  ;
  
  For k=0 To 7
    LoadSprite(k+20, Path$+"Explosion_"+Str(k+1)+".bmp", 0)
  Next
    
  ;
  ; Load the background sprite
  ;
  
  LoadSprite(20, Path$+"Back_3.bmp", 0)
  
  ;
  
  PlayerWidth  = SpriteWidth(3)
  PlayerHeight = SpriteHeight(3)
  PlayerX = 300
  PlayerY = 400

  Repeat
    FlipBuffers() ; This should be always in the loop, the events are handle by this functions
          
    If IsScreenActive() ; Check if is active or not (ALT+TAB symptom :)
      db = 1-db
      
      ; Draw the background (an unified one...)
      
      For BackX=0 To 640 Step 32
        For BackY=-32 To 480 Step 32
          DisplaySprite(20, BackX, BackY+ScrollY)
        Next
      Next
      
      
      ;Gosub CheckCollisions

;CheckCollisions:

  ResetList(Aliens())
  While NextElement(Aliens())
    ResetList(Bullet())
    While NextElement(Bullet())
    
      If SpritePixelCollision(Bullet()\Image, Bullet()\x, Bullet()\y, Aliens()\ActualImage, Aliens()\x, Aliens()\y)
        Aliens()\Armor-1
        DeleteElement(Bullet())
      EndIf
      
    Wend

    If DeadDelay = 0 ; No more invincible...
      If SpritePixelCollision(PlayerImage, PlayerX, PlayerY, Aliens()\ActualImage, Aliens()\x, Aliens()\y)
        Dead = 1
        DeadDelay = 300

        AddElement(Explosion())
        Explosion()\x = Aliens()\x
        Explosion()\y = Aliens()\y

        DeleteElement(Aliens())
      EndIf
    EndIf
  
  Wend
;Return      
      
      
      
      
      
      
 ;     Gosub MovePlayers
 ;     MovePlayers:
  Fire = 0
  PlayerImage = 3  ; Non-moving player image

;   If EnableJoystick
;     If ExamineJoystick(0)
;     
;       PlayerX+JoystickAxisX(0)*PlayerSpeedX
;       PlayerY+JoystickAxisY(0)*PlayerSpeedY
; 
;       If JoystickAxisX(0) = 1
;         PlayerImage = 0
;       EndIf
;       
;       If JoystickAxisX(0) = -1
;         PlayerImage = 2
;       EndIf
;       
;       ; All buttons works to fire the aLiEnZ !
;       ;
;       If JoystickButton(0, 1) Or JoystickButton(0, 2) Or JoystickButton(0, 3) Or JoystickButton(0, 4)
;         Fire = 1
;       EndIf
;    
;     EndIf
;   EndIf

  ExamineKeyboard()
     
  If KeyboardPushed(#PB_Key_Left)
    PlayerX-PlayerSpeedX
    PlayerImage = 2  ; Left moving player image
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
    PlayerX+PlayerSpeedX
    PlayerImage = 0  ; Right moving player image
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    PlayerY-PlayerSpeedY
  EndIf
  
  If KeyboardPushed(#PB_Key_Down)
    PlayerY+PlayerSpeedY
  EndIf

  If PlayerX < 0 : PlayerX = 0 : EndIf
  If PlayerY < 0 : PlayerY = 0 : EndIf

  If PlayerX > 640-PlayerWidth  : PlayerX = 640-PlayerWidth : EndIf
  If PlayerY > 480-PlayerHeight : PlayerY = 480-PlayerHeight : EndIf

 
  If Dead = 1
    AddElement(Explosion())
    Explosion()\x = PlayerX
    Explosion()\y = PlayerY

    Dead = 0
  Else
    If DeadDelay>0
      DeadDelay-1
      If db=1
        If DeadDelay < 200
          DisplayTransparentSprite(PlayerImage, PlayerX, PlayerY)
        EndIf
      EndIf
    Else
      DisplayTransparentSprite(PlayerImage, PlayerX, PlayerY)
    EndIf
  EndIf
  
    
  If KeyboardPushed(#PB_Key_Space) Or Fire
    If BulletDelay = 0 
      If DeadDelay < 100
        BulletDelay = 10

        ; AddBullet() syntax: (#Sprite, x, y, SpeedX, SpeedY)
        ;
        AddBullet(4, PlayerX+5 , PlayerY-10,  0          , -BulletSpeed) ; Front bullet (Double bullet sprite)
        AddBullet(6, PlayerX+45, PlayerY+6 ,  BulletSpeed, 0)            ; Right side bullet
        AddBullet(7, PlayerX-11, PlayerY+6 , -BulletSpeed, 0)            ; Left side bullet
        AddBullet(8, PlayerX+45, PlayerY-6 ,  BulletSpeed, -BulletSpeed) ; Front-Right bullet
        AddBullet(9, PlayerX-11, PlayerY-6 , -BulletSpeed, -BulletSpeed) ; Front-Left bullet
        AddBullet(55,PlayerX+20, PlayerY+45,  0          ,  BulletSpeed) ; Rear bullet
     
        PlaySound(0, 0)    ; Play the 'pffffiiiouuu' lazer like sound
      EndIf
    EndIf
  EndIf

;Return


      
      
      
      
 ;     Gosub DisplayBullets
  ;    DisplayBullets:
  
  ResetList(Bullet())
  While NextElement(Bullet())  ; Process all the bullet actualy displayed on the screen

    If Bullet()\y < 0          ; If a bullet is now out of the screen, simply delete it..
      DeleteElement(Bullet())
    Else
      If Bullet()\x < 0        ; If a bullet is now out of the screen, simply delete it..
        DeleteElement(Bullet())
      Else
        If Bullet()\x > 640-Bullet()\Width
          DeleteElement(Bullet())
        Else
          If Bullet()\y > 480
            DeleteElement(Bullet())
          Else
            DisplayTransparentSprite(Bullet()\Image, Bullet()\x, Bullet()\y)   ; Display the bullet..

            Bullet()\y + Bullet()\SpeedY
            Bullet()\x + Bullet()\SpeedX
          EndIf
        EndIf
      EndIf
    EndIf
    
  Wend

;Return
      
 ;     Gosub NewAlienWave
;NewAlienWave:

  If AlienDelay = 0

    AddElement(Aliens())

    If Boss = 1

      Aliens()\x = 100
      Aliens()\y = -16
      Aliens()\Width  = SpriteWidth(50)
      Aliens()\Height = SpriteHeight(50)
      Aliens()\Speed  = 2
      Aliens()\StartImage = 50
      Aliens()\EndImage   = 50
      Aliens()\ImageDelay = 1
      Aliens()\NextImageDelay = 1
      Aliens()\ActualImage = 50
      Aliens()\Armor = 20
   
      AlienDelay = 80

    Else

      Aliens()\x = Random(600)
      Aliens()\y = -32
      Aliens()\Width  = SpriteWidth(10) 
      Aliens()\Height = SpriteHeight(10)
      Aliens()\Speed  = 3
      Aliens()\StartImage  = 10 
      Aliens()\EndImage    = 15 
      Aliens()\ImageDelay  =  4
      Aliens()\NextImageDelay = Aliens()\ImageDelay
      Aliens()\ActualImage = 10
      Aliens()\Armor = 5
      
      AlienDelay = Random(20)

    EndIf
  Else
    AlienDelay-1
  EndIf

;Return

     
      
      
      
      
      
      
      
      
      ;Gosub DisplayAliens
;DisplayAliens:

  ResetList(Aliens())
  While NextElement(Aliens())

    DisplayTransparentSprite(Aliens()\ActualImage, Aliens()\x, Aliens()\y)

    Aliens()\y + Aliens()\Speed

    If Aliens()\NextImageDelay = 0
 
      Aliens()\ActualImage+1

      If Aliens()\ActualImage > Aliens()\EndImage
        Aliens()\ActualImage = Aliens()\StartImage
      EndIf

      Aliens()\NextImageDelay = Aliens()\ImageDelay
    Else
      Aliens()\NextImageDelay-1
    EndIf

    If Aliens()\Armor <= 0
      AddElement(Explosion())
      Explosion()\x = Aliens()\x
      Explosion()\y = Aliens()\y

      Score+20
      DeleteElement(Aliens())
    Else
      If Aliens()\y > 480
        DeleteElement(Aliens())
      EndIf
    EndIf
    
  Wend
;Return
      
 ;     Gosub DisplayExplosions
      
; DisplayExplosion:
; -----------------
;
; Once an explosion has been declared (an aliens has been destroyed or the player...), it will be
; displayed inside this routine. The object remains until the end of the explosion (all the pictures
; have been displayed). Then the object is removed with DeleteElement().
;

;DisplayExplosions:

  ResetList(Explosion())
  While NextElement(Explosion())   ; Take the explosions objects, one by one.

    ; For each object, display the current explosion image (called state here)
    
    DisplayTransparentSprite(Explosion()\State+20, Explosion()\x, Explosion()\y)

    If Explosion()\Delay = 0
      If Explosion()\State = 0  ; Play the sound only at the explosion start.
        PlaySound(2, 0)
      EndIf

      If Explosion()\State < 7
        Explosion()\State+1
        Explosion()\Delay = 3
      Else
        DeleteElement(Explosion())
      EndIf
    Else
      Explosion()\Delay-1
    EndIf
  Wend

;Return  
      
      
      
      
      If BulletDelay > 0
        BulletDelay-1
      EndIf

      If ScrollDelay = 0
        ScrollY+1
        ScrollDelay = 0
      Else
        ScrollDelay-1
      EndIf
      
      If ScrollY>31
        ScrollY = 0
      EndIf
      
    Else  
          ; The screen is no more active but our game multitask friendly, so we stop the sounds and
          ; add a delay to not eat the whole CPU. Smart hey ? :)
          
      StopSound(-1)
     ; Delay(20)
    EndIf
        
  Until KeyboardPushed(#PB_Key_Escape)
Else
  MessageRequester("Waponez II", "Can't open a 640*480 8 bit screen !", 0)
EndIf

End

Rings hat geschrieben:ziert sich nich beim zitieren
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: PBtoHTML5 Compiler

Beitrag von Kevin »

@Rings

Es wird in Javascript nicht Java umgewandelt...
Danke für das Beispiel und die Fehlermeldungen hab alles behoben siehe changelog

Damit die Bilder im Browser Transparent sind hab ich ein Tool mitgeliefert "Alpha+PNG.exe" damit man einen Alpha-Kanal zu den Bildern Hinzufügen kann...
einfach die Bild-Dateien (auch mehrere) auf die Verknüpfung ziehen um einen Alpha-Kanal hinzuzufügen damit Bilder mit TransparentSpriteColor(rgb(0,0,0)) in PB und im Browser Transparent sind... (Und vorab sry für die vielen Klicks auf Ja und Ok)

Download (143 KB)
changelog hat geschrieben:[r54] 15:38 21.09.2012
R \R schon wieder
R "\" in strings werden zu "\\"
R => / =< fehler
R fehler bei Leerzeichen vor </>/=
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: PBtoHTML5 Compiler

Beitrag von bobobo »

danke für die parameter :mrgreen: :allright:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten