PDA

Volledige versie bekijken : Oude snake variant


Roenes
%Europe/Berlin %453 %2005, 11:52
Hey all,

Om de drempel om hier te posten wat te verlagen voor sommige mensen heb ik eens in me oude flashzooi gekeken of daar nog iets leuks stond. Daar kwam ik een oude Snake variant tegen die helemaal in AS gemaakt is. Met oud bedoel ik dan het proto tijdperk ;)

Nou weet ik dat aan deze versie qua code zat mankeert. Het kan nu velen malen beter. Zowel in AS1 als AS2. Ook kan ie nog een heel eind geoptimaliseerd worden. Nou wilde ik dat eens een x niet zelf doen maar jullie de kans geven. Ga eens lekker aan het prutsen en kijk eens wat je ervan kan maken. Zoiezo kan het in een stuk minder regels. Of je AS1 of AS2 gebruikt maakt me niet uit. :)

Aan de wat gevorderden scripters zou ik willen vragen om in eerste instantie geen (aangepaste) versie hier neer te zetten want ik weet dat het voor jullie een makkie is. Maar als zo'n versie er staat dan is het voor de iets minder gevorderde scripter misschien afschrikwekkend om zijn/haar versie te tonen. Uiteraard kunnen de "gevorderden" wel tips geven ed aan anderen. Je moet zelf maar zien tot welke groep je je rekend. Dat doe ik niet ;)

Najah, lang zat geluld! (mag vast niet door de woordfilter :D) Hier is de code:

Je moet de swf publishen naar FlashPlayer 6 aangezien FlashPlayer 7 geen prototypes meer ondersteund. Sorry voor dit ongemak :)


/* movie settings */
fscommand("allowscale", false);
fscommand("showmenu", false);

/* the needed vars */
field = { width:250, height:250 };
square = { width:10, height:10 };
score = 0;
speed = 10;
tail = 0;
snakePos = new Array();
tFF = new TextFormat("Verdana", 10, 0xFFFFFF, false, false, false, "", "", "center");

/* prototype for creating squares */
MovieClip.prototype.drawSquare = function(col, al, w, h)
{
this.beginFill(col, al);
this.lineTo(w, 0);
this.lineTo(w, h);
this.lineTo(0, h);
this.lineTo(0, 0);
this.endFill();
}

/* prototype for creating circles */
MovieClip.prototype.drawCircle = function(col, al, x, y, r)
{
this.beginFill(col, al);
this.moveTo(x-r, y);
this.curveTo(x-r, y-r, x, y-r);
this.curveTo(x+r, y-r, x+r, y);
this.curveTo(x+r, y+r, x, y+r);
this.curveTo(x-r, y+r, x-r, y);
this.endFill();
}

/* prototype for placing an mc at a random position */
MovieClip.prototype.randomPos = function(fw, fh, sw, sh)
{
var stringX = Math.round(Math.random() * (fw-sw)).toString();
var stringY = Math.round(Math.random() * (fh-sh)).toString();
var tempX = stringX.slice(0, stringX.length-1).concat(0);
var tempY = stringY.slice(0, stringY.length-1).concat(0);

var sP = this._parent.snakePos;
var sPLen = sP.length
for(var i = 0; i <= sPLen; ++i)
{
if(tempX == sP[i][0] && tempY == sP[i][1])
{
this.randomPos(field.width, field.height, square.width, square.height);
break;
}
else
{
this._x = tempX;
this._y = tempY;
}
}
}

/* prototype for a hittest between the head and the body of the snake */
MovieClip.prototype.selfHitTest = function()
{
var sP = this._parent.snakePos;
var sPLen = sP.length;
for(var i = 1; i < sPLen; ++i)
{
if(this._x == sP[i][0] && this._y == sP[i][1])
{
this.onEnterFrame = function()
{
this._alpha -= 5;
for(var i = 0; i < this._parent.tail; ++i)
{
var name = "tail"+i;
this._parent[name]._alpha -= 5;
}
if(this._alpha <= 0)
{
this.onEnterFrame = null;
}
}
}
}
}

/* prototype for a hittest between the head of the snake and the spot */
MovieClip.prototype.spotHitTest = function()
{
if(this._x == this._parent.head._x && this._y == this._parent.head._y)
{
var name = "tail"+tail;
++tail;
this._parent.createEmptyMovieClip(name, ++depth);
this._parent[name].drawSquare(0x00FF66, 100, square.width, square.height);
this._parent.snakePos[tail] = [this._x, this._y];

this._parent.score += 10;
this._parent.scoreboard.scoreTF.text = "Score is: " + this._parent.score;
this._parent.scoreboard.scoreTF.setTextFormat(tFF) ;

this.randomPos(field.width, field.height, square.width, square.height);
}
}

/* prototype for placing the head to the other side of the field when necessary */
MovieClip.prototype.moveOtherSide = function()
{
var headLowX = this._x;
var headHighX = this._x + this._width;
var headLowY = this._y;
var headHighY = this._y + this._height;

if(headLowX < 0) this._x = field.width-square.width;
if(headHighX > field.width) this._x = 0;
if(headLowY < 0) this._y = field.height-square.height;
if(headHighY > field.width) this._y = 0;
}

/* prototype for showing the scores */
MovieClip.prototype.showScores = function()
{

}

/* prototype for adding a score */
MovieClip.prototype.addScore = function()
{

}

/* the init function */
function init()
{
p = this.createEmptyMovieClip("playArea", ++depth);
p.drawSquare(0x0099FF, 100, field.width, field.height);

h = this.createEmptyMovieClip("head", 99999);
h.drawSquare(0x00FF66, 100, square.width, square.height);
e = h.createEmptyMovieClip("eyes", ++depth);
e.drawCircle(0x000000, 100, -square.width/4, 0, square.width/10);
e.drawCircle(0x000000, 100, square.width/4, 0, square.width/10);
e._x = square.width/2;
e._y = square.height/2;
h._x = field.width/2 - square.width/2;
h._y = field.height/2 - square.height/2;

s = this.createEmptyMovieClip("spot", ++depth);
s.drawCircle(0xFF0000, 75, 5, 5, 4);
s.moveTo(5, 3);
s.lineStyle(1.75, 0x000000, 100);
s.curveTo(5, 0, 2, 0);
s.randomPos(field.width, field.height, square.width, square.height);

s = this.createEmptyMovieClip("scoreboard", ++depth);
s._y = field.height;
s.drawSquare(0x0066FF, 75, field.width, 50);
s.createTextField("scoreTF", ++depth, 0, 0, 0, 0);
s.scoreTF.autoSize = true;
s.scoreTF.selectable = false;
s.scoreTF.text = "Score is: " + score;
s.scoreTF.setTextFormat(tFF);
s.createTextField("pauseTF", ++depth, 0, 35, 0, 15);
s.pauseTF.selectable = false;
s.pauseTF.autoSize = true;
s.pauseTF.text = "Press P for pause";
s.pauseTF.setTextFormat(tFF);
}
init();

/* watching which key is pressed */
kL = new Object();
kL.onKeyDown = function()
{
var tempKey = Key.getCode();
if(tempKey == 80 || tempKey == 37 || tempKey == 38 || tempKey == 39 || tempKey == 40) keyCode = tempKey;
}
Key.addListener(kL);

/* moving of the snake */
head.onEnterFrame = function()
{
/* P for pause */
if(keyCode != 80)
{
snakePos[0] = [this._x, this._y];
for(var i = 0; i <= this._parent.snakePos.length-1; ++i)
{
snakePos[i+1][0] = this._parent["tail"+i]._x;
snakePos[i+1][1] = this._parent["tail"+i]._y;
}

/* left arrow */
if(keyCode == 37 && dir != "right")
{
this._x -= speed;
this.eyes._rotation = 90;
dir = "left";
}
else if(keyCode == 37 && dir == "right") this._x += speed;
/* right arrow */
if(keyCode == 39 && dir != "left")
{
this._x += speed;
this.eyes._rotation = 90;
dir = "right";
}
else if(keyCode == 39 && dir == "left") this._x -= speed;
/* up arrow */
if(keyCode == 38 && dir != "down")
{
this._y -= speed;
this.eyes._rotation = 0;
dir = "up";
}
else if(keyCode == 38 && dir == "down") this._y += speed;
/* down arrow */
if(keyCode == 40 && dir != "up")
{
this._y += speed;
this.eyes._rotation = 0;
dir = "down";
}
else if(keyCode == 40 && dir == "up") this._y -= speed;

this.selfHitTest();
this.moveOtherSide();
spot.spotHitTest();

for(var i = 0; i <= snakePos.length-1; ++i)
{
this._parent["tail"+i]._x = snakePos[i][0];
this._parent["tail"+i]._y = snakePos[i][1];
}
}
}
ps. niet lachen om mijn uitermate mooie (met as getekende) snake en appeltje ;)

Mediamonkey
%Europe/Berlin %689 %2005, 17:32
Blijft toch leuk om zo'n oud spelletje in zo'n oude scripttaal te zien :P
Je zou er bijna nostalgisch van worden.

Smartie
%Europe/Berlin %711 %2005, 18:04
Heerlijk, al die 1 letterige variabelen, leest zo lekker makkelijk. Als ik ooit nog weer internet op mijn eigen pc krijg, zal ik er misschien wel eens naar kijken.

Roenes
%Europe/Berlin %732 %2005, 18:34
Blijft toch leuk om zo'n oud spelletje in zo'n oude scripttaal te zien :P
Je zou er bijna nostalgisch van worden.Mooi he? Vond ik ook al toen ik het weer eens zag :)

Heerlijk, al die 1 letterige variabelen, leest zo lekker makkelijk.Mooi he ;)

Die hadden er idd wel uit gemogen. Maar de meeste slaan wel ergens op zoals width, height, radius en zo. En als je ziet in welke context ze gebruikt worden spreken ze voor zich lijkt me :) (ook zijn er een aantal terug te leiden naar de wiskunde)

Dauntless
%Europe/Berlin %769 %2005, 19:28
Die hadden er idd wel uit gemogen. Maar de meeste slaan wel ergens op zoals width, height, radius en zo. En als je ziet in welke context ze gebruikt worden spreken ze voor zich lijkt me :) (ook zijn er een aantal terug te leiden naar de wiskunde)
Doet me denken aan een 1kb tetris game. Alles in AS, en ALLE variabele namen van 1 letter :D.

Euhm, mooi werk (van vroeger :p) :)

Roenes
%Europe/Berlin %797 %2005, 20:08
Doet me denken aan een 1kb tetris game. Alles in AS, en ALLE variabele namen van 1 letter :D.Die was idd zwaar vet. Is die AS code eigenlijk ergens te vinden? Of was die niet open source? :)

Dauntless
%Europe/Berlin %835 %2005, 21:03
Die was idd zwaar vet. Is die AS code eigenlijk ergens te vinden? Of was die niet open source? :)
Jwel... Je zou eens op flashkit moeten zoeken... Ik was hem daar eens tegengekomen....

Roenes
%Europe/Berlin %489 %2005, 12:45
Is er iemand die hiermee bezig is of hiermee bezig wilt gaan?

Of wordt deze topic een nutteloze poging om mensen aan te sporen hier te posten? ;)

matzo
%Europe/Berlin %493 %2005, 12:50
ik ben aan het proberen maar ik zie zelfs geen appel, enkel een slang

Roenes
%Europe/Berlin %502 %2005, 13:02
ik ben aan het proberen maar ik zie zelfs geen appel, enkel een slangDamn. Dat zie ik nu ook pas :| Dat komt als je em published op FlashPlayer 7. Deze ondersteund het gebruik van prototypes niet meer.

Dus als je even instelt dat de swf wordt gepublished als FlashPlayer 6, dan werkt het naar behoren :)

matzo
%Europe/Berlin %747 %2005, 18:55
Damn. Dat zie ik nu ook pas :| Dat komt als je em published op FlashPlayer 7. Deze ondersteund het gebruik van prototypes niet meer.

Dus als je even instelt dat de swf wordt gepublished als FlashPlayer 6, dan werkt het naar behoren :)
al gemerkt.
Het is wel moeilijk voor een dommerik like me

matzo
%Europe/Berlin %761 %2005, 19:16
wat betekent MovieClip.prototype.<something>

Roenes
%Europe/Berlin %774 %2005, 19:35
al gemerkt.
Het is wel moeilijk voor een dommerik like meWas meer mijn fout hoor :)

Wat betekent MovieClip.prototype.<something>Op deze manier kun je een functie toevoegen aan een bestaande classe (in dit geval MovieClip). Het voordeel hieraan is dat iedere instantie van die classe die nieuwe functie direct kan gebruiken op dezelfde manier als ingebakken functies. :)

Dus als je bv dit hebt:
MovieClip.prototype.doeBlaat = function()
{
trace("blaat!");
}Dan kun je die methode met iedere movieclip aanroepen op deze manier:
mijnMC.doeBlaat();Je kunt dit bij iedere class doen. Bij AS2 doe je dat op een andere manier. Met overerving. Maar daar ga ik nu niet over uitwijken :)

matzo
%Europe/Berlin %777 %2005, 19:39
Was meer mijn fout hoor :)

Op deze manier kun je een functie toevoegen aan een bestaande classe (in dit geval MovieClip). Het voordeel hieraan is dat iedere instantie van die classe die nieuwe functie direct kan gebruiken op dezelfde manier als ingebakken functies. :)

Dus als je bv dit hebt:
MovieClip.prototype.doeBlaat = function()
{
trace("blaat!");
}Dan kun je die methode met iedere movieclip aanroepen op deze manier:
mijnMC.doeBlaat();Je kunt dit bij iedere class doen. Bij AS2 doe je dat op een andere manier. Met overerving. Maar daar ga ik nu niet over uitwijken :)
maar dauntless zijn vuurwerk gebruikt dat ook maar publisht wel op player 7

Roenes
%Europe/Berlin %780 %2005, 19:43
Misschien met ActionScript 1 gespecificeerd? Ik weet het niet. Ik merkte alleen dat als ik em publish op FP6 dat het naar behoren werkt. Je kunt het vast wel op FP7 werkend krijgen maar ik had geen zin om uit te zoeken waar het precies aan lag. Ik weet wel dat FP7 kan flippen met proto's :)

Tha Narie
%Europe/Berlin %811 %2005, 20:27
Proto's in FP7 en 8 werken qua gebruik iets anders.

Dit werkte voorheen gewoon:
"(blaat").customFunction();

Nu moet je doen:
var s = "blaat";
s.customFunction();

Je moet het echt in een String variable zetten alvorens hem te gebruiken.

matzo
%Europe/Berlin %732 %2005, 18:34
ben nu eigen snake prog aan het schrijven(gebaseerd op jou as code) omdat ik dat van jou (Roenes) net snapte maar niet wist hoe ik het moest optimaliseren, heb al een redelijk begin, maar nog geen appel, en dus ook nog geen langer wordende slang, eigenlijk enkel, de richting een een werkend inputveld voor snelheid. heb onEnterFrame daarom gemijdt.
zie bijlage, ben ik goed op weg?

Roenes
%Europe/Berlin %754 %2005, 19:06
Ik zal er later eens naar kijken. In ieder geval leuk om te zien dat je er mee bezig bent :)

Roenes
%Europe/Berlin %787 %2005, 19:54
Ik heb er even naar gekeken en heb een paar kleine opmerkingen:
- FPS hoeft niet op 120 te staan
- Keuze setInterval ipv onEnterFrame is persoonlijk. Voor beide valt wat te zeggen :)
- Bovenaan begin je netjes met AS2 door datatypes aan te geven, verderop doe je dat niet meer.
- Voor het kijken welke kant snake moet bewegen gebruik je een onenterframe functie (zelf gemaakt) en een Keylistener. Dat deed ik ook. Alleen jij hebt 2 vrij uitgebreide functies. Wellicht kan het ook met 1 van de 2. Dus OF een listener OF een onenterframe.

Voor de rest ben je goed bezig hoor en volgens mij moet je wel een leuke snake in elkaar kunnen krijgen :)

matzo
%Europe/Berlin %811 %2005, 20:28
Ik heb er even naar gekeken en heb een paar kleine opmerkingen:
- FPS hoeft niet op 120 te staan [1]
- Keuze setInterval ipv onEnterFrame is persoonlijk. Voor beide valt wat te zeggen :)[2]
- Bovenaan begin je netjes met AS2 door datatypes aan te geven, verderop doe je dat niet meer.[3]
- Voor het kijken welke kant snake moet bewegen gebruik je een onenterframe functie (zelf gemaakt) en een Keylistener. Dat deed ik ook. Alleen jij hebt 2 vrij uitgebreide functies. Wellicht kan het ook met 1 van de 2. Dus OF een listener OF een onenterframe.
[4]

Voor de rest ben je goed bezig hoor en volgens mij moet je wel een leuke snake in elkaar kunnen krijgen :)
[1] wel local bij mij liep het iets smoother met 50 ipv 12, dus heb ik het ineens op het maximum (dus 120) gezet, zonder er bij na te denken.
[2] Ja inderdaad, heb ondermeer ook voor setInterval gekozen omdat je dan makkelijk de snelheid kunt veranderen.
[3] Inderdaad, datatypes aangeven is iets wat ik pas sinds dit project doe, uit jullie voorbeelden, dus daarom dat ik dat soms vergeet.
[4] je hebt toch zoiezo allebei nodig indien je niet wilt dat de speler de up-down-left of right knop steeds moet blijven indrukken. een listener en een onenterframe of iets gelijkaardig, zoals mijn functie met een interval(dacht ik)

Roenes
%Europe/Berlin %016 %2005, 01:24
[2] Ja inderdaad, heb ondermeer ook voor setInterval gekozen omdat je dan makkelijk de snelheid kunt veranderen.Dat is idd dan wel de meest makkelijke manier. :)

[4] je hebt toch zoiezo allebei nodig indien je niet wilt dat de speler de up-down-left of right knop steeds moet blijven indrukken.Dat was dus de reden waarom ik ook zowel een onEnterFrame als Listener had. :D

Ik wist niet meer waarom ik dat had gedaan :)

Dauntless
%Europe/Berlin %294 %2005, 08:03
onenterframe = function(){
Zou ik eerder niet gebruiken. De twee manieren hebben alletwee hun voordeel maar het voordeel van deze functie toewijzing is iets dat je in mijn ogen ook niet zou mogen gebruiken.

Voorbeeld
foo();
foo1();
foo1 = function(){
trace("foo1");
}
function foo(){
trace("foo");
}

Zoals je ziet (als je dit test) krijg je alleen 'foo' te zien. Dit is omdat het een functie, toegekend aan een variabele is en die variabele bestaat nog niet bij het uitvoeren ervan.

Voordeel van foo1 = function:

foo();
function foo(){
trace("foo");
if(true){
function foo1(){
trace("foo1");
}
}
foo1();
}
//dan krijg je 'foo'

foo();
function foo() {
trace("foo");
if (true) {
foo1 = function () {
trace("foo1");
};
}
foo1();
}
//en dan krijg je: foo, foo1 .

Daarnaast lijkt dit me handiger:

mylistener.onKeyDown = function() {
var d = Key.getCode();
if (d == Key.UP) {
if (dir != "Up") {
dir = "Up";
}
} else if (d == Key.DOWN) {
if (dir != "Down") {
dir = "Down"
}
} else if (d == Key.LEFT) {
if (dir != "Left") {
dir = "Left";
}
} else if (d == Key.RIGHT) {
if (dir != "Right") {
dir = "Right";
}
} else if (d == 80) {
dir = null;
} else if (d == 32){
gatherinput();
}
};

Dus 1x de dir instellen en dan pikt de onEnterFrame die wel op. Ook kan je dan die dir="..."; uit de up/down/left/right functies halen.

Maar al een goed begin! (y)

Roenes
%Europe/Berlin %437 %2005, 11:29
Daarnaast lijkt dit me handiger:

mylistener.onKeyDown = function() {
var d = Key.getCode();
if (d == Key.UP) {
if (dir != "Up") {
dir = "Up";
}
} else if (d == Key.DOWN) {
if (dir != "Down") {
dir = "Down"
}
} else if (d == Key.LEFT) {
if (dir != "Left") {
dir = "Left";
}
} else if (d == Key.RIGHT) {
if (dir != "Right") {
dir = "Right";
}
} else if (d == 80) {
dir = null;
} else if (d == 32){
gatherinput();
}
};
Waarom steeds zo'n sub ifje? kan toch gewoon in 1 if:

mylistener.onKeyDown = function() {
var d = Key.getCode();
if (d == Key.UP && dir != "Up") dir = "Up";
else if (d == Key.DOWN && dir != "Down") dir = "Down"
else if (d == Key.LEFT && dir != "Left") dir = "Left";
else if (d == Key.RIGHT && dir != "Right") dir = "Right";
else if (d == 80) dir = null;
else if (d == 32) gatherinput();
};

Dauntless
%Europe/Berlin %452 %2005, 11:50
Waarom steeds zo'n sub ifje? kan toch gewoon in 1 if:

mylistener.onKeyDown = function() {
var d = Key.getCode();
if (d == Key.UP && dir != "Up") dir = "Up";
else if (d == Key.DOWN && dir != "Down") dir = "Down"
else if (d == Key.LEFT && dir != "Left") dir = "Left";
else if (d == Key.RIGHT && dir != "Right") dir = "Right";
else if (d == 80) dir = null;
else if (d == 32) gatherinput();
};
Daar had ik niet opgelet, zo stond het in z'n file :). (Maar dat van jou is idd handiger).

Roenes
%Europe/Berlin %458 %2005, 11:59
Daar had ik niet opgelet, zo stond het in z'n file :).Daar had ik weer niet op gelet, iets te snel gekeken :)

Flashingback
%Europe/Berlin %476 %2005, 12:26
heey ik denk dat ik dit ook is ga proberen daar kan ik volgens mij weer wat dingen uit leren.

matzo
%Europe/Berlin %505 %2005, 13:08
mijn snake is nu full function maar ik heb last met het Alert.show op het laatste, de eerste werkt perfect, degene als je verloren hebt werkt niet:-(
code optimalisatie is nog niet gedaan.
zal ik sebiet doen

Roenes
%Europe/Berlin %564 %2005, 14:33
Hij werkt leuk moet ik zeggen. Over de code zeg ik nog even niets. Ik wacht even tot je em geoptimaliseert hebt. Wel even 2 kleine dingen:

- Je kunt al beginnen voordat je op OK hebt gedrukt in het alert venster
- De ogen van snake draaien niet mee. Daarom kijkt hij soms tegen zijn eigen lijf terwijl hij verplaatst. :D Misschien leuk om die ogen mee te laten draaien :)

matzo
%Europe/Berlin %759 %2005, 19:13
een ietwat geoptimaliseerde versie, bijna niet maar ik wist niks anders te optimaliseren

matzo
%Europe/Berlin %910 %2005, 22:50
nu gezorgd dat alles te maken met het veld veranderd kan worden door 4 dingen te veranderen, maar weet iemand hoe ik die Alert kan oplossen :confused: :D