Simple Script Max

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter

Worklogs Simple Script Max

Eine Bindung fürs Leben...

Donnerstag, 22. Januar 2009 von coolo
Hallo,
heute wurde der Verbindungs Operator eingeführt. Meine Wahl fiel auf dem kaufmaännischen Und, "&". Warum das so ist?
Ich habe viele tests durchgeführt. Am Anfang wollte ich das von BB gewohnte Plus(+) verwenden, doch da kam mir in die Quere das dieser Opertor schon als Additions Opertor Verwendung gefunden hatte. Danach sollte es der Punkt (.) werden, da waren es gleich zwei dinge die störten. Der punkt war beim OOP schon in Verwendunf und bei Komma Zahlen war es das Komma. Danach gabs sowieso nurmehr das & zur Verfügung...
Code: [AUSKLAPPEN]

print("Sin(54) lautet: "&sin(54)&" Cool nicht?")

Durch dieses "Feature" gibts leider Probleme bei den Schleifen... ich weiß nicht wo der Fehler liegt, aber Schleifen werden aus irgendeinem Grund gänzlich ignoriert.

Nundenn coolo

Wo bleibt die Demo?

Mittwoch, 21. Januar 2009 von coolo
Hallo,
nun da Simple Script 2 immer Bugfreier wird, überlege ich wann ich die erste Demo rausbringen soll. Da stellt sich die Frage ob beim veröffentlichen der Demo schon die 2D Engine eingebaut sein soll, oder nur die provisorische BB Engine zur Verfügung stellen soll. Außerdem muss vorallem noch eine ordentliche Fehlerüberprüfung eingebaut werden... Weil sonst das Scripten zum Horror wird. Nundenn, ihr könnt ja eure Meinung bei den Kommentaren abgeben, ob ich nun eine Demo rausbringen soll oder nicht.

Aktuell gibt es einen Fatalen Fehler. Folgender Code wird falsch ausgeführt:
Code: [AUSKLAPPEN]

print("fps"fps())

Man kann in einem String Parameter keine Funktionsaufrufufe durchführen... Das ist der Grund warum im unteren Script die fps() Funktion aufgefangen und in eine Varaible gespeichert wird. Ich überlege mir doch einen Verbindungsoperator einzubauen.

Nebenbei habe ich ein Feature eingebaut welches ziemlich hilfreich ist wenn man ein Modbaren Spiel machen will. Was ist wenn ein längeres Script abgearbeitet werden muss und die Ausführungsgeschwindigkeit zu lang wird um sie in einem Frame auszuführe? Dann überlagert man die Ausführung über mehrere Frames hinweg.
Die Funktion exec_script() hat nämlich 2 neue Parameter spendiert bekommen.
Code: [AUSKLAPPEN]

exec_script(myscript,linenumber,count)

linenumber steht für die Zeile die ausgeführt werden soll und count wieviele danach folgen sollen, natürlich sind die beiden Parameter optional.

Außerdem wurde das Pongbespiel ein bisschen verbessert. Man kann jetzt verlieren und die Kugel kann nicht mehr stehenbleiben.(Lag daran das ist rand(-3,3) für die Richtung verwendete und wenn 0 rauskam dies nicht aufgefangen wurde...)
Code: [AUSKLAPPEN]

;Herzlich Willkommen zu Simple Script 2
;Heute programmieren wir ein Grundgerüst von einem Simple Pong
graphics(640,480,0,2)
setbuffer(backbuffer())
importall() ;importieren nicht vergessen ;)
local player as Timage
player.new(0,0)
player.load("gfx/player.png")
player.x%=320
player.y%=10

