跳转到内容

DarkBASIC 编程/2D 游戏编程 第 1 部分

来自维基教科书,开放的书籍,用于开放的世界

第 15 天

[编辑 | 编辑源代码]

终于到了中途点,经过了所有的编码、阅读和日子。在本章中,我们将使用你将学习到的更多文本命令来制作一个文字冒险游戏。此外,你将学习如何用各种颜色清除屏幕,你会喜欢这节课的。

你可能想过,天啊,文本总是必须是白色的吗?

`NOPE
ink rgb(0,255,0),1
Print "OMG FINALLY COLOR!"

没错!我是一个加拿大人,但我仍然把颜色拼写成 color 而不是 colour。RGB 是什么意思?它代表红色、绿色、蓝色,用一个镜头看看你的显示器,你会看到很多这些颜色的像素。rgb 必须用括号分隔,然后用逗号分隔透明度值。透明度范围从 0 到 255。RGB 值也从 0 到 255。

这里有一些颜色要记住

255,0,0 - red
0,255,0 - green
255,255,0 - yellow
0,0,255 - blue
0,255,255 - cyan
255,255,255 - white
0,0,0 - black
255,0,255 - pink
192,192,192 - light grey

要查看更多颜色,请在画图程序中查看 rgb 值,然后随意操作,这就是我找到的方法,所以你也应该这样做。使用上面的值,你应该能够创建不错的颜色。值越低,颜色越暗;值越高,颜色越亮。

现在,在你想要一种更好的打印方式之后呢?

text x,y,string$

使用文本时,你需要使用 + 而不是分号来分隔变量。所有值都必须是字符串,记住要将一个值转换为字符串,请使用 str$ 命令,如第 6 课所示。

正确的方式

a = 1
text 1,100,"This is no syntax error "+str$(a)

错误的方式

a = 1
text 1,100,"This is a syntax error you won't see this text until you fix "+a

我们可以轻松更改字体

set text font fontnameasstring$

我们也可以轻松地使文本不透明,或者让我们能够在其他文本值上书写

set text opaque

以下是样式更改

set text bold
set text italic
set text bolditalic

以下是更改大小的方法

set text size integernumber

好的,以下是在一个程序中展示所有这些

set text font "Times New Roman"
set text size 30
set text bold
text 1,100,"Hey"

你的作业是随意玩弄文本值和颜色,明天回来

第 16 天

[编辑 | 编辑源代码]

好的,现在我们已经学习了很多关于更改文本值的内容,是时候编写你自己的文字冒险游戏了。我们将其命名为“厄运地牢”,它将让玩家使用各种数据命令等逃离一座城堡的潮湿地牢。

首先,让我们做一个提纲

现在我们有了提纲,让我们写一个简单的故事

邪恶的精灵把你囚禁在他们的监狱里,现在你必须逃离厄运地牢。注意,有些转弯会导致厄运,有些则会导致出路。

在我们游戏中,只有两种死法,因为这更像是一个迷宫。

现在让我们为它做一些数据

`Dungeons of Doom
`By Dbtutor

`Room
dim room1$(10)
dim room2$(10)
dim room3$(10)
dim room4$(10)
dim room5$(10)
dim room6$(10)
dim room7$(10)
dim room8$(10)
dim room9$(10)
dim room10$(10)
dim room11$(10)
dim room12$(10)



rem -----------------
gosub startgame

startgame:
cls
gosub start
for a = 1 to 10
   Print room1$(a)
next a

do
   if inkey$() = "l" then gosub room1_b
   if inkey$() = "r" then gosub room2_b
   if inkey$() = "u" then gosub room3_b
loop

room1_b:
cls
gosub room1
for a = 1 to 10
   Print room2$(a)
next a
wait key
end

room2_b:
cls
gosub room2
for a = 1 to 10
   Print room3$(a)
next a
wait key
end

room3_b:
cls
gosub room3
for a = 1 to 10
   Print room4$(a)
next a

do
   if inkey$() = "l" then gosub room4_b
   if inkey$() = "r" then gosub room5_b
   if inkey$() = "d" then gosub startgame
   if inkey$() = "u" then gosub room6_b
loop

room4_b:
cls
gosub room4
for a = 1 to 10
   Print room5$(a)
next a
wait key
end

room5_b:
cls
gosub room5
for a = 1 to 10
   Print room6$(a)
next a

do
   if inkey$() = "b" then gosub room3_b
loop

room6_b:
cls
gosub room6
for a = 1 to 10
   Print room7$(a)
next a

do
   if inkey$() = "l" then gosub room7_b
   if inkey$() = "r" then gosub room8_b
   if inkey$() = "d" then gosub room3_b
   if inkey$() = "u" then gosub wingame
loop

room7_b:
cls
gosub room7
for a = 1 to 10
   print room8$(a)
next a
do
   if inkey$() = "b" then gosub room6_b
loop

room8_b:
cls
gosub room8
for a = 1 to 10
   print room9$(a)
next a

do
   if inkey$() = "b" then gosub room6_b
loop

wingame:
cls
gosub win
for a = 1 to 10
   print room10$(a)
next a
wait key
end

`Data Statements
start:
data "Dungeons of Doom - Starting Area"
data "The cell door swings open, the guard lies dead in a pool of blood"
data "A large gash does through his neck, clutching your dagger you"
data "Have a decision to make."
Data "You can Go - L>eft, R>ight, or U>p"

for a = 1 to 5
   read room1$(a)
next a

return

room1:
data "Dungeons of Doom - Room 1"
data "You look around the corner and leap out at a guard"
data "Sticking a sharp spear in the air your gored by it"
data "Through the heart you die instantly and never escape"
data "The Dungeons of Doom....."
data "Press Any Key"

for a = 1 to 6
   read room2$(a)
next a

return

room2:
`Right of start
data "Dungeons of Doom - Room 2"
data "As you reach the room, you notice the walls close in!"
data "You are squished between the walls"
data "The End - Press Any Key"
for a = 1 to 4
   read room3$(a)
next a

return


room3:
`North of the start point
data "Dungeons of Doom - Room 3"
data "This room is a room that leads all ways..."
data "U>p, L>eft, R>ight or D>own"
for a = 1 to 3
   read room4$(a)
next a

return

room4:
`Left of Up one from start point
data "Dungeons of Doom - Room 4"
data "You run into a monstrous troll, who proceeds to bash you"
data "Over the head with a club, waking up inside a pie"
data "You are instantly eaten by a horde of trolls"
data "The End - Press Any Key"

for a = 1 to 5
   read room5$(a)
next a

return

room5:
`Right of the room4
data "Dungeons of Doom - Room 5"
data "You run into a dead end, you must go out the way you came"
data "B>ack"

for a = 1 to 3
   read room6$(a)
next a

return

room6:
`North of Room
data "Dungeons of Doom - Room 6"
data "This room is a dank one, to the north you feel cold air a way out?"
data "U>p, L>eft, R>ight, or D>own"

for a = 1 to 3
   read room7$(a)
next a

return

room7:
`Left of the room 6
data "Dungeons of Doom - Room 7"
data "Dead End Go Back"
data "B>ack"

for a = 1 to 3
   read room8$(a)
next a

return

room8:
`Right of Room 6
Data "Dungeons of Doom - Room 8"
data "Dead End Go Back"
data "B>ack"
for a = 1 to 3
   read room9$(a)
next a

return

win:
Data "You Won"
Data "Escaping to the Forest, now you need to find a town!"
data "Press Any Key"

for a = 1 to 3
   read room10$(a)
next a

return

这个游戏已经完成了,如果所有东西都正常工作,如果没有,请随时通过以下地址给我发邮件:[email protected]

那么,你的作业是,为了证明你了解发生了什么,你需要回到代码中,添加注释来描述每个部分的事件。你作业的最后一步是编辑所有代码和数据语句,制作一个续集,添加房间以及更多内容。这个游戏不是一个文字角色扮演游戏,我们将在下一课中制作文字角色扮演游戏。我认为明天你将会突破游戏编程。

第 17 天

[编辑 | 编辑源代码]

哦,天啊!今天我们将制作一个乒乓球游戏,一个打砖块游戏,你将学习关于图像、精灵等的更多内容!好的,那么我们如何在 DarkBASIC 中加载多媒体?记住,在文件管理器程序中,我们有一些令人困惑的文件格式。不幸的是,我没有添加动画。

多媒体示例

`Image
`Supports bmps and jpgs only
id = 1
string$ = "myimage.bmp"
load image string$,id
x = 1
y = 1
paste image id,x,y

`Music
`Sound works the same way, only instead the word music is replaced with the word `sound
`Supports are: wav, mp3, and midi
musid = 1
musstring$ = "mymusic.mid"
load music musstring$,musid
play music musid
stop music musid
loop music musid

`Animation
`Supports gif, avi, may support other formats
animid = 1
animstring$ = "myanimation.gif"
load animation animstring$,animid
play animation animid

`Bitmap
`Works same as image only supports bitmaps, you can load only 32
bmpid = 1
bmp$ = "mybmp.bmp"
load bitmap bmp$
`This pastes the bitmap, but the id can be used to create bitmaps at certain `locations 
`see bmps under the command reference for those details

end

查看 DarkBASIC 中更多多媒体示例,还有一些是 3D 音频,你也可以播放 CD 上的音乐。我们将在后面的章节中使用 DarkBASIC 中更多多媒体示例,现在我们将专注于示例中提到的内容。

你的主要问题可能是什么是精灵?精灵是一个在游戏中使用的二维角色。基本上,精灵是一个可以做更多事情的图像,在 DarkBASIC 中,精灵是系统中的核心。

精灵的工作方式像

sprite spriteid,x,y,imageid

你不能使用 load bitmap 并将其用作精灵的图像,你只能使用 load image 命令加载的图像。


以前,你在 DarkBASIC 中无法操作图像的 x,y 坐标,但现在要改变了。在我们开始之前,如果我们让计算机来处理游戏的帧速率,那么我们的游戏运行速度会很慢,并且在不同速度的计算机上运行方式也会不同。使用 sync on 将帧速率交给你自己,而不是计算机。每次使用 sync 命令时,屏幕都会不断更新。使用 sync rate 命令来设置帧刷新率,对于 DarkBASIC 中的 3D 游戏来说,30 通常很好,对于 2D 游戏来说,40 也很好,但最好使用 30。DarkBASIC 中有一些命令可以绘制粗略的图形,我们将使用的命令是:line(line startingx,toendingx,startingy,toendingy)、circle(x,y,radius) 和 dot(dot x,y)。它们使用默认墨水绘制这些图形,如果墨水未设置,则将使用青色作为默认值。还有更多命令可以绘制不同的基本二维形状,但我们不会使用它们。如果你好奇,请在 DarkBASIC 命令参考中的 BASIC2d 中查看它们。


以下是如何移动一个圆的示例

`Moving Circle
`By Dbtutor

`Hide the mouse
hide mouse

`Setup sync rate
sync on
sync rate 30

`Make the screen grey
cls rgb(192,192,192) 

`Select an ink color for us, make it all transparent
ink rgb(0,155,0),0

`Draw the circle at coordinates provided
xpos = 100
ypos = 200
circle xpos,ypos,10

`Start the main loop
do
   `Clean up mess left over, and re-draw circle
   cls rgb(192,192,192)
   circle xpos,ypos,10

   `User control
   if upkey() = 1 then ypos = ypos - 7
   if downkey() = 1 then ypos = ypos + 7
   if rightkey() = 1 then xpos = xpos + 7
   if leftkey() = 1 then xpos = xpos - 7
   `Allow no leaving the screen
   if xpos > 600 then xpos = xpos - 7
   if xpos < 1 then xpos = xpos + 7
   if ypos > 400 then ypos = ypos - 7
   if ypos < 1 then ypos = ypos + 7
   `Refresh the screen
   sync
loop
   

哇,效果很好,对吧?现在让我们睡一会儿吧。

第 18 天

[编辑 | 编辑源代码]

在我们开始之前,我想要感谢所有访问本维基教科书的人,感谢您抽出时间阅读它,感谢您知道当我搜索“DarkBASIC 编程”时,我的书出现在第一页。这是一种很棒的感觉!我希望你学到一些东西,我将尽力尽快完成这本书,但我一直在学习新事物和处理学业,所以很忙。我一直在学习汇编、C++、Pascal 和 Visual Basic,我也在考虑购买一个控制台构建套件“The XGameStation”,由 Lamothe 先生开发,或者你可能知道他叫 Andre' Lamothe 或 Lord Necron。除了 Lee Bamber(DarkBASIC 背后的有远见的人)之外,他是我的编程灵感来源之一。好的,让我们从乒乓球游戏开始,我必须说编写这个乒乓球游戏是一个挑战,我遇到过很多错误。你必须使用你自己的图像,只包含源代码。

理解材料在我继续进行乒乓球游戏之前,有一些事情我必须、不,需要向你解释。首先,你需要理解什么是“精灵”,我知道我之前提到过它,但没有像现在这样深入解释,那只是一个简单的例子。基本上,精灵只是一个活动图像,它比标准位图允许更多的操作。用我们的术语来说,精灵在大多数情况下只是一个二维角色。在 DarkBASIC 中,我们可以对精灵进行比普通图像更多的操作。

你已经知道如何设置精灵。但你不知道如何删除精灵,如何检测精灵的碰撞,而且你还没有太多使用它们。删除精灵的语法很简单:delete sprite spriteid。如果精灵不存在,显然你会得到一个运行时错误,指出“bob”或精灵不存在。对精灵碰撞也是一样的:最精确、最好的方法是使用这个命令:sprite collision(spriteid1,spriteid2)。同样,它们必须存在,正如我所说,你必须有两个,我再次陈述显而易见的事实,但有些人确实很笨。

另一种方法与之相同,只是没有那么精确,像这样:sprite hit(spriteid1,spriteid2)。很简单!阅读下面的代码后,可能不太容易理解的是随机数的用途。简单地说,这些随机数是为了让计算机生成一个 0 到 1 之间的数字,表示球应该向哪个方向移动。它们用于 X 轴和 Y 轴,你应该已经知道它们是什么了。

乒乓球游戏 -

如果你不理解这些材料,请复习之前的课程或查阅 DarkBASIC 帮助文件。

`Pong example code
`By Dbtutor
`You must use your own multimedia!

sync on
sync rate 40
hide mouse

`Load the images
load image "paddle1.bmp",1
load image "paddle2.bmp",2
load image "ball.bmp",3

` Load the music
load music "Dodge This.mid",1

` Load the sound
load sound "thump.wav",1

` Play the music 
play music 1

` Start the main game loop
` Setup some variables first
oneypos = 1
onexpos = 1
twoypos = 1
twoxpos = 620
bally = 150
ballx = 150
movey = rnd(1)
movex = rnd(1)
onegoal = 0
twogoal = 0

do

 `Display Scores & Whatnot
 set text opaque
 text 1,1,"Goals: "+str$(onegoal)
 text 585,1,"Goals: "+str$(twogoal)

 `Player Control for 1
 if upkey() = 1 then oneypos = oneypos - 7
 if downkey() = 1 then oneypos = oneypos + 7
 if oneypos < 1 then oneypos = oneypos + 7
 if oneypos > 432 then oneypos = oneypos - 7

 `The paddle sprite
 sprite 1,onexpos,oneypos,1

 `Player 2 Paddle
 if inkey$() = "w" then twoypos = twoypos - 7
 if inkey$() = "s" then twoypos = twoypos + 7
 sprite 2,twoxpos,twoypos,2
 if twoypos < 1 then twoypos = twoypos + 7
 if twoypos > 432 then twoypos = twoypos - 7

 `The Ball
 if movey = 1 then bally = bally + 5
 if movey = 0 then bally = bally - 5
 if movex = 1 then ballx = ballx + 5
 if movex = 0 then ballx = ballx - 5
 sprite 3,ballx,bally,3

 `Collision Detection
 if sprite hit(1,3) = 1 then movex = 1:play sound 1
 if sprite hit(2,3) = 1 then movex = 0:play sound 1
 if ballx < 1 then movex = 1:twogoal = twogoal + 1:play sound 1
 if ballx > 620 then movex = 0:onegoal = onegoal + 1:play sound 1
 if bally < 1 then movey = 1:play sound 1
 if bally > 432 then movey = 0:play sound 1

 `Wins
 if onegoal = 10
 text 100,150,"Player 1 Has Won!"
 wait 300
 end
 endif

 if twogoal = 10
 text 100,150,"Player 2 Has Won!"
 wait 300
 end
 endif

 `Refresh the screen
 sync

loop

好的,这就是光荣的乒乓球。现在是进行长时间测验的时候了。

1 在游戏设计中,二维角色叫什么?

A) 马里奥
B) 查拉
C) 剪贴画
D) 精灵

2 对还是错:30 是任何计算机上游戏的良好同步率

T)rue
F)alse

3 哪个是手动设置计算机游戏中帧速率的最佳方法

A) 设置 sync on,将其设置为平均速率,例如 30,并在需要时使用 sync 刷新
B) 让计算机处理所有操作
C) 将同步率设置为 0
D) 只需打开同步

4 你可以怎样声明数据语句?

A) Data 数据类型
B) dat 数据类型
C) godarkbasic data 数据类型
D) data.db 数据类型

5 数据语句保存哪些类型的数据?

A) 仅字符串
B) 数组
C) 字符串、整数和实数(浮点小数或浮点数)
D) 整数

6 在我们的文字冒险游戏中,你必须逃离

A) 城堡
B) 监狱
C) 森林
D) 地牢

好了,现在来说答案。如果你作弊,那是你自己的事,因为这本书完成后,你就不能再作弊了,所以不要胆小,不要选择懦夫的路。

答案

  1. D
  2. 正确
  3. A
  4. A
  5. C
  6. D

最后,我们需要结束这漫长而艰苦的编码日,因为新的编码属性将会带来新的挑战。

华夏公益教科书