Main Menu

Snake Game

Started by ATLUS, March 31, 2012, 10:39:11 AM

Previous topic - Next topic

ATLUS

Hi guys.

This my first snake game! I spent 24 hours on all =)

and in this topic source code

http://www.underwaredesign.com/forums/index.php?topic=3133.0

http://file.kirovnet.ru/d/612238/snake.rar

kevin


Well done.. plays like good old snake..

ATLUS


kevin

#3
   Here's a bit of intro screen replacement for you,  it just adds a fade from and to black around the title screen.  Make sure you load the title picture as an FX image.

ie

 loadFXimage "gfx/titlescreen.png",5

PlayBASIC Code: [Select]
   loadFXimage "gfx/titlescreen.png",5


title_screen(5)


function Title_Screen(TitleScreenIMage)

Spr=NewSprite(0,0,TitleScreenIMage)
SpriteDrawMode Spr,2

Mode=0

; Time Fade should take in milliseconds
Duration =500

; when the just effect is to complete and move to the next mode
StartTime=Timer()
EndTime=StartTime+Duration

do

CurrentTime=Timer()
TimePast=CurrentTime-STartTime

Select Mode

; ---------------------------
; FADE IN
; ---------------------------
case 0

if CurrentTime<EndTime
Level#=TimePast*(255.0/Duration)
else

level#=255
Mode++
endif

; ---------------------------
; Wait for Key press
; ---------------------------
case 1

if scancode()<>0
StartTime=CurrentTime
EndTime=CurrentTime+Duration
Mode =2

endif


; ---------------------------
; FADE OUT
; ---------------------------
case 2

if CurrentTime<EndTime
Level#=255.0-(TimePast*(255.0/Duration))
else
mode++
endif

; ---------------------------
; Fade Complete, so exit do loop
; ---------------------------
case 3
exitdo

EndSelect

C=LEvel#
c=argb(255,c,c,c)
spritetint Spr,C
drawsprite spr

sync
loop

; kill the temp sprite used in the intro
deletesprite spr

endfunction



 

ATLUS

this is the very thing that I wanted to add, Thank you Kevin =)

kevin

#5
 Looking at the code there's a few bits of code that can be tweaked up a bit.

For example, the code draws the screen edges

PlayBASIC Code: [Select]
   // draw walls
for c=0 to 800 step 40
drawimage 3,c,0,1
next c

for c=0 to 800 step 40
drawimage 3,c,560,1
next c
[/code]

Can just be done in one loop

<div class="codeheader"><span class="code floatleft">Code</span> <a class="codeoperation smf_select_text">Select</a> <a class="codeoperation smf_expand_code hidden" data-shrink-txt="Shrink" data-expand-txt="Expand">Expand</a></div><code class="bbc_code">
<span style="white-space: pre;"> </span>// draw walls
<span style="white-space: pre;"> </span>for c=0 to 800 step 40
<span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span>drawimage 3,c,0,1
<span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span>drawimage 3,c,560,1
<span style="white-space: pre;"> </span>next c
</code>


What you could do, is draw the environmental stuff (boarders/backdrop colour) to a screen size image, then simply draw the image each frame.


In some other places, there's loops that are polling array values that never change <b>inside</b> the loop. While not such a huge issue in this type of game, this can blow out to be very expensive in larger projects.

[code]

for m=5 to 90 step 1
if(player(1).xpos=player(m).xpos and player(1).ypos=player(m).ypos and player(m).fl = true)
eact=true
playsound 2
endif
next m



  So the above loop like this can be tweaked up a bit like this..

PlayBASIC Code: [Select]
        CurrentXpos=player(1).xpos
CurrentYpos=player(1).ypos

; we don't need the step here FOR loops, loop by positive one by default.
for m=5 to 90
; check if this thing is active
if player(m).fl = true
; if so, then check for the match
if ( CurrentXpos=player(m).xpos and CurrentYpos=player(m).ypos)
eact=true
playsound 2
endif
endif
next m



 You can find all sorts of such tips in A Crash Course In Optimization tutorial



ATLUS

nice useful improvements, Thank you Kevin =)

I see some improvements too

x=rndrange(1,19)
x += 40-mod(x,40)
y=rndrange(40,520)
y += 40-mod(y,40)

tweaked up

x=rndrange(1,19)
x *= 40
y=rndrange(1,14)
y *= 40


if direct = 1
tempx=player(1).xpos
tempy=player(1).ypos
score += 5
player(1).xpos -= tile
playsound 3
for i=2 to n
tempx1 = player(i).xpos
tempy1 = player(i).ypos

player(i).xpos = tempx
player(i).ypos = tempy

tempx = tempx1
tempy = tempy1
next i
time = timer()
endif


tweaked up

if direct = 1
player(0).xpos=player(1).xpos
player(0).ypos=player(1).ypos
score += 5
player(1).xpos -= tile
playsound 3
for i=2 to n
tempx1 = player(i).xpos
tempy1 = player(i).ypos

player(i).xpos = player(0).xpos
player(i).ypos = player(0).ypos

player(0).xpos = tempx1
player(0).ypos = tempy1
next i
time = timer()
endif

kevin

#7

When the snake moves, do you actually need more than one copy loop for the tail ?  Looks like you just place that code inside a function and then call that each time.  

 something like,



Function Copy_Tail_Down(n)
for i=2 to n
tempx1 = player(i).xpos
tempy1 = player(i).ypos

player(i).xpos = player(0).xpos
player(i).ypos = player(0).ypos

player(0).xpos = tempx1
player(0).ypos = tempy1
next i
EndFunction






ATLUS

I add all new improvements, Thank you so much Kevin! =)

ATLUS

Some code update and add new title.

micky4fun

Hi All

nice one ATLUS , i got upto 38 , its get quite fast and i keep getting myself trapped in my own tail ,

mick

Sigtrygg

Hello Atlus!

Exiting game! Finaly it was very fast  :)

I scored 4405!

Greetings by

Sigtrygg

ATLUS

#12
Hi Guys, Thank you for playing ^__^ My record 3120 =]


Sigtrygg nice score!

poor forum score :D board:

1.Sigtrygg  4405
2.micky4fun 3800
3.ATLUS 3120

monkeybot

#13
5455
it was going really fast,i panicked!

ATLUS

Huh big scrore good job monkeybot =)

poor forum score Cheesy board:
1.monkeybot 5455
2.Sigtrygg 4405
3.micky4fun 3800
4.ATLUS 3120

Thank You for playing!