;Gegner:
local gegner as Timage
gegner.new(0,0)
gegner.load("gfx/player.png")
gegner.x%=320
gegner.y%=440
;ball
local ballx%
local bally%
local ballspeedx%
local ballspeedy%
local playerlive%=7
local gegnerlive%=7
ballx%=320
bally%=240
ballspeedx%=rand(-2,2)
ballspeedy%=2
local myfps%
;mainloop
repeat
   cls()
   myfps%=fps()
   text("FPS: "myfps%,0,0)
   text("Spieler: "playerlive%"  Gegner:"gegnerlive%,240,320,1,1)
   player.draw()
   gegner.draw()

   if (playerlive%==0)
      cls()
      flip()
      print("Verloren!")
      delay(1000)
      end()
   endif

   if (gegnerlive%==0)
      cls()
      flip()
      print("Gewonnen!")
      delay(1000)
      end()
   endif
   ;gegner
   if (ballx%>gegner.x%)
      gegner.x%=gegner.x%+3
   endif
   if (ballx%<gegner.x%)
      gegner.x%=gegner.x%-3
   endif
   ;bewegen
   if (keydown(203))
      player.x%=player.x%-5
   endif
   if (keydown(205))
      player.x%=player.x%+5
   endif
   ;ball
   if (ballx%<0)
      ballspeedx%=rand(2,4)
   endif
   if (ballx%>630)
      ballspeedx%=rand(-2,-4)
   endif

   if (rectsoverlap(gegner.x%,gegner.y%,32,32,ballx%,bally%,10,10))   
      ballspeedy%=rand(-2,-3)
      ballspeedx%=rand(-5,5)
      if (ballspeedy%==0)
         ballspeedy%=-2
      endif
      if (ballspeedx%==0)
         ballspeedx%=-3
      endif
   endif
   if (rectsoverlap(player.x%,player.y%,32,32,ballx%,bally%,10,10))   
      ballspeedy%=rand(2,3)
      ballspeedx%=rand(-5,5)
      if (ballspeedy%==0)
         ballspeedy%=2
      endif
      if (ballspeedx%==0)
         ballspeedx%=3
      endif
   endif

   if (bally%<0)
      playerlive%=playerlive%-1
      ballx%=320
      bally%=240
      ballspeedy%=rand(-3,3)
      ballspeedx%=rand(5,-5)
      if (ballspeedy%==0)
         ballspeedy%=2
      endif
      if (ballspeedx%==0)
         ballspeedx%=3
      endif
   endif
   if (bally%>480)
      gegnerlive%=gegnerlive%-1
      ballx%=320
      bally%=240
      if (ballspeedy%==0)
         ballspeedy%=2
      endif
      if (ballspeedx%==0)
         ballspeedx%=3
      endif
   endif
   if (ballx%<0)
      ballspeedx%=rand(1,5)
   endif
   if (ballx%>630)
      ballspeedx%=rand(-1,-5)
   endif
   ballx%=ballx%+ballspeedx%
   bally%=bally%+ballspeedy%
   oval(ballx%,bally%,10,10)
   flip()
until (keydown(1) ) ;Wenn Esc dann beenden

Erstes Spiel in Simple Script 2

Sonntag, 18. Januar 2009 von coolo
Hallo erstmal,
nun nach etlichen Veruschen habe ich es schlussendlich geschafft ein kleines Spiel ein SS2 zu scripten. Es läuft "flüssig" mit 150fps, die Ballphysik ist zwar nicht realistisch wobei dies egal ist. Leider bin ich im Laufe der Programmierung auf etliche Bugs gestoßen. Einige habe ich behoben, andere wiederum nicht.
Ua. waren teils schlimme dabei, wie zum bsp. konnten Variablen keine negative Werte beinhalten. Außerdem hatte SS2 eine magische Grenze aus 9 Variablen, komisch das ich ihn nicht schon früher entdeckt hatte.
Lange Rede kurzer Sinn, hier ist der Beispielcode:

Code: [AUSKLAPPEN]

graphics(640,480,0,2)
setbuffer(backbuffer())
importall() ;importieren nicht vergessen ;)
local player as Timage
player.new(0,0)
player.load("gfx/player.png")
player.x%=320
player.y%=10

;Gegner:
local gegner as Timage
gegner.new(0,0)
gegner.load("gfx/player.png")
gegner.x%=320
gegner.y%=440
;ball
local ballx%
local bally%
local ballspeedx%
local ballspeedy%
local playerlive%=7
local gegnerlive%=7
ballx%=320
bally%=240
ballspeedx%=rand(-2,2)
ballspeedy%=2
;mainloop
repeat
   cls()
   text(fps(),0,0)
   text("Spieler: "playerlive%"  Gegner:"gegnerlive%,240,320,1,1)
   player.draw()
   gegner.draw()

   ;gegner
   if (ballx%>gegner.x%)
      gegner.x%=gegner.x%+3
   endif
   if (ballx%<gegner.x%)
      gegner.x%=gegner.x%-3
   endif
   ;bewegen
   if (keydown(203))
      player.x%=player.x%-5
   endif
   if (keydown(205))
      player.x%=player.x%+5
   endif
   ;ball
   if (ballx%<0)
      ballxspeed%=rand(2,4)
   endif
   if (ballx%>473)
      ballxspeed%=rand(-2,-4)
   endif

   if (rectsoverlap(gegner.x%,gegner.y%,32,32,ballx%,bally%,10,10))   
      ballspeedy%=rand(-2,-3)
      ballspeedx%=rand(-5,5)
   endif
   if (rectsoverlap(player.x%,player.y%,32,32,ballx%,bally%,10,10))   
      ballspeedy%=rand(2,3)
      ballspeedx%=rand(-5,5)
   endif
   if (bally%<0)
      playerlive%=playerlive%-1
      ballx%=320
      bally%=240
      ballspeedy%=rand(-3,3)
      ballspeedx%=rand(5,-5)
   endif
   if (bally%>480)
      gegnerlive%=gegnerlive%-1
      ballx%=320
      bally%=240
   endif
   if (ballx%<0)
      ballspeedx%=rand(1,5)
   endif
   if (ballx%>630)
      ballspeedx%=rand(-1,-5)
   endif
   ballx%=ballx%+ballspeedx%
   bally%=bally%+ballspeedy%
   oval(ballx%,bally%,10,10)
   flip()
until (keydown(1) ) ;Wenn Esc dann beenden


Nebenbei wurde intern der Parameterparser neugeschrieben...

Delete!

Mittwoch, 14. Januar 2009 von coolo
Hallöchen,
nun wurde die Methode Delete erfolgreich hinzugefügt.
Code: [AUSKLAPPEN]

importall() ;Importiert alles
local hndl1 as timage
hndl1.new(100,100) ;x und y Position
hndl1.load("gfx/player.png")
repeat
    hndl1.draw()
until(keyhit(1)) ;wenn ESC dann beenden
hndl1.delete()

Nichts besonderes...

Nebenbei habe ich mal ein kleines Video gemacht, welches die Funktionsweise von Simple Script 2 näher erklären sollte. Es soll ein mehr partiges "Tutorial" sin.
http://www.youtube.com/watch?v...amp;fmt=18

Anregungen/Kritik gerne erwünscht.
Edit: Wer beim Yotube Video nichts erkennt, kanns hier downloaden. http://www.cminis.kilu.de/down...2teil1.wmv

New!

Dienstag, 13. Januar 2009 von coolo
Hallo!
heute wurde die OOP Struktur wieder ein bisschen verändert. Es wurde aus dem vorigen Image Beispiel Folgendes:
Code: [AUSKLAPPEN]

importall() ;Importiert alles
local hndl1 as timage
hndl1.new(100,100) ;x und y Position
hndl1.load("gfx/player.png")
repeat
    hndl1.draw()
until(keyhit(1)) ;wenn ESC dann beenden

Es wurde nun eindeutig flexibler gestaltet, weil man das Objekt nicht gleich bei der Initialisierung erzeugt, sondern erst beim aufruf von der Methode new. Intern wird zwar schon der Speicher reserviert und glech die Methode New erzeugt, aber die anderen Variablen/Funktionen werden erst beim hndl1.new() erzeugt.

Außerdem habe ich nun den letzten mir bekannten Bug in SS2 beseitigt. Nämlich der den ich vorletzten Eintrag beschrieben habe.
Nun wird folgender Code richtig ausgeführt:
Code: [AUSKLAPPEN]

local myint%=5
local gmyint%=2
print (gmyint%)

Ausgabe: 2

Konstruktor!

Montag, 12. Januar 2009 von coolo
Hallo meine treuen Worklog Leser!
Nun sind Konstruktoren eingebaut. Intern sind sie zwar normale Methoden mit dem Namen "construct", sie wird automatisch nach dem erzeugen im Code gesetzt.
Code: [AUSKLAPPEN]

importall() ;Importiert alles
local hndl1 as timage(100,100) ;x und y Position
hndl1.load("gfx/player.png")
repeat
    hndl1.draw()
until(keyhit(1)) ;wenn ESC dann beenden


Nebenbei habe ich einen art Output geschrieben, welcher mir beim Debugging hilft, der obere Code wird folgend "konvertiert":
Code: [AUSKLAPPEN]

0: importall()
1: hndl1.construct (100,100)
2: hndl1.load("gfx/player.png")
3: repeat
4: hndl1.draw()
5: if (keyhit(1)))
6: jumptoline(9)
7: endif()
8: jumptoline(3)

Nunja, da hat sich doch nicht viel geändert, dies ist richtig, doch bei anderen Beispielen schon, hier nochmal das Variablen Beispiel:
Code: [AUSKLAPPEN]

local int%=7
local muh%=9
local string$="Hallo"
local float#=5.78
muh%=9
print(int%)
int%=10
print(int%)
int%=5
print(int%)
print(muh%)
print(string$)
print(float#)

Wird in:
Code: [AUSKLAPPEN]

0: %1!%=7
1: %2!%=9
2: $1!$="Hallo"
3: #1!#=5.78
4: %2!%=9
5: print(%1%)
6: %1!%=10
7: print(%1%)
8: %1!%=5
9: print(%1%)
10: print(%2%)
11: print($1$)
12: print(#1#)

geändert. Man sieht das die Variablen in ihren index im Array konvertiert werden. Falls es noch immer niemand verstanden hat, Simple Script 2 wird NICHT in Bytecode umgewandelt. Warum das so ist? Weil ich schlicht und ergreifend zu faul bin/war.

Endlich! Der Kammerjäger...

Sonntag, 11. Januar 2009 von coolo
Hallo,
nun nach einer etwas Längeren Pause, schreibe ich nun hier wieder einen neuen Worklog Eintrag. Viel habe ich in SS2 nicht gemacht, da ich anderes getan habe (mit Bmax näher angeschaut). Dennoch wurden die 3 vorhin genannten Bugs beseitigt. Das If Abfragen System wurde komplett neu geschrieben, und wurde dadurch wieder um einen Brocken schneller. Den Bug der bei Funktionen sich abgespielt hat, habe ich heute auch beseitigen können, war wieder typisch ich... Ich habe für etwas was jetzt 50 Zeilen Code einnimmt 300 Zeilen gebraucht...
Nundenn, leider entdeckte ich bei meiner Bugjagd noch einen schwerwiedenden Fehler, nämlich Folgender Code wird falsch ausgeführt:
Code: [AUSKLAPPEN]

local myint%=5
local gmyint%=2
print (gmyint%)

Beim oberen Code wird 5 anstatt 2 ausgegeben, ich weiß schon wo der Fehler zu finden ist, nämlich im Parser, welcher die Variablen durch ihrer Adressen ersetzt. Der arbeitet nämlich mit einfachem Replace, und dies sollte ich beheben.

Außerdem habe ich mich an einer IDE in Blitz Plus gewagt, sie funktioniert mittlerweile prächtig, Syntax Highlighting auch und Kompilieren sowieso, jetzt fehlt nurnoch das Tabs und die Befehlsreferenz(ausser ein kleiner Bug im LAden das nach jeder Zeile eine leer Zeile folgt...). Wer die IDE sich anschauen will, klickt bitte hier.

Nebenbei versuchte ich ein kleineres Pongspiel zu schreiben, wobei das aus unergründlichen Gründen nicht funktionierte, die BAllphysik ist nicht Spielbar...

Code: [AUSKLAPPEN]

importall()
graphics(640,480,0,2)
setbuffer(backbuffer())
local py%=320;die y kordinate des Spielers
local gy%=320 ;die y kordinate das Gegners

local bx#=320
local by#=240
local bangle#=0

repeat
     cls()
     if (keyhit(1))
          end()
     endif
     getfps(10,10)
 
     bx#=bx#+cos(bangle#)*2
     by#=by#+sin(bangle#)*2


     if (keydown(200))
          py%=py%-3
     endif

     if (keydown(208))
          py%=py%+3
     endif
     if ((gy%+25)>by#)
          gy%=gy%-3
     endif
     if ((gy%+25)<by#)
          gy%=gy%+3
     endif
     ;kollisionen
     if (rectsoverlap(bx#,by#,10,10,540,gy%,10,50)==1)
          bangle#=180-bangle#
     endif
     if (bangle#>360)
          bangle#=1
     endif
     if (bangle#<0)
          bangle#=360
     endif
     ;zeichnen
     oval(bx#,by#,10,10)
     rect (20,py%,10,50)
     rect (540,gy%,10,50)

     flip(0)
forever()


MfG
coolo

Die Rettung naht!

Mittwoch, 31. Dezember 2008 von coolo
Guten Morgen und eine schöne Silvester Feier!
Was ist gester/heute passiert in Simple Script 2? Nunja, Hauptsächlich habe ich mich im tiefen Dschungel des Stringrechners gewegt um dort den Fehler zu finden. Er war hartnäckig aber dennoch habe ich ihn gefunden. Wie ich den Fehler gelöst habe? Ich habe einfach eine ältere Edition des Rechenparsers genommen, welche noch prächtig funktionierte und hab einfach den Bereich, wo ich den Fehler vermutet habe ersetzt. Dies funktionierte wunderbar.
Ganz nebenbei, konnte ich noch einen Bug entfernen, der auch im alten Rechenparser zu finden war. Wenn im linken Produkt einer Multiplikation eine Negative Zahl sich befand geriet der rechenparser in eine Endlosschleife.
Und was kann jetzt der Rechenparser für komplizierte Rechnungen rechnen?
Code: [AUSKLAPPEN]

1-6*5+4-88+(3+5*(6-8+Cos(5*3)-66+5))*5-5*8998+5(76576-4)+1+1+1+1+1+1+1+1+1+1+1-1^5+tan(1)

Und das oben genannte Beispiel in weniger als 1ms!

Jetzt bleiben nurnoch 2 mir bekannte Bugs übrig, welche behoben werden müssen, bevor ich mich dem OOP weiter widme.

Probleme und noch mehr Probleme...

Dienstag, 30. Dezember 2008 von coolo
Hallöchen, ich habe eine gute Nachricht: Das AND und OR funktioniert wieder. Der Fehler lag daran, dass aus irgendeinem Grund der Opertor Parser nur Operatoren mit maximale 2 Zeichen, dies ist so damit die Geschwindigkeit noch erhalten bleibt. Und nebenbei kann man jetzt statt and auch && verwenden(das And wird intern sowieso in && umgewandelt).

Und was ist mit den anderen 2 Bugs? Nunja, die kann ich nicht beseitigen, weil der Rechenparser irgendwo einen Defekt hat und keine Negativen Zahlen mehr handeln kann... Ich suche schon den Ganzen Tag nach dem Fehler, es scheint als müsse ich den Rechenparser neu schreiben, wobei das meine letzte Alternative sein wird...

Ich hoffe ich finde den Fehler so schnell wie möglich da meine Motivation immer mehr absinkt...

Syntax Änderungen

Montag, 29. Dezember 2008 von coolo
Hallöchen,
da sich einige über den Syntax des OOPs beschwehrt haben, versuchte ich diese auch umzusetzen, und nun ja, es funktioniert prachtvoll war ne Arbeit von ung. 15 Minuten Wink.
Der neue Syntax:
Code: [AUSKLAPPEN]


importall() ;Importiert alles
local hndl1:timage ;das as funktioniert immer noch.
hndl1.x%=5
hndl1.y%=9
print (hndl1.x%)
hndl1.load("gfx/player.png")
repeat
     hndl1.draw()
until(keyhit(1))


Außerdem habe ich 3 schlimme Bugs entdeckt:
1. Das elseif bei If abfragen funktioniert nicht mehr.
2. Bei Benutzerdefinierten Funktionen, gibts bei den Parametern Probeleme mit den Strings als Parameter
3. Bool'sche Operatoren An Or zicken rum.
Diese Fehler verusuche ich in den nächsten Tagen zu beseitigen, sie befinden sich leider tief im System, genauergesagt im Rechenparser und dergleichen(wenn ich da was grobes verändere kann es durchaus sein, das wieder was anderes rumzickt...) sein...

Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter