The Jump, perus hyppelypeli

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Post Reply
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

The Jump, perus hyppelypeli

Post by Wingman »

Taas olen istunut liian paljon koneen ääressä, sillä näinkin simppelistä ideasta olen pelin tehnyt. Samanlaisia pelejä löytyy vaikka millä mitalla, ja tämänkin sorsa on jo pikku pelit -topiikissa. Tähän versioon on kuitenkin tulossa (suunnilleen tällä viikolla) paljon achievementteja, muutamia ideoita on jo.
Lisäksi, peli ei tarvitse toimiakseen muuta kuin .exen, mutta kahdella .xm-filulla saa peliin musiikit ja niihin perustuvia efektejä. Peli siis tekee grafiikat koodissa, vaikka ajon aikana tallentaakin pelihahmon kuvan kansioon, jotta sen voi ladata animoituna.

Ennen kaikkea, haluan kommentteja/ideoita jne. jne. Koodi ja paketti (paketissa mukana myös koodi):

Code: Select all

Const XST=5
Const YST=5
w=250
h=150
SCREEN w*2,h*2,0,1
SCREEN w,h,0,2
Const VALI=20
Type SEL
	Field x
	Field y
	Field c
	Field id
	Field txt As String
EndType
Type PAL
	Field x As Float 
	Field y As Float 
	Field kx As Float 
	Field ky As Float 
	Field s
	Field is
EndType 
sss=h/20
pa.PAL=New(PAL)
pa\x=0
pa\y=h/2
pa\s=sss
ukko=MakeImage(6,4)
mouse=MakeImage(6,6)
start=Timer()
font=LoadFont("courier new",12)
SetFont font 
logo=MakeImage(TextWidth("The Jump"),TextHeight("The Jump"))
logo2=MakeImage(TextWidth("The Jump"),TextHeight("The Jump"))
teks=TextHeight("")-4
d=3
DrawToImage ukko
	//1. Frame
	Dot 0,1
	Dot 1,1
	Dot 2,1
	Dot 1,2
	Dot 0,3
	Dot 2,3
	//2. Frame
	Dot 3,1
	Dot 4,1
	Dot 5,1
	Dot 4,2
	Dot 4,3
DrawToImage mouse
	Color 1,1,1
	For i=0 To 6
		Line 0,0,6-i,6
	Next i
	Color 255,170,0
	Line 0,0,6,6
	Line 0,0,0,6
	Line 0,5,5,5
DrawToImage logo
	Color 42*1.2,42*1.5,42*1.8
	Text 0,0,"The Jump"
DrawToImage logo2
	Color 127,127*1.5,127*2
	Text 0,0,"The Jump"
DrawToScreen
ResizeImage logo,TextWidth("The Jump")*3,TextHeight("The Jump")*3
ResizeImage logo2,TextWidth("The Jump")*3,TextHeight("The Jump")*3
RotateImage mouse,90
Type BOXIT	
	Field x As Float 
	Field spe As Float
	Field le
	Field id
EndType 
Type TBOX
	Field x As Float 
	Field spe As Float 
	Field y As Float 
	Field m
EndType 
Type STAR
	Field x As Float 
	Field y As Float
	Field yy As Float 
	Field is2
	Field spe As Float 
	Field jako As Float 
EndType
SaveImage ukko,"ukko.png"
ukko1=LoadAnimImage("ukko.png",3,4,0,2)
f=OpenToEdit("score.txt")
rpist=ReadInt(f)
rmatk=ReadInt(f)
rboos=ReadInt(f)
rtahd=ReadInt(f)
CloseFile f
SAFEEXIT OFF 
ShowMouse OFF 
ms=1
mx=MouseX()
my=MouseY()
vy=ImageHeight(logo)+3
music=1
debug=0
tausta=1
bpm=130
askel=100
Locate 0,vy
For i=1 To 5
	se.SEL=New(SEL)
	se\x=w/2
	se\y=vy+i*(teks+6)
	se\c=255
	se\id=i
	Select i
		Case 1
			se\txt="Start"
		Case 2
			se\txt="Options"
		Case 3
			se\txt="About & Help"
		Case 4
			se\txt="Credits"
		Case 5
			se\txt="Quit"
	EndSelect 
Next i
menu:
If SoundPlaying(mus) Then 
	StopSound mus 
EndIf 
If FileExists("menumusic.xm") And music=1 Then 
	mus=PlaySound("menumusic.xm",20)
EndIf 
Repeat 
	If FileExists("menumusic.xm") And SoundPlaying(mus)=0 And music=1 Then 
		mus=PlaySound("menumusic.xm",20)
	EndIf 
	If debug=0 Then 
		ClearText
	EndIf 
	DrawImage logo,w/2-ImageWidth(logo)/2,2
	DrawImage logo2,w/2-ImageWidth(logo2)/2-3,-1
	For se.SEL=Each SEL
		If se\id<6 Then 
		se\c=127-Min(85,Distance(se\x/(w/40),se\y,mx/(w/40),my)*4)
		Color 0.2*se\c,0.2*se\c*1.5,0.2*se\c*2
		Box se\x-2-TextWidth(se\txt)/2,se\y-d*2,TextWidth(se\txt)+4,TextHeight(se\txt),1
		Color se\c,se\c*1.5,se\c*2
		Box se\x-2-TextWidth(se\txt)/2,se\y-d*2,TextWidth(se\txt)+4,TextHeight(se\txt),0
		CenterText se\x,se\y,se\txt,2
		If Distance(0,se\y,0,my)<8 Then 
			If MouseHit(1) Or KeyHit(28) Then 
				If debug=1 Then 
					AddText se\txt
				EndIf 
				Select se\id
					Case 1
						Goto game
					Case 2
						Goto optio
					Case 3
						Goto about
					Case 4
						Goto credits
					Case 5
						Goto loppu
				EndSelect 
			EndIf 
		EndIf 
		EndIf 
	Next se
	mx=MouseX()
	my=MouseY()
	Color 120,120,120
	Line 0,vy,w,vy
	DrawImage mouse,MouseX(),MouseY()
	DrawScreen 
