Retro-Remake (Alpha) Intruder schütze Stadt vor Aliens

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

dllfreak2001 hat geschrieben: Mich wunderts nur, dass das Spiel unter Vista deutlich langsamer läuft (also im allgemeinen). Wisst ihr woran das liegt? [/edit]
Wegen DirectX7. Das wird unter Vista nur 'emuliert'.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Ich hab gedacht in PB 4.2 jetzt DX9 integriert ist => gilt wohl nicht für
die Screenbefehle...
Ich hoffe die werden irgendwann noch DX9-fähig gemacht.
I´a dllfreak2001
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Man könnte ja das (meiner Wissens etwas fehlerhafte) DirectX 9 Subsystem benutzen. Dann dürfte das auch unter Vista schneller laufen.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Ich denke da muss man die Api wieder direkt ansprechen
was sich in einen masiven Umbau des Programms wiederspiegeln könnte.

Naja, da würde ich lieber die Vista-User etwas prellen.
I´a dllfreak2001
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Wieso API? Meines Wissens musst du nur bei den Compileroptionen bei Subsystem "DirectX9" (oder wie es auch nochmal heißt) eintragen. Kann es gerade auch nicht nachschauen.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Tatsächlich, habs grad reingehauen aber es macht absurde Fehler beim Clipbefehl... Dann warten wir mal lieber bis das fehlerbereinigt ist, ist ja auch net so schlimm wenns unter Vista etwas langsamer läuft.
I´a dllfreak2001
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Subsystem DirectX9 is total buggy. Was ich schon mehrmals im englischen Forum gemeldet habe.

@dllfreak2001
Allerdings bin ich schon sehr gespannt auf Deine Sourcen...
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Im Source ist nix spektakuläres viele Listen nicht besonders Modular naja.
Keine Sprite3Ds und einfaches Clipping....

Hab hier aber schon etwas rumgeschraubt, später werden die Grafiken und Sounds auch noch in die EXE integriert.

Code: Alles auswählen

;***   Intruder v1.0   ***
;*** Von dllfreak2001 ***
;***     02.07.08      ***

;-Screenkramm initialisieren
InitSprite()
InitSound()
InitKeyboard()


;-Strukturen
Structure gshoot
  posx.f
  posy.f
EndStructure
Structure genemy
  posx.f
  posy.f
  movex.f
  movey.f
  energy.f
  targetx.l
  targety.l
EndStructure
Structure gwreck
  typ.l
  anioff.l
  posx.f
  posy.f
  movex.f
  movey.f
EndStructure
Structure gexplosion

  anim.l
  posx.f
  posy.f
EndStructure
Structure ghouse
  typ.l
  power.l
EndStructure

;-Konstanten und Definitionen
level = 0
#screenw = 800
#screenh = 320
#shootdelay = 40
#maxwreck = 2000

#efspeed = 1.8
#whouse = 22
#hhouse = 4
#hwreck = 20
#twave = 10000
Global guardpos.f = #screenw/2-32,guardmove.f, shootmove.f = 10

;-Listen und Arrays
Global NewList shoot.gshoot()
Global NewList enemy.genemy()
Global NewList wreck.gwreck()
Global NewList explo.gexplosion()
Global NewList shootin.gexplosion()
Global Dim house.ghouse(#whouse,#hhouse)

;Fenster und Screen öffnen
winid.l = OpenWindow(0,0,0,#screenw,#screenh,"Intruder",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
OpenWindowedScreen(winid,0,0,#screenw,#screenh,0,0,0)


;-Grafiken Laden
TransparentSpriteColor(#PB_Default ,RGB(255,0,255))
LoadSprite(0,"back.bmp",0)
LoadSprite(10,"enemy.bmp",0)
LoadSprite(1,"guard.bmp",0)
LoadSprite(2,"shoot.bmp",0)

LoadSprite(3,"shootout.bmp",0)

LoadSprite(100,"wreck01.bmp",0)
LoadSprite(101,"wreck02.bmp",0)
LoadSprite(102,"wreck03.bmp",0)
LoadSprite(103,"wreck04.bmp",0)
LoadSprite(104,"wreck05.bmp",0)

LoadSprite(200,"explosion.bmp",0)
LoadSprite(300,"shootin.bmp",0)
LoadSprite(400,"house01.bmp",0)
LoadSprite(401,"house02.bmp",0)
LoadSprite(402,"house03.bmp",0)

;-Sounds laden
LoadSound(0,"gun2.wav")
LoadSound(1,"explode.wav")
LoadSound(2,"laser.wav")




;-Prozeduren
Procedure NewExplosion(posx.f,posy.f)
  AddElement(explo())
  explo()\posx = posx
  explo()\posy = posy
  explo()\anim = 0
EndProcedure
Procedure NewWreck(posx.f,posy.f,movx.f,movy.f,type.l, range.l, count.l)
  For f = 0 To count
    AddElement(wreck())          
    wreck()\typ = type + Random(range)
    wreck()\posx = posx
    wreck()\posy = posy
    wreck()\movex = (Random(movx)-movx/2)/100
    wreck()\movey = (Random(movy)-movy/2)/100
    wreck()\anioff = Random(3)
  Next
EndProcedure

;-Stadt erzeugen
For x = 0 To #whouse
ttemp = Random(2)
For y = 0 To #hhouse
  If y > 0
  
  If house(x,y-1)\typ => 0 And Random(10) > 2
    house(x,y)\typ = ttemp
    house(x,y)\power = 400

  Else
   house(x,y)\typ = -1
  
  EndIf
  
  Else
    If Random(10)> 0
       house(x,y)\typ = ttemp
       house(x,y)\power = 400
    Else
     house(x,y)\typ = -1
    EndIf
    
  EndIf
  

Next:Next



;******************************************************
;             Beginn der Hauptschleife
;******************************************************
;-Start



Repeat
  ExamineKeyboard()  
  wevent.l = WindowEvent() 

  ;- <=== ===> Bewegen
  guardmove/1.1
  If KeyboardPushed(#PB_Key_Left)
    guardmove - 1
  ElseIf KeyboardPushed(#PB_Key_Right)
    guardmove + 1
  EndIf
  guardpos = guardpos + guardmove

  If guardpos < 0
   guardpos = 0
   guardmove = -guardmove/2
  EndIf
  
  If guardpos > #screenw-64 
    guardpos = #screenw-64
    guardmove = -guardmove/2
  EndIf  

  ;- ===o Schiessen
  If KeyboardPushed(#PB_Key_Space) And ElapsedMilliseconds()-shoottime > #shootdelay
    shoottime = ElapsedMilliseconds()
    AddElement(shoot())
    shoot()\posx = guardpos + 32
    shoot()\posy = #screenh-32 
    shootanim = 0
    guardanimdelay.l = 10
    
    PlaySound(0)
  EndIf

  ;-Panzer animieren
  guardanimdelay + 1
  If guardanimdelay < 500 And ElapsedMilliseconds()-guardtime > guardanimdelay
      
      guardtime.l =    ElapsedMilliseconds()
      guardanim + 1
    If guardanim > 2
      guardanim = 0
    EndIf
  EndIf

  ;-Stadt darstellen
  For x = 0 To #whouse:For y= 0 To #hhouse 
    If house(x,y)\typ > -1
      ClipSprite(400+ house(x,y)\typ,0,Round((400-house(x,y)\power)/100,0) * 32,32,32)
      DisplayTransparentSprite(400 + house(x,y)\typ,32+x*32,#screenh-y*32-32)
    EndIf
  Next:Next
  
  
  
  ;-<<<****Gegner****>>>
  
  ;-Neue Gegner erzeugen
  ecnt.l = CountList(enemy())
  If  ecnt = 0
    start = 1
    
    level + 1  
    For n = 0 To level    
            AddElement(enemy())
      enemy()\posx = Random(#screenw)
      enemy()\posy = -64
      enemy()\movex = (Random(400)-200)/100
      If Abs(enemy()\movex) < 0.5
        enemy()\movex = 4
      EndIf
      enemy()\targetx = Random(#whouse)
      enemy()\targety = Random(#hhouse)
      enemy()\movey = Random(300)/100 + 1
      enemy()\energy = 4
    Next

  EndIf
  

  scnt.l = CountList(shoot())
  ecnt = CountList(enemy())

  If ecnt > 0

    ;-Raumschiffanimation
    anim + 1     
    If anim > 3: anim = 0 :EndIf
    ClipSprite(10,0,anim*32,32,32)

    FirstElement(enemy())
    playlaser.b = 0 ;Flag für Lasersound

    For n = 0 To ecnt-1

      ;Gegner horizontal bewegen      
      enemy()\posx =  enemy()\posx + enemy()\movex
      
      If enemy()\posx > #screenw 
        enemy()\posx = #screenw 
        enemy()\movex = -Random(400)/100 -1
      EndIf
      
      If enemy()\posx < -64
        enemy()\posx = -64
        enemy()\movex = Random(400)/100 +1
      EndIf
      
      ;Gegner vertikal bewegen
      enemy()\posy =  enemy()\posy + enemy()\movey
      
      If enemy()\posy > #screenh - 96
        enemy()\posy = #screenh - 96
        enemy()\movey = -Random(400)/100 -1
      EndIf
      
      If enemy()\posy < - 64
        enemy()\targetx = Random(#whouse)
        enemy()\targety = Random(#hhouse)           
        enemy()\posy =  - 64
        enemy()\movey = Random(400)/100 + 1
      EndIf
     
      ;-Häuser angreifen
      If enemy()\posy+24 > #screenh/3 And enemy()\posy+24 < #screenh-enemy()\targety*32-16 And house(enemy()\targetx,enemy()\targety)\typ > -1 And enemy()\posx > enemy()\targetx*32 - 160 And enemy()\posx < enemy()\targetx*32 + 128
        playlaser = 1
        enemy()\movex = enemy()\movex/1.02
        enemy()\movey = enemy()\movey/1.02
        house(enemy()\targetx,enemy()\targety)\power - 1 ;Dem Stockwerk wird Energie entzogen

        ;-Stockwerk zerstören
        If house(enemy()\targetx,enemy()\targety)\power < 1
          enemy()\movex = (Random(400)-200)/100
          If enemy()\movex = 0
            enemy()\movex = 1.1
          EndIf
          enemy()\movey = (Random(200)/100)+0.1
          
          house(enemy()\targetx,enemy()\targety)\power = 0
          house(enemy()\targetx,enemy()\targety)\typ = -1
          NewExplosion(32+enemy()\targetx*32,#screenh-enemy()\targety*32-32)
          NewWreck(32+enemy()\targetx*32,#screenh-enemy()\targety*32-32,200,200,2,2,#hwreck)
          PlaySound(1)
          ;höherliegende Stockwerke zerstören
          If enemy()\targety < #hhouse
            For v = enemy()\targety+1 To #hhouse
              If house(enemy()\targetx,v)\typ > -1
                house(enemy()\targetx,v)\typ = -1
                house(enemy()\targetx,v)\power = -1
                NewExplosion(32+enemy()\targetx*32,#screenh-v*32-32)
                NewWreck(32+enemy()\targetx*32,#screenh-v*32-32,200,200,2,2,#hwreck)
              EndIf
            Next
          EndIf
        EndIf
        ;-Laser darstellen
        StartDrawing(ScreenOutput())
          LineXY(enemy()\posx+16,enemy()\posy+24,48+enemy()\targetx*32,#screenh-enemy()\targety*32-16,RGB(255,20,50))
        StopDrawing()
      EndIf

      ;-Gegner treffen
      scnt = CountList(shoot())
      If scnt > 0
        FirstElement(shoot())
        For m = 0 To scnt-1
          ;Auf einschlag prüfen
          If shoot()\posx > enemy()\posx+2 And shoot()\posx < enemy()\posx+30 And shoot()\posy > enemy()\posy+8 And shoot()\posy < enemy()\posy +32
            ;Einschläge
            AddElement(shootin())
            shootin()\posx = shoot()\posx
            shootin()\posy = shoot()\posy
            
            ;Schuss entfernen
            DeleteElement(shoot())
            
            ;Gegner energie abziehen und flüchten lassen
            enemy()\movex = enemy()\movex * #efspeed
            enemy()\energy - 1
          EndIf
          NextElement(shoot())
        Next
      EndIf
      
      ;-Gegner darstellen
      DisplayTransparentSprite(10,enemy()\posx,enemy()\posy)
      
      ;-Gegner löschen
      If enemy()\energy < 1
        NewWreck(enemy()\posx+8,enemy()\posy+8,2400,2400,0,1,100)
        NewExplosion(enemy()\posx,enemy()\posy)
        DeleteElement(enemy())
        PlaySound(1)
      EndIf

      NextElement(enemy())
      
    Next
  EndIf

  ;-Lasersound abspielen
  If ElapsedMilliseconds()-lasertime > 691 And playlaser = 1
    lasertime = ElapsedMilliseconds()
    PlaySound(2)
  EndIf
;->>>****Gegner****<<<






  ;-Panzer darstellen
  ClipSprite(1,0,guardanim*32,64,32)
  DisplayTransparentSprite(1,guardpos,#screenh-32)

  ;-Wrackteile bewegen und darstellen
  wcnt.l = CountList(wreck())
  If wcnt > 0
    FirstElement(wreck())
    If ElapsedMilliseconds()-wanimtime > 50
      wanim + 1
      If wanim > 3:wanim = 0:EndIf
      wanimtime = ElapsedMilliseconds()
    EndIf
    For n = 0 To wcnt-1
      wreck()\movex / 1.005  
      wreck()\movey + 0.1 
      wreck()\posx = wreck()\posx + wreck()\movex
      wreck()\posy = wreck()\posy + wreck()\movey
      tanim = wanim + wreck()\anioff
      If tanim > 3: tanim-3:EndIf
      ClipSprite(100+wreck()\typ,0,tanim*16,16,16)
      DisplayTransparentSprite(100+wreck()\typ, wreck()\posx, wreck()\posy)
      If wreck()\posy > #screenh
        DeleteElement(wreck())
      EndIf
      NextElement(wreck())
    Next
  EndIf

  ;-Schüsse darstellen und bewegen
  scnt = CountList(shoot())
  If scnt > 0
    FirstElement(shoot())
    For n = 0 To scnt - 1
      shoot()\posy - shootmove
      DisplayTransparentSprite(2,shoot()\posx-16,shoot()\posy-16)
      If shoot()\posy < -16
        DeleteElement(shoot())
      EndIf
      NextElement(shoot())
    Next
  EndIf

  ;-Mündungsfeuer darstellen  
  If shootanim < 4
    ClipSprite(3,0,shootanim*32,32,32)
    DisplayTransparentSprite(3,guardpos+16,#screenh-60)
    If ElapsedMilliseconds()-schootouttimer > 50
      shootanim + 1
      schootouttimer = ElapsedMilliseconds()
    EndIf
  EndIf

  ;-Explosionen darstellen
  excnt.l = CountList(explo())
  If excnt > 0
    FirstElement(explo())
    If ElapsedMilliseconds() - explotime > 50
      animok.b = 1
      explotime = ElapsedMilliseconds() 
    Else
      animok = 0
    EndIf

    For n = 0 To excnt - 1
      ClipSprite(200,0,explo()\anim*64,64,64)
      DisplayTransparentSprite(200,explo()\posx-16,explo()\posy-16)
      If animok
        explo()\anim + 1
      EndIf
      If explo()\anim = 4
        DeleteElement(explo())         
      EndIf
      NextElement(explo())
    Next
  EndIf
    
  ;-Einschläge darstellen 
  sincnt.l = CountList(shootin())
  If sincnt > 0
    FirstElement(shootin()) 
    If ElapsedMilliseconds() - sintime > 20
      sinanimok.b = 1
      sintime = ElapsedMilliseconds() 
    Else
      sinanimok = 0
    EndIf
    For n = 0 To sincnt - 1 
      ClipSprite(300,0,shootin()\anim*32,32,32)
      DisplayTransparentSprite(300,shootin()\posx-16,shootin()\posy)
      If sinanimok
        shootin()\anim + 1
      EndIf
      If shootin()\anim = 4
        DeleteElement(shootin())         
      EndIf
      NextElement(shootin())
    Next
  EndIf

  ;-Text schreiben
  StartDrawing(ScreenOutput())
    DrawText(0,0,"Level: " + Str(level) )
  StopDrawing()

  ;-Buffer flippen und Delay 
  FlipBuffers()
  DisplaySprite(0,0,0)
  Delay(10)

Until wevent = #PB_Event_CloseWindow 
End
I´a dllfreak2001
Antworten