Until KeyHit(1)
Goto loppu
game:
cc#=0
x=50
y#=h-30
x2#=51
y2#=h-33
yvel#=0
spe#=4
sped#=4
b.BOXIT=New(BOXIT)
b\x=0
b\spe=spe
b\le=w
b\id=boxis+1
boxis+1
If tausta=1 Then 
	bo.TBOX=New(TBOX)
	bo\x=w
	bo\spe=sped/2
	bo\y=120
	bo\m=1
	bo.TBOX=New(TBOX)
	bo\x=w
	bo\spe=sped/1.5
	bo\y=140
	bo\m=2
EndIf 
boxialla=1
pisteet=0
matka=0
h2=10
xx#=0
rn1#=1
rn2#=1.5
rn3#=2
yy#=h/3
rn11#=CurveValue(rn1,rn11,20)
rn22#=CurveValue(rn2,rn22,20)
rn33#=CurveValue(rn3,rn33,20)
If SoundPlaying(mus) Then 
	StopSound mus 
EndIf 
If FileExists("ingame.xm") And music=1 Then 
	mus=PlaySound("ingame.xm",20)
EndIf 
rrt=2
Repeat
	If FileExists("ingame.xm") And SoundPlaying(mus)=0 And music=1 Then 
		mus=PlaySound("ingame.xm",20)
	EndIf 
	If FileExists("ingame.xm") And music=1 Then 
		aika=Timer()-start
		väli=60000/bpm
		tahdit=aika/(väli*4)+1
		pattern=aika/(väli*16)+1
		iskut=aika/väli+1 
		If iskut>is Then 
			rr#=rrt
			is=iskut
		EndIf 
		If tahdit>4 Then 
			rrt=5
		EndIf 
		rr=rr-0.2
		rr=Max(0,rr)
	Else 
		rr=0.5
	EndIf 
	xx+0.1
	If xx>w+30 Then xx=-30
	If matka>m+2000 Then 
		rn1=Rnd(1,2)
		rn2=Rnd(1,2)
		rn3=Rnd(1,2)
		m=matka
		x=x+1
		sped=sped+0.5
	EndIf 
	If y>h-29 Then 
		rn11#=CurveValue(0,rn11,20)
		rn22#=CurveValue(0,rn22,20)
		rn33#=CurveValue(0,rn33,20)
		te=0
	Else 
		rn11#=CurveValue(rn1,rn11,20)
		rn22#=CurveValue(rn2,rn22,20)
		rn33#=CurveValue(rn3,rn33,20)
	EndIf
	If tausta=1 Then 
		Gosub meta 
	Else 
		For i=0 To 120 
			Color Min(255,i*(rn11+rr/10)),Min(255,i*(rn22+rr/10)),Min(255,i*(rn33+rr/10))
			Line 0,h-30-i,w,h-30-i
		Next i
	EndIf
	Color 60*rn11,60*rn22,60*rn33
	Line 0,h-29,w,h-29
	For p.TBOX=Each TBOX
		cc=0
		If p\m<2 Then 
		For yyy=p\y To h
			cc+1
			Color Max(0,(40+p\spe)-cc)*rn11,Max(0,(40+p\spe)-cc)*rn22,Max(0,(40+p\spe)-cc)*rn33
			Line p\x,yyy,p\x+VALI+sped,yyy
		Next yyy
		EndIf 
		p\x-p\spe
		
		If p\m=1 And p\x<w-VALI And tausta=1 Then 
			bo.TBOX=New(TBOX)
			bo\x=w
			bo\spe=spe/2
			bo\y=p\y+Rnd(-3,3)
			If bo\y>h-20 Then bo\y=p\y+Rand(-1,0)*10
			If bo\y<h-40 Then bo\y=p\y+Rand(0,1)*10
			bo\m=1
			p\m=0
		EndIf 
		If p\m=2 And p\x<w-VALI And tausta=1 Then 
			bo.TBOX=New(TBOX)
			bo\x=w
			bo\spe=spe/1.5
			bo\y=p\y+Rnd(-3,3)
			If bo\y>h Then bo\y=p\y+Rand(-1,0)*10
			If bo\y<h-20 Then bo\y=p\y+Rand(0,1)*10
			bo\m=2
			p\m=3
		EndIf 
		If p\x<-VALI Then Delete p
	Next p
	For p2.TBOX=Each TBOX
		cc=0
		If p2\m>1 Then  
		For yyy=p2\y To h
			cc+1
			Color Max(0,(80+p2\spe*2)-cc)*rn11,Max(0,(80+p2\spe*2)-cc)*rn22,Max(0,(80+p2\spe*2)-cc)*rn33
			Line p2\x,yyy,p2\x+VALI+sped,yyy
		Next yyy
		EndIf 
	Next p2
		
	For s.STAR=Each STAR
		If s\spe<=sped Then 
		Color Min(255,120*(rn11+rr/10)),Min(255,120*(rn22+rr/10)),Min(255,120*(rn33+rr/10))
		Box s\x,s\y,1,1,1
		s\x=s\x-s\spe
		s\y=CurveValue(s\yy,s\y,10)
		If iskut>s\is2 Then 
			s\y=s\y+Rnd(-4,0)
			s\is2=iskut
		EndIf 
		s\spe=spe/s\jako
		If s\x<0 Then Delete s 
		If BoxOverlap(x,y-3,6,4,s\x,s\y,1,1) Then
			Delete s
			napattu+1
		EndIf 
		EndIf 
	Next s
	For b.BOXIT=Each BOXIT
		Color 80*rn11,80*rn22,80*rn33
		Box b\x,h-29,b\le,h2
		If y<h-29 Then 
			Color 255,170,0
		Else 
			Color 120*rn11,60*rn22,1*rn33
		EndIf 
		Line b\x,h-29,b\x+b\le-1,h-29
		Line b\x,h-29+h2,b\x+b\le-1,h-29+h2
		Line b\x,h-29,b\x,h-29+h2
		Line b\x+b\le,h-29,b\x+b\le,h-29+h2
		b\x-b\spe
		b\spe=spe
		If b\x+b\le<w And boxis<2 Then 
			b2.BOXIT=New(BOXIT)
			b2\x=w+100
			b2\spe=spe
			b2\le=Rand(10,60)*10
			b2\id=boxis+1
			boxis+1
		EndIf 
		If b\x+b\le<0 Then 
			Delete b
			boxis-1
			If y<h-30 Then 
				pisteet+1	
			EndIf 
		EndIf 
	Next b
	Lock 
		pix=GetPixel2(x,y+1)
	Unlock
	For s.STAR=Each STAR
		If s\spe>sped Then 
		Color Min(255,120*(rn11+rr/10)),Min(255,120*(rn22+rr/10)),Min(255,120*(rn33+rr/10))
		Box s\x,s\y,1,1,1
		s\x=s\x-s\spe
		s\y=CurveValue(s\yy,s\y,20)
		If iskut>s\is2 Then 
			s\y=s\y+Rnd(-4,0)
			s\is2=iskut
		EndIf 
		s\spe=spe/s\jako
		If s\x<0 Then Delete s 
		If BoxOverlap(x,y-3,6,4,s\x,s\y,1,1) Then 
			Delete s
			napattu+1
		EndIf 
		EndIf 
	Next s 
	If y=h-30 Then 
		hypyt=0
		If pix=-22016 Then 
			boxialla=1
		Else 
			boxialla=0
		EndIf 
	EndIf 
	yvel=yvel-0.092
	If KeyHit(57) And boxialla=1 And hypyt<2 Then 
		yvel=2
		hypyt+1
	EndIf 
	If KeyHit(19) Then 
		rn1#=1
		rn2#=1.5
		rn3#=2
		y=h-50
		x=50
		yvel=0
		x2#=51
		y2#=h-53
		boxialla=1
		te=200
		sped=4
		If pisteet>rpist Then 
			rpist=pisteet
		EndIf 
		If matka>rmatk Then 
			rmatk=matka
		EndIf 
		If boostiaika>rboos Then 
			rboos=boostiaika
		EndIf 
		If napattu>rtahd Then 
			rtahd=napattu
		EndIf 
		boostiaika=0
		pisteet=0
		matka=0
		napattu=0
		m=matka
	EndIf 
	If pisteet>rpist Then 
		rpist=pisteet
	EndIf 
	If matka>rmatk Then 
		rmatk=matka
	EndIf 
	If boostiaika>rboos Then 
		rboos=boostiaika
	EndIf 
	If napattu>rtahd Then 
		rtahd=napattu
	EndIf 
	Color Max(0,Min(255,255-255*rn11)),Max(0,Min(255,255-255*rn33)),Max(0,Min(255,255-255*rn22))
	Text 0,0,"Score          : "+pisteet
	Text 0,teks,"Meters         : "+matka/20+"m"
	Text 0,teks*2,"Overall boost  : "+boostiaika+"s" 
	Text 0,teks*3,"Stars Cought   : "+napattu
	Text 0,teks*4,"Best score     : "+rpist
	Text 0,teks*5,"Best d"+"istance  : "+rmatk/20+"m"
	Text 0,teks*6,"Best boost t"+"ime: "+rboos+"s"
	Text 0,teks*7,"Most stars cought : "+rtahd
	Color 255,170,0
	If te>0 Then 
		CenterText w/2,h-60,"GO!"
		te-3
	EndIf 
	If y>h-29 Then 
		CenterText w/2,h-60,"R t"+"o try again"
	EndIf 
	If y<h Then 
		matka=matka+spe
		y-yvel
	EndIf 
	If y>h-30 And boxialla=1 Then 
		y=h-30
		yvel=0
	EndIf 
	If Timer()>t+askel Then 
		If y=h-30 Then 
			f=f+1
		Else 	
			f=0
		EndIf 
		t=Timer()
	EndIf 
	If KeyDown(42) Then 
		If y<h-29 Then 
		spe=CurveValue(sped+sped/2,spe,10)
		If Timer()>paa+1000 Then 
			boostiaika+1
			paa=Timer()
		EndIf
		x2=CurveValue(x-1,x2,8)
		EndIf 
	Else 
		spe=CurveValue(sped,spe,10)
		x2=CurveValue(x+1,x2,3)
	EndIf 
	For i=0 To rr*10 
		If Rand(20)=0 Then 
			s.STAR=New(STAR)
			s\x=w
			s\yy=Rand(h-100,h-30)
			s\y=s\yy
			s\jako=Rnd(0.5,3)
			s\spe=spe/s\jako
		EndIf 
	Next i
	Color 255,170,0
	y2=CurveValue(y-4,y2,8)
	If y2>y-3 Then y2=y-3
	Dot x2,y2
	If f>1 Then f=0 
	SetWindow "The Jump",0,"Your scores won't be saved unless you press esc t"+"o quit"
	DrawImage ukko1,x,y-3,f
	DrawImage mouse,MouseX(),MouseY()
	DrawScreen 
	If debug=0 Then 
		ClearText
	EndIf 
Until KeyHit(1)
Goto menu 

optio:
ClearMouse
For i=6 To 8
	se.SEL=New(SEL)
	se\x=w/2
	se\y=vy+(i-5)*(teks+6)
	se\c=255
	se\id=i
	Select i
		Case 6
			se\txt="Music"
		Case 7
			se\txt="Debug"
		Case 8
			se\txt="Background"
	EndSelect 
Next i
Repeat 
	For se.SEL=Each SEL
		If se\id>5 Then 
		se\c=127-Min(85,Distance(se\x/10,se\y,mx/10,my)*4)
		Select se\id
			Case 6
				Color 0.2*se\c,0.2*se\c*1.5,0.2*se\c*2
				Box se\x-2-TextWidth(se\txt+" "+music)/2,se\y-d*2,TextWidth(se\txt+" "+music)+4,TextHeight(se\txt),1
				Color se\c,se\c*1.5,se\c*2
				Box se\x-2-TextWidth(se\txt+" "+music)/2,se\y-d*2,TextWidth(se\txt+" "+music)+4,TextHeight(se\txt),0
				CenterText se\x,se\y,se\txt+" "+music,2
			Case 7
				Color 0.2*se\c,0.2*se\c*1.5,0.2*se\c*2
				Box se\x-2-TextWidth(se\txt+" "+debug)/2,se\y-d*2,TextWidth(se\txt+" "+debug)+4,TextHeight(se\txt),1
				Color se\c,se\c*1.5,se\c*2
				Box se\x-2-TextWidth(se\txt+" "+debug)/2,se\y-d*2,TextWidth(se\txt+" "+debug)+4,TextHeight(se\txt),0
				CenterText se\x,se\y,se\txt+" "+debug,2
			Case 8
				Color 0.2*se\c,0.2*se\c*1.5,0.2*se\c*2
				Box se\x-2-TextWidth(se\txt+" "+tausta)/2,se\y-d*2,TextWidth(se\txt+" "+tausta)+4,TextHeight(se\txt),1
				Color se\c,se\c*1.5,se\c*2
				Box se\x-2-TextWidth(se\txt+" "+tausta)/2,se\y-d*2,TextWidth(se\txt+" "+tausta)+4,TextHeight(se\txt),0
				CenterText se\x,se\y,se\txt+" "+tausta,2
		EndSelect 
		If Distance(0,se\y,0,my)<8 Then 
			If MouseHit(1) Or KeyHit(28) Then 
				If debug=1 Then 
					AddText se\txt
				EndIf 
				Select se\id
					Case 6
						music+1
						If music>1 Then music=0
					Case 7
						debug+1
						If debug>1 Then debug=0
					Case 8	
						tausta+1
						If tausta>1 Then tausta=0
				EndSelect 
			EndIf 
		EndIf 
		EndIf
	Next se 
	If debug=0 Then 
		ClearText
	EndIf 
	mx=MouseX()
	my=MouseY()
	DrawImage mouse,MouseX(),MouseY()
	DrawScreen 
Until KeyHit(1)
Goto menu 

about:
Repeat
	Color 42*1.2,42*1.5,42*1.8
	CenterText w/2,10+teks,"This is a typical game"
	CenterText w/2,10+teks*2,"where you control a dude" 
	CenterText w/2,10+teks*3,"which runs f"+"orever"
	CenterText w/2,10+teks*4,"Press space To jump" 
	CenterText w/2,10+teks*5,"R To recover"
	CenterText w/2,10+Teks*6,"Shift To boost"
	Color 30,30,30
	Text w-TextWidth("esc To go back"),h-teks,"Esc t"+"o go back" 
	DrawScreen  
	If debug=0 Then 
		ClearText
	EndIf 
Until KeyHit(1)
Goto menu

credits:
Repeat 
	Color 42*1.2,42*1.5,42*1.8
	CenterText w/2,10+teks,"  Code  : Elias Linjama"
	CenterText w/2,10+teks*2," Musics : Elias Linjama"
	CenterText w/2,10+teks*3,"Graphics: Elias Linjama"
	Color 30,30,30
	Text w-TextWidth("esc To go back"),h-teks,"Esc t"+"o go back" 
	DrawScreen  
	If debug=0 Then 
		ClearText
	EndIf 
Until KeyHit(1)
Goto menu 

loppu:
f=OpenToWrite("score.txt")
WriteInt f,rpist
WriteInt f,rmatk
WriteInt f,rboos
WriteInt f,rtahd
CloseFile f
DeleteFile "ukko.png"
End 

meta:
For pa.PAL=Each PAL 
		pa\x=xx
		pa\y=CurveValue(yy,pa\y,10)
		pa\kx=MouseX()
		pa\ky=MouseY()
		If iskut>pa\is Then 
			pa\y=pa\y-10
			pa\is=iskut
		EndIf
Next pa
For xt=0 To w Step XST
	For yt=0 To h Step YST
		c=120
		For pa.PAL=Each PAL
			dis=(255*pa\s/(Distance(xt,yt,pa\x,pa\y)+1)) 
			c=c+dis
		Next pa
		c=Min(255,c)
		c=Max(0,c)
		Color Max(0,Min(255,0+(c*rn11)-yt*2)),Max(0,Min(255,0+(c*rn22)-yt*2)),Max(0,Min(255,0+(c*rn33)-yt*2))
		Box xt,yt,XST,YST,1
	Next yt
Next xt
Return 
EDIT:

fontti pienennetty ja näytön leveyttä/korkeutta voi muuttaa kahden ekan rivin avulla (w=width, h=heigth)

EDIT:

lisätty taustalle suorakulmainen 'vuoristo', jonka saa asetuksista pois (jos kone ei kestä :( )

EDIT:

lisätty taustalle jotain pientä :)

Attachments
TheJump.zip
perus hyppelypeli
(657.01 KiB) Downloaded 515 times
Last edited by Wingman on Sun Apr 03, 2011 3:01 pm, edited 4 times in total.
- - - -
User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 11:17 am
Location: Espoo

Re: The Jump, perus hyppelypeli

Post by MetalRain »

Tämähän on vallan näppärä peli, vaan kun grafiikka on pientä niin teksti tuntuu valtavan suurelta, niitä pienentäisin.

Taustalla voisi myös vilistä jotain muutakin kuin tähtiä, ehkä aurinko ja kuu ja vuoria ja mäkiä. Maastonmuotojen generoimiseen lennossa m1c:n toteutus Diamondsquare algoritmista on vallan näppärä.

Code: Select all

Function DiamondSquare2D(seed1#, seed2#, _width, roughness#, multiplier#, unset# = -12345)
    width = _width
    result = MakeMEMBlock(width * 4 + 4)
    For i = 1 To width - 1
        PokeFloat result, i * 4, unset#
    Next i
    PokeFloat result, 0, seed1#
    PokeFloat result, width * 4, seed2#
    stp = width / 2
    While stp => 1
        b = stp
        While b < width
            If PeekFloat(result, b * 4) = unset# Then
                PokeFloat result, b * 4, (PeekFloat(result, (b - stp) * 4) + PeekFloat(result, (b + stp) * 4)) / 2 + Rnd(-roughness#, roughness#)
            EndIf
            b = b + stp
        Wend
        stp = stp / 2
        roughness# = roughness# * multiplier#
    Wend
    Return result
End Function
Tärkein ominaisuus olisi kuitenkin hyppynäppäimen painamisen pituudesta riippuva hypynpituus, mitä pidempään painetaan sitä kauemmas hypätään.

Sikäli mikäli mahdollista olisi myös mukava nähdä muunlaisia tasoja kuin samalla korkeudella olevia eripituisia laattoja, laatat voisivat olla hieman vinossa ja/tai eri korkeuksilla. Pistän tähän nyt toisen koodinpätkän jota ajattelin käyttää tasohyppelymoottorissa. Eli kyseessä on systeemi jolla tasoja(=viiva) voi yhdistää toisiinsa ja hakea tason pisteen koordinaatit etäisyytenä alkupisteestä. Esimerkissä punainen viiva on ukkeli joka hyppii pitkin valkoisia viivoja (=tasoja). Hiirellä voi piirtää uusia tasoja napsauttamalla alku ja loppupistettä. Ukko voi vaihtaa kiinnittämättömien tasojen reunoilla vain hyppäämällä, mutta oikeastihan pelissä voisi luoda enemmänkin toisiinsa kiinnitettyjä tasoja. Jos tästä saat ideoita niin hyvä niin.

Code: Select all

//Rail MemoryMap
Const RailStartX        = 0
Const RailStartY        = 4
Const RailEndX          = 8
Const RailEndY          = 12
Const RailLenght        = 16
Const RailAngle         = 20
Const PreviousRail      = 24
Const NextRail          = 28
Const RailMemorySize    = 32
Const RailMemoryType    = "ffffffii"

Global IntersX#, IntersY#
Global LinesOnTop

Global RailMap
Global RailMapSize

Railmap = MakeMEMBlock(4)
RailMapSize = 4

SCREEN 1024,768

maa = AddRail(100,200,300,300)
AddRail(300,300,600,500,maa)


GuyRail=maa
GuyPosition#=0.0
speed# = 2.0

Repeat

    If MouseHit(1) Then 
        If Not railstart Then 
            railsx=MouseX()
            railsy=MouseY()
            railstart =1
            ClearMouse
        Else
            AddRail(railsx,railsy,MouseX(),MouseY())
            railstart=0
        EndIf
    EndIf
    
    
    If GuyRail>0 Then 
    
        If LeftKey() Then
            If inverted Then GuyPosition#=Min(GuyPosition#+speed#,PeekFloat(GuyRail,RailLenght)) Else GuyPosition#=Max(GuyPosition#-speed#,0.0)
            
            If Guyposition#=0.0 And PeekInt(GuyRail,PreviousRail) Then 
                GuyRail=PeekInt(GuyRail,PreviousRail) 
                GuyPosition = PeekFloat(GuyRail,RailLenght)
            ElseIf Guyposition#=0.0 Then 
                GuyRail = -1 : GuyPosition#=0.0
                guyx=guyx-speed#
            EndIf

        ElseIf RightKey()
        
            If inverted Then  GuyPosition#=Max(GuyPosition#-speed#,0.0) Else GuyPosition#=Min(GuyPosition#+speed#,PeekFloat(GuyRail,RailLenght))
            
            If Guyposition#=PeekFloat(GuyRail,RailLenght) And PeekInt(GuyRail,NextRail) Then 
                GuyRail=PeekInt(GuyRail,NextRail) 
                GuyPosition = 0.0
            ElseIf Guyposition#=PeekFloat(GuyRail,RailLenght) Then 
                GuyRail = -1 : GuyPosition#=0.0
                
                guyx=guyx+speed#
            EndIf
        EndIf
        
        If GuyRail>0
        
            guyx=PeekFloat(GuyRail,RailStartX)+GuyPosition*Cos(PeekFloat(GuyRail,RailAngle))
            guyy=PeekFloat(GuyRail,RailStartY)+GuyPosition*-Sin(PeekFloat(GuyRail,RailAngle))
            
            If UpKey() Then GuyRail = -1 : GuyPosition#=50.0
        EndIf 
        
    ElseIf GuyRail = -1
        
        If GuyPosition#>0.0
            guyx=guyx+(RightKey()-LeftKey())*speed#
            guyy=guyy-2.0
            GuyPosition#=GuyPosition#-2.0
        
        Else
            GuyRail = 0
        EndIf
        
    ElseIf GuyRail = 0
    
        oldx = guyx
        oldy = guyy
    
        guyx=guyx+(RightKey()-LeftKey())*speed#
        guyy=guyy+2.0
        
        GuyRail = RailIntersectingLine(oldx,oldy,guyx,guyy)
        
        If GuyRail Then
            GuyPosition = Distance(PeekFloat(GuyRail,RailStartX),PeekFloat(GuyRail,RailStartY),IntersX,IntersY)
            guyx = IntersX
            guyy = IntersY
            ClearKeys
        EndIf

    EndIf 
    
    Color cbred
    Line guyx,guyy-10,guyx,guyy

    Color cbwhite
    
    Text 0,0,guyx+","+guyy

    
    DrawRails()

    DrawScreen

Forever


//rail functions

Function DrawRails()

    If Railmap And RailMapSize>4 Then 

        For i=4 To RailMapSize-1 Step 4
            
            rail = PeekInt(Railmap,i)
                
            For o=0 To MEMBlockSize(rail)-1 Step RailMemorySize
            
                Color cbwhite
                
                Line PeekFloat(rail,o+RailStartX),PeekFloat(rail,o+RailStartY),PeekFloat(rail,o+RailEndX),PeekFloat(rail,o+RailEndY)
                
                'Text (PeekFloat(rail,o+RailEndX)+PeekFloat(rail,o+RailStartX))/2,(PeekFloat(rail,o+RailEndX)+PeekFloat(rail,o+RailStartX))/2,PeekFloat(rail,o+RailAngle)
                //MakeError PeekFloat(rail,o+RailStartX)+","+PeekFloat(rail,o+RailStartY)+","+PeekFloat(rail,o+RailEndX)+","+PeekFloat(rail,o+RailEndY)
                
            Next o
        
        Next i
    
    Else
    
        Return 0
    
    EndIf

End Function 

Function AddRail(x1#,y1#,x2#,y2#,p=0,n=0,stopinvert=1)
    //Makes Rail, adds pointer to Railmap and returns pointer

    rail = MakeMEMBlock (RailMemorySize)
    
    ang# = GetAngle(x1#,y1#,x2#,y2#)
    
    If stopinvert = 1 Then 
        If ang#>90.0 And ang#<270.0 Then 
            temp# = x1#
            x1# = x2#
            x2# = temp#
            temp# = y1#
            y1# = y2#
            y2# = temp#
            ang# = WrapAngle(ang#+180.0)
        EndIf
    EndIf
    
    PokeFloat rail,RailStartX,x1#
    PokeFloat rail,RailStartY,y1#
    PokeFloat rail,RailEndX,x2#
    PokeFloat rail,RailEndY,y2#
    PokeFloat rail,RailLenght,Distance(x1#,y1#,x2#,y2#)
    PokeFloat rail,RailAngle, ang#
    
    PokeInt rail,PreviousRail,p
    PokeInt rail,NextRail,n
    
    
    
    If p Then PokeInt p,NextRail,rail
    If n Then PokeInt n,PreviousRail,rail
    
    oldsize = RailMapSize
    
    ResizeMEMBlock Railmap,RailMapSize+4
    RailMapSize = oldsize+4
    
    PokeInt Railmap,oldsize,rail
    
    Return rail

End Function 

Function DeformRail(rail,x1#,y1#,x2#,y2#,p=0,n=0)
    //Changes rail properties
    // use -1 to remove rail pointers (next and previous)

    If rail Then

        PokeFloat rail,RailStartX,x1#
        PokeFloat rail,RailStartY,y1#
        PokeFloat rail,RailEndX,x2#
        PokeFloat rail,RailEndY,y2#
        
        If p Then 
            PokeInt rail,PreviousRail,p 
        ElseIf p=-1 Then 
            PokeInt rail,PreviousRail,0
        EndIf
        
        If n Then 
            PokeInt rail,NextRail,n 
        ElseIf n=-1 Then 
            PokeInt rail,NextRail,0
        EndIf
    
    Else 
        MakeError "Trying to deform nonexisting rail: "+rail
    EndIf

End Function 


Function DeleteRail(rail)
    //Deletes rail and erases pointers from Railmap and adjecant rails
    
    If rail Then 

        For i=4 To RailMapSize-1 Step 4
                
            iRail = PeekInt(Railmap,i)
            
            If iRail = rail Then 
                
                If RailMapSize>i+4 Then MemCopy Railmap,i+4,Railmap,i,RailMapSize-(i+4)
                
                ResizeMEMBlock Railmap,RailMapSize-4
                RailMapSize = RailMapSize-4
                
                Exit
            EndIf 
                
        Next i
        
        p = PeekInt(rail,PreviousRail)
        n = PeekInt(rail,NextRail)
        
        If p Then PokeInt p,NextRail,0
        If n Then PokeInt n,PreviousRail,0
        
        DeleteMEMBlock rail

    Else
        MakeError "Trying to delete nonexisting rail: "+rail
    EndIf 

End Function 

Function DistanceToRail(rail,x#,y#) 
    ' Modified from Jonhu´s MinDistToLine 
    
    If rail Then 
    
        lx1# = PeekFloat(rail,RailStartX) 
        ly1# = PeekFloat(rail,RailStartY)
        lx2# = PeekFloat(rail,RailEndX)
        ly2# = PeekFloat(rail,RailEndX)
    
        // järjestetään, että (lx1, ly1) on pienempi
        If lx1 > lx2 Then
            mx1# = lx1 : my1# = ly1
            lx1 = lx2  : ly1 = ly2
            lx2 = mx1  : ly2 = my1
        EndIf
    
        // lasketaan muutama kulma
        line_ang# = GetAngle(lx1#,ly1#, lx2#,ly2#)
        ang1# = Abs( GetAngle(x#,y#, lx1#,ly1#) - line_ang# ) + 90
        ang2# = Abs( GetAngle(x#,y#, lx2#,ly2#) - line_ang# ) + 90
    
        If WrapAngle( ang1# ) <= 180
            dist# = Distance(x#,y#, lx1#,ly1#) ' abs(px#-lx1#) + abs(py#-ly1#)
        ElseIf WrapAngle( ang2# ) => 180
            dist# = Distance(x#,y#, lx2#,ly2#)
        Else // jos lähin etäisyys ei ole päätepisteissä joudutaan hieman laskea..
            dist# = ( Abs( (lx2-lx1)(ly1-y)-(lx1-x)(ly2-ly1) ) / Sqrt( (lx2-lx1)^2.0 + (ly2-ly1)^2.0 ) )
        EndIf
    
        Return dist#
    Else
        MakeError "Trying to measure distance to nonexisting rail: "+rail
    EndIf 

EndFunction

Function RailIntersectingLine(x1#,y1#,x2#,y2#)
    For i=4 To RailMapSize-1 Step 4
                
        rail = PeekInt(Railmap,i)
        
        lx1# = PeekFloat(rail,RailStartX) 
        ly1# = PeekFloat(rail,RailStartY)
        lx2# = PeekFloat(rail,RailEndX)
        ly2# = PeekFloat(rail,RailEndY)
        
        If LinesIntersect(x1#,y1#,x2#,y2#, lx1#,ly1#,lx2#,ly2#) Then Return Rail
    
    Next i
    
    Return 0

End Function 

//CBSDK FUNCTION

Function LinesIntersect(Ax#, Ay#, Bx#, By#, Cx#, Cy#, Dx#, Dy#)

    LinesOnTop = False
    // Tarkastetaan ovatko suorat toistensa päällä yhdensuuntaisina
   If Collinear(Ax#,Ay#,Bx#,By#,Cx#,Cy#) = True And Collinear(Ax#,Ay#,Bx#,By#,Dx#,Dy#) = True Then 'ovatko yhdensuuntaisia
        If Between(Ax#,Ay#,Bx#,By#,Cx#,Cy#) = True Or Between(Ax#,Ay#,Bx#,By#,Dx#,Dy#) = True Or Between(Cx#,Cy#,Dx#,Dy#,Ax#,Ay#) = True Or Between(Cx#,Cy#,Dx#,Dy#,Bx#,By#) = True Then  'ovatko sisäkkäin
            IntersX# = 0
            IntersY# = 0
           LinesOnTop = True
            Return True
        EndIf
    EndIf

    Rn# = (Ay#-Cy#)*(Dx#-Cx#) - (Ax#-Cx#)*(Dy#-Cy#)
    Rd# = (Bx#-Ax#)*(Dy#-Cy#) - (By#-Ay#)*(Dx#-Cx#)
    If Rd# = 0
        Return False
    Else
        Sn# = (Ay#-Cy#)*(Bx#-Ax#) - (Ax#-Cx#)*(By#-Ay#)
        Intersection_AB# = Rn# / Rd#
        Intersection_CD# = Sn# / Rd#
        If Intersection_AB# > 1 Or Intersection_CD# > 1 Or Intersection_AB# < 0 Or Intersection_CD# < 0 Then Return False
        IntersX = Ax# + Intersection_AB#*(Bx#-Ax#)
        IntersY = Ay# + Intersection_AB#*(By#-Ay#)
        Return True
    EndIf
End Function 

// Tarkastaa onko jokin piste kahden pisteen määrittämällä suoralla
Function Collinear(x1#,y1#,x2#,y2#,x3#,y3#)
    If x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2) = 0 Then Return True Else Return False
End Function

// Tarkastaa onko jokin piste kahden pisteen määrittämällä janalla
Function Between(x1#,y1#,x2#,y2#,x3#,y3#)
    If Collinear(x1#,y1#,x2#,y2#,x3#,y3#) = False Then Return False
    If Distance(x1,y1,x3,y3) + Distance(x3,y3,x2,y2) = Distance(x1,y1,x2,y2) Then Return True Else Return False
End Function
Last edited by MetalRain on Tue Mar 29, 2011 7:17 pm, edited 2 times in total.
User avatar
TukeKoodi
Active Member
Posts: 142
Joined: Thu Feb 03, 2011 7:40 pm
Location: C:\Työpöytä

Re: The Jump, perus hyppelypeli

Post by TukeKoodi »

Täähän on hauska peli, mä tykkäsin. Varsinkin tuo tähtien syvyysvaikutelma oli hieno. Näyttö oisi saanut olla aavistusken leveämpi.
Aloittelija, koodaaja, jotain...
CbFUN :D
Feuer
Devoted Member
Posts: 520
Joined: Tue Jun 16, 2009 11:13 am
Contact:

Re: The Jump, perus hyppelypeli

Post by Feuer »

Hyvä peli, tuohonhan jää koukkuun helposti :P
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: The Jump, perus hyppelypeli

Post by Wingman »

mm... mietin tuota taustajuttua... mutta, mitä fonttia cb käyttää 'defaulttina'?
EDIT:

Kiitos

Last edited by Wingman on Tue Mar 29, 2011 6:28 pm, edited 1 time in total.
- - - -
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: The Jump, perus hyppelypeli

Post by Awaclus »

Wingman wrote:mm... mietin tuota taustajuttua... mutta, mitä fonttia cb käyttää 'defaulttina'?
Courier New.
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: The Jump, perus hyppelypeli

Post by Wingman »

noin, fontti pienennetty ja leveyttä ja korkeutta voi muuttaa. kopioikaa koodi sen vanhan päälle.

Nyt taustan kimppuun :)
- - - -
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: The Jump, perus hyppelypeli

Post by Wingman »

Illan viimeinen nosto, huonoa kyllä, tuplaviestillä. Huomenna sitten achievementit.

Lisäsin siis taustan, ja sen saa pois asetuksista.
- - - -
User avatar
TukeKoodi
Active Member
Posts: 142
Joined: Thu Feb 03, 2011 7:40 pm
Location: C:\Työpöytä

Re: The Jump, perus hyppelypeli

Post by TukeKoodi »

Oma ennätys:
Attachments
kuva.png
kuva.png (46.33 KiB) Viewed 14885 times
Aloittelija, koodaaja, jotain...
CbFUN :D
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: The Jump, perus hyppelypeli

Post by Wingman »

TukeKoodi wrote:Oma ennätys:
näyttää siltä et pelasit ilman musiikkia (näkee tähtien määrästä), ja voi olla että silloin ei vauhti kiihdy.. Jos niin on niin korjailen huomenna
- - - -
User avatar
TukeKoodi
Active Member
Posts: 142
Joined: Thu Feb 03, 2011 7:40 pm
Location: C:\Työpöytä

Re: The Jump, perus hyppelypeli

Post by TukeKoodi »

En, mä häksäsin. Pystyy hyppiä ilman et jalat on maassa ja nopeus on kymmenkertainen.
Aloittelija, koodaaja, jotain...
CbFUN :D
User avatar
TheDuck
Devoted Member
Posts: 632
Joined: Sun Aug 26, 2007 3:51 pm
Location: C:\Program Files\Tuusula\

Re: The Jump, perus hyppelypeli

Post by TheDuck »

TukeKoodi wrote:En, mä häksäsin. Pystyy hyppiä ilman et jalat on maassa ja nopeus on kymmenkertainen.
Ai että oikeen häksäsit. Ollaampas sitä nyt niin taitavia.
^^
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: The Jump, perus hyppelypeli

Post by Wingman »

TukeKoodi wrote:En, mä häksäsin. Pystyy hyppiä ilman et jalat on maassa ja nopeus on kymmenkertainen.
mjoo, avoimen lähdekoodin ohjelmassa on hankalaa häksätä, ethän sinä tehnyt muuta kuin muokkasit koodia. Jos sulle ei ois koodia annettu ja olisit silti nuo muutokset tehnyt, sitä olisi voinut kutsua häksäykseksi. esim. Nopeutta saa muutettua leikiten CheatEnginen kanssa
- - - -
Dimple
Active Member
Posts: 103
Joined: Wed Nov 17, 2010 5:43 pm

Re: The Jump, perus hyppelypeli

Post by Dimple »

Wingman wrote:
TukeKoodi wrote:En, mä häksäsin. Pystyy hyppiä ilman et jalat on maassa ja nopeus on kymmenkertainen.
mjoo, avoimen lähdekoodin ohjelmassa on hankalaa häksätä, ethän sinä tehnyt muuta kuin muokkasit koodia. Jos sulle ei ois koodia annettu ja olisit silti nuo muutokset tehnyt, sitä olisi voinut kutsua häksäykseksi. esim. Nopeutta saa muutettua leikiten CheatEnginen kanssa
Ja respektiä saa vasta siinä vaiheessa, kun teet siitä oman häkin C/C++:lla. Tosin ei sekään ole vaikeaa jos vain nopeutta haluaa lisätä. Esim. aimbotin tekeminen olisi paljon mielenkiintoisempi projekti. :)

Btw. MHS on mielestäni parempi kuin Cheat engine.
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: The Jump, perus hyppelypeli

Post by Wingman »

Lisäsin taustalle pienen lisäyksen. En muista mitä muuta tein, mutta jotain jännää se oli
- - - -
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: The Jump, perus hyppelypeli

Post by MaGetzUb »

En oikein pitänyt siitä ideasta että heti kun peli alkaa niin jätkä tipahtaa synkkyyteen ja tulee GameOver.. :D Pitäisi olla jonkimoinen safejuttu heti pelin alkaessa. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: The Jump, perus hyppelypeli

Post by Viltzu »

Hurr hurr ^__^
Wingin kanssa säädettiin top-lista pelihin. Pitemmittä puheitta, ladatkaa tästä ja top-lista löytyy täältä. Tätä peliä voi myös pelata vaikka nettiyhteyttä ei olisi. Et kuitenkaan voi lähettää niitä pisteitä jotka olet silloin saanut kun nettiyhteyttä ei ollut. (Nämä myös ylikirjoitetaan kun yhdistät nettiin)

Ja älkää poistako sitä "nick" tiedostoa, ilman sitä ette voi enää käyttää nickiänne.
EDIT:

20.04: Pelissä oli bugi, jonka takia peli jumittui aina kun oli pisteet lähettänyt. Tämä korjattu.

Purkakaa paketti, pisteiden lähetys ei välttämättä toimi ellei pakettia ole purettu.
Post Reply