Что нового

[Игра] Пишем простенькую игру

polzavatel

Новичок
Сообщения
50
Репутация
2
Описание: Здесь я буду выкладывать этапы моего ознакомления/создания игры.


Источник: autoit-script.ru
Автор(ы): polzavatel


Итак, начнём...

Версия 000


Имеем следующее:
-Генерация комнаты из текстового файла.
-ходьба

Код:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Local $file = FileOpen("test.txt", 0)



HotKeySet("{LEFT}", "goLeft")
HotKeySet("{RIGHT}", "goRight")
HotKeySet("{DOWN}", "goDown")
HotKeySet("{UP}", "goUp")

global $block[1000]
global $p[10000], $playerId,$playerX,$playerY 



$id = 0
$cl = 0
Dim $c[100]
For $i = 1 To 30 Step 1
   Local $line = FileReadLine($file)
   $cl += 1
   $c[$i] = 0
For $y = 1 to 30 step 1
   $id = $i*30 + $y
Local $var = StringMid($line, $y, 1)
If( $var= "1") then
   $block[$id] = 1
   $c[$i] += 1
EndIf
If( $var = "0") then
$block[$id] = 0
$c[$i] += 1
EndIf
If( $var = "2") then
   $block[$id] = 2
   $c[$i] += 1
EndIf
If( $var = "") then
 ExitLoop
EndIf
Next
Next




GUICreate(" My GUI Icons", 700, 700)
GUISetState()
func draw()
$id = 0
For $i = 1 To $cl Step 1
For $y = 1 to $c[$i] step 1
   $id = $i*30 + $y
If($block[$id] = 1) then
$p[$id] = GUICtrlCreateIcon("test.bmp", 0, $y*20 , $i*20, 20, 20)
EndIf
If( $block[$id] = 0) then
$p[$id] = GUICtrlCreateIcon("test2.bmp", 0, $y*20 , $i*20, 20, 20)
EndIf
If( $block[$id] = 2) then
$playerX = $y*20
$playerY = $i*20
$playerId = $id
$p[$id] = GUICtrlCreateIcon("player.bmp", 0, $y*20 , $i*20, 20, 20)
EndIf
Next
Next
EndFunc

draw()


Func goLeft()
   if $block[$playerId - 1] = 1 Then
      GUICtrlDelete($p[$playerId])
	  GUICtrlDelete($p[$playerId - 1])
	  $p[$playerId] = GUICtrlCreateIcon("test.bmp", 0, $playerX, $playerY, 20, 20)
	  $p[$playerId - 1] = GUICtrlCreateIcon("player.bmp", 0, $playerX - 20, $playerY, 20, 20)
	  $block[$playerId] = 1
	  $playerX = $playerX - 20
	  $playerId -= 1
   EndIf
EndFunc

Func goRight()
   if $block[$playerId + 1] = 1 Then
      GUICtrlDelete($p[$playerId])
	  GUICtrlDelete($p[$playerId + 1])
	  $p[$playerId] = GUICtrlCreateIcon("test.bmp", 0, $playerX, $playerY, 20, 20)
	  $p[$playerId + 1] = GUICtrlCreateIcon("player.bmp", 0, $playerX + 20, $playerY, 20, 20)
	  $block[$playerId] = 1
	  $playerX = $playerX + 20
	  $playerId += 1
   EndIf
EndFunc

Func goDown()
   if $block[$playerId + 30] = 1 Then
      GUICtrlDelete($p[$playerId])
	  GUICtrlDelete($p[$playerId + 30])
	  $p[$playerId] = GUICtrlCreateIcon("test.bmp", 0, $playerX, $playerY, 20, 20)
	  $p[$playerId + 30] = GUICtrlCreateIcon("player.bmp", 0, $playerX, $playerY + 20, 20, 20)
	  $block[$playerId] = 1
	  $playerY = $playerY + 20
	  $playerId += 30
   EndIf
EndFunc

Func goUp()
   if $block[$playerId - 30] = 1 Then
      GUICtrlDelete($p[$playerId])
	  GUICtrlDelete($p[$playerId - 30])
	  $p[$playerId] = GUICtrlCreateIcon("test.bmp", 0, $playerX, $playerY, 20, 20)
	  $p[$playerId - 30] = GUICtrlCreateIcon("player.bmp", 0, $playerX, $playerY - 20, 20, 20)
	  $block[$playerId] = 1
	  $playerY = $playerY - 20
	  $playerId -= 30
   EndIf
EndFunc







	While 1
  		Local $msg = GUIGetMsg()

		If $msg = $GUI_EVENT_CLOSE Then ExitLoop
	WEnd
	GUIDelete()


Описание:

Сначала, мы считываем файл "test.txt"
Его содержание:
Код:
00000000000000000
01111211111111110
0111111111111100
01111111100000
0111111110000
011111111000
01111111100
0101111010
0111111110
0000000000

Вот из игры -
index.php

Во время считывания идет подсчёт количества строк и кол-во символов в строке. По сути имеется поле 30х30, но тут как видите используется не всё поле, а лишь часть.

Итак, программа перебирает каждый символ( 1 символ = 1 квадратик 20*20 пикселей) и дает ему id( равный (номер строки)*30 + (номер символа в строке))

0 - непроходимый квадрат(в моём случае чёрный)
1 - проходимый квадрат( белый)
2 - сам игрок(красный)

После поле рисуется. Пока что использовал GUICtrlCreateIcon, т.к. не знаю пока другого.

Хождение думаю ясно как делалось.

Надеюсь тему будут смотреть "акулы" AutoIt'a и укажут на мои ошибки =)

И вопрос - почему белый квадрат имеет слева чёрную полоску, которая иногда так же появляется снизу?
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
прикольная игра двигать цифру в массиве ;)
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
Ну я потихоньку сам знакомлюсь с этим и может кому нибудь это тоже будет интересным.
Ну и может кто-то укажет на мои ошибки. :smile:


Добавлено:
Сообщение автоматически объединено:

Версия 0.0001

добавлен новый файл - MapEditor, редактор карты.
Картинка:
index.php

Вот код

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Local $file = FileOpen("test.txt", 0)


HotKeySet("{LEFT}", "goLeft")
HotKeySet("{RIGHT}", "goRight")
HotKeySet("{DOWN}", "goDown")
HotKeySet("{UP}", "goUp")
HotKeySet("{1}", "set1")
HotKeySet("{2}", "set2")
HotKeySet("{3}", "set3")
HotKeySet("{4}", "set4")


global $block[1000]
global $p[10000], $playerId,$playerX,$playerY 



$id = 0
$cl = 0

global $cur, $cx, $cy, $curid

GUICreate(" My GUI Icons", 700, 700)
$Button_1 = GUICtrlCreateButton("Save", 20*32, 20, 50)
$name = GUICtrlCreateInput("", 20*32, 50, 50)
GUICtrlCreateIcon("test.bmp", 0, 20*32 , 80, 20, 20)
GUICtrlCreateLabel(" - 1", 20*32 + 25, 80)
GUICtrlCreateIcon("test2.bmp", 0, 20*32 , 110, 20, 20)
GUICtrlCreateLabel(" - 2", 20*32 + 25, 110)
GUICtrlCreateIcon("player.bmp", 0, 20*32 , 140, 20, 20)
GUICtrlCreateLabel(" - 3", 20*32 + 25, 140)
GUICtrlCreateLabel(" - 4", 20*32 + 25, 170)

GUISetState()
func draw()
   $cur = GUICtrlCreateLabel("0", 20, 20)
   $cx = 20
   $cy = 20
   $curid = 31
$id = 0
For $i = 1 To 30 Step 1
For $y = 1 to 30 step 1
   $id = $i*30 + $y
   $block[$id] = " "
   Next
Next
EndFunc

draw()


Func goLeft()
   if $cx > 20 then
	  GUICtrlDelete($cur)
	  $cx -= 20
	  $cur = GUICtrlCreateLabel("0", $cx, $cy)
      $curid -= 1
	  EndIf
EndFunc

Func goRight()
     if $cx < 20*30 then
	  GUICtrlDelete($cur)
	  $cx += 20
	  $cur = GUICtrlCreateLabel("0", $cx, $cy)
      $curid += 1
	  EndIf
EndFunc

Func goDown()
   if $cy < 20*30 then
	  GUICtrlDelete($cur)
	  $cy += 20
	  $cur = GUICtrlCreateLabel("0", $cx, $cy)
      $curid += 30
	  EndIf
EndFunc

Func goUp()
   if $cy > 20 then
	  GUICtrlDelete($cur)
	  $cy -= 20
	  $cur = GUICtrlCreateLabel("0", $cx, $cy)
      $curid -= 30
	  EndIf
   EndFunc
   
func set1()
   $block[$curid] = "1"
   GUICtrlDelete($p[$curid])
   $p[$curid] = GUICtrlCreateIcon("test.bmp", 0, $cx , $cy, 20, 20)

EndFunc

func set2()
   $block[$curid] = "0"
   GUICtrlDelete($p[$curid])
   $p[$curid] = GUICtrlCreateIcon("test2.bmp", 0, $cx , $cy, 20, 20)

EndFunc

func set3()
   $block[$curid] = "2"
   GUICtrlDelete($p[$curid])
   $p[$curid] = GUICtrlCreateIcon("player.bmp", 0, $cx , $cy, 20, 20)

EndFunc

func set4()
   $block[$curid] = "9"
   GUICtrlDelete($p[$curid])
EndFunc



	While 1
  		Local $msg = GUIGetMsg()

		If $msg = $GUI_EVENT_CLOSE Then ExitLoop
	    If $msg = $Button_1 Then
		   sleep(100)
		   $ma = GUICtrlRead($name)
		   $file = FileOpen($ma & ".txt", 10)
		   for $i = 1 to 30 step 1
			  for $y = 1 to 30 step 1
				 FileWrite($file, $block[$i*30 + $y])
				   if $block[$i*30 + $y] = "" Then
					ExitLoop
				 EndIf
			   Next
			   FileWrite($file, @CRLF)
			   Next
					
		   EndIf
		   
	WEnd
	GUIDelete()


Описание:

"0" - это наш курсор, им мы управляем с помощью стрелочек.

Нажимая цифры "1..4" мы задаем значение блока под "курсором".

Справа в input вводим название, жмём Save и в папке со скриптом появляется файлик с нашим названием.
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
Карта 99х99: каждая клетка может иметь значение поля 0-254 + 1(Игрок) = 255(Один байт)

Значение клеток:
255 - Игрок.
0 - Стена.
1 - Доступное для перемещение поле.
2 - Возврат на прошлую карту.
3 - Переход на следующую карту.
4 - Сохранение.
5 - Мина.
6 - Телепорт.
7 - +1 Жизнь.
...N - на пути могут быть, огненные стены, водные преграды, не проходимые топи, также могут быть и клетки с временными иммунитетами к ядам, болезням(при нажатии в лево может пойти в другую сторону - проклятие) и много прочего.

Движок игры: При нажатии в сторону(не важно в какую), считывает значение из клетки на которую мы хотим передвинутся и если оно больше нуля то происходит переход, также на будущее можно зарезервировать другие не проходимые клетки (обрывы, завалы и прочее).

Алгоритм:
a) Игрок(255) + Стена(0) = 255 Остается на месте.
b) Игрок(255) + Доступное поле(1) = 256 Передвигается.
c) Игрок(255) + Переход на следующую карту(3) = 258 Переход на следующую карту.
d) Игрок(255) + Мина(5) = 260 (-1 жизнь и перемещение на начальную точку карты или в место последнего сохранения).

Развитие игры: на начальном этапе игра цифровая, далее цифры заменяются на картинки приобретая красочность(на этой и последующих стадиях игры, ее можно поместить в социальные сети и зарабатывать деньги, нечего не делая), следующий шаг 2D, за тем 3D и как следствие MMORPG со своим миром.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
что то у меня не работает..пустое окно.
Win 7 x64
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
Black_Hole, интересное сообщение, надо будет подумать =)

Все следующие версии буду весь комплект выкладывать, чтобы не было "того не видно, этого не видно", ну и чтобы вам не мучатся и не создавать картинки.


Добавлено:
Сообщение автоматически объединено:

можете подсказать, почему при налаживании на "цифру" картинки, она слева и снизу имеет полоску в 1 пиксель?(Я думаю на картинках выше это видно)
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Если заменить GUICtrlCreateIcon() на GUICtrlCreatePic() то все отображается нормально:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Local $file = FileOpen("test.txt", 0)



HotKeySet("{LEFT}", "goLeft")
HotKeySet("{RIGHT}", "goRight")
HotKeySet("{DOWN}", "goDown")
HotKeySet("{UP}", "goUp")

global $block[1000]
global $p[10000], $playerId,$playerX,$playerY



$id = 0
$cl = 0
Dim $c[100]
For $i = 1 To 30 Step 1
   Local $line = FileReadLine($file)
   $cl += 1
   $c[$i] = 0
For $y = 1 to 30 step 1
   $id = $i*30 + $y
Local $var = StringMid($line, $y, 1)
If( $var= "1") then
   $block[$id] = 1
   $c[$i] += 1
EndIf
If( $var = "0") then
$block[$id] = 0
$c[$i] += 1
EndIf
If( $var = "2") then
   $block[$id] = 2
   $c[$i] += 1
EndIf
If( $var = "") then
 ExitLoop
EndIf
Next
Next




GUICreate(" My GUI Icons", 400, 300)
GUISetState()
func draw()
$id = 0
For $i = 1 To $cl Step 1
For $y = 1 to $c[$i] step 1
   $id = $i*30 + $y
If($block[$id] = 1) then
$p[$id] = GUICtrlCreatePic("test.bmp", $y*20 , $i*20, 20, 20)
EndIf
If( $block[$id] = 0) then
$p[$id] = GUICtrlCreatePic("test2.bmp", $y*20 , $i*20, 20, 20)
EndIf
If( $block[$id] = 2) then
$playerX = $y*20
$playerY = $i*20
$playerId = $id
$p[$id] = GUICtrlCreatePic("player.bmp", $y*20 , $i*20, 20, 20)
EndIf
Next
Next
EndFunc

draw()


Func goLeft()
   if $block[$playerId - 1] = 1 Then
      GUICtrlDelete($p[$playerId])
      GUICtrlDelete($p[$playerId - 1])
      $p[$playerId] = GUICtrlCreatePic("test.bmp", $playerX, $playerY, 20, 20)
      $p[$playerId - 1] = GUICtrlCreatePic("player.bmp", $playerX - 20, $playerY, 20, 20)
      $block[$playerId] = 1
      $playerX = $playerX - 20
      $playerId -= 1
   EndIf
EndFunc

Func goRight()
   if $block[$playerId + 1] = 1 Then
      GUICtrlDelete($p[$playerId])
      GUICtrlDelete($p[$playerId + 1])
      $p[$playerId] = GUICtrlCreatePic("test.bmp", $playerX, $playerY, 20, 20)
      $p[$playerId + 1] = GUICtrlCreatePic("player.bmp", $playerX + 20, $playerY, 20, 20)
      $block[$playerId] = 1
      $playerX = $playerX + 20
      $playerId += 1
   EndIf
EndFunc

Func goDown()
   if $block[$playerId + 30] = 1 Then
      GUICtrlDelete($p[$playerId])
      GUICtrlDelete($p[$playerId + 30])
      $p[$playerId] = GUICtrlCreatePic("test.bmp", $playerX, $playerY, 20, 20)
      $p[$playerId + 30] = GUICtrlCreatePic("player.bmp", $playerX, $playerY + 20, 20, 20)
      $block[$playerId] = 1
      $playerY = $playerY + 20
      $playerId += 30
   EndIf
EndFunc

Func goUp()
   if $block[$playerId - 30] = 1 Then
      GUICtrlDelete($p[$playerId])
      GUICtrlDelete($p[$playerId - 30])
      $p[$playerId] = GUICtrlCreatePic("test.bmp", $playerX, $playerY, 20, 20)
      $p[$playerId - 30] = GUICtrlCreatePic("player.bmp", $playerX, $playerY - 20, 20, 20)
      $block[$playerId] = 1
      $playerY = $playerY - 20
      $playerId -= 30
   EndIf
EndFunc







    While 1
        Local $msg = GUIGetMsg()

        If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    GUIDelete()


Думаю это связанно с тем что GUICtrlCreateIcon() не очень подходит для .bmp.
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
Версия 0.002


Что добавлено:
-"Туман войны"(зеленый) как в обычных стратегиях, который рассеивается при приближении к нему, о обратно не затягивается.
index.php

-Изменены GUICtrlCreateIcon() на GUICtrlCreatePic() (спасибо Zaramot'у).

-Изменена механика перемещения, т.е. теперь происходит не замена одного квадратика на другой, а просто перемещения "игрока". Что убрало
некоторые баги.


Код:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Local $file = FileOpen("test.txt", 0)



HotKeySet("{LEFT}", "goLeft")
HotKeySet("{RIGHT}", "goRight")
HotKeySet("{DOWN}", "goDown")
HotKeySet("{UP}", "goUp")

global $playerId,$playerX,$playerY, $player
$playerId = 0


$id = 0
$cl = 0
dim $block[1000]
Dim $p[10000000]
Dim $c[1000000]
Dim $f[1000000]
Dim $a[1000000]
For $i = 1 To 30 Step 1
   Local $line = FileReadLine($file)
   $cl += 1
   $c[$i] = 0
For $y = 1 to 30 step 1
   $id = $i*30 + $y
Local $var = StringMid($line, $y, 1)
If( $var= "1") then
   $block[$id] = 1
   $c[$i] += 1
EndIf
If( $var = "0") then
$block[$id] = 0
$c[$i] += 1
EndIf
If( $var = "2") then
   $block[$id] = 2
   $c[$i] += 1
EndIf
If( $var = " ") then
   $c[$i] += 1
EndIf
If( $var = "") then
 ExitLoop
EndIf
Next
Next




GUICreate(" My GUI Icons", 700, 700)
GUISetState()
GUICtrlCreateLabel("PlayerID", 20*31, 20, 40)
global $lab = GUICtrlCreateLabel($playerId, 20*31 + 45, 20, 30)

func draw()
$id = 0
For $i = 1 To $cl Step 1
For $y = 1 to $c[$i] step 1
   $f[$id] = GUICtrlCreatePic("fog.bmp", $y*20 , $i*20, 20, 20)
$a[$id] = 1
   $id = $i*30 + $y
If($block[$id] = "1") then
$p[$id] = GUICtrlCreatePic("test.bmp", $y*20 , $i*20, 20, 20)
EndIf
If( $block[$id] = "0") then
$p[$id] = GUICtrlCreatePic("test2.bmp", $y*20 , $i*20, 20, 20)
EndIf

If( $block[$id] = " ") then
EndIf

If( $block[$id] = "2") then
$playerX = $y*20
$playerY = $i*20
$playerId = $id
$block[$id] = "1"
$p[$id] = GUICtrlCreatePic("test.bmp", $y*20 , $i*20, 20, 20)
EndIf
Next
Next
$player = GUICtrlCreatePic("player.bmp", $playerX , $playerY, 20, 20)
defog()
EndFunc

func defog()
   $id = $playerID - 3 - 60
   for $y = 1 to 3 step 1
	  $id = $id + 30
	  for $x = 1 to 3 step 1
		 $id = $id + 1
		GUICtrlDelete($f[$id])
	  Next
	  $id = $id - 3
  Next
		
	 EndFunc
	 


draw()


Func goLeft()
   if $block[$playerId - 1] = 1 Then
	  $playerX = $playerX - 20
	  $playerId -= 1
	  GUICtrlSetPos($player, $playerX, $playerY)
	  defog()
   EndIf
EndFunc

Func goRight()
   if $block[$playerId + 1] = 1 Then
	  $playerX = $playerX + 20
	  $playerId += 1
	  GUICtrlSetPos($player, $playerX, $playerY)
	  defog()
   EndIf
EndFunc

Func goDown()
   if $block[$playerId + 30] = 1 Then
	  $playerY = $playerY + 20
	  $playerId += 30
	  GUICtrlSetPos($player, $playerX, $playerY)
	  defog()
   EndIf
EndFunc

Func goUp()
   if $block[$playerId - 30] = 1 Then
	  $playerY = $playerY - 20
	  $playerId -= 30
	  GUICtrlSetPos($player, $playerX, $playerY)
	  defog()
   EndIf
EndFunc







	While 1
  		Local $msg = GUIGetMsg()
   GUICtrlSetData($lab, $playerId)
		If $msg = $GUI_EVENT_CLOSE Then ExitLoop
	WEnd
	GUIDelete()


Скачать файлы:
http://autoit-script.ru/autoit_rv_ua/files/Other/game.zip
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
Для примера возьмем CS(Counter-Strike), если мы заставим игру взаимодействовать с нашей программой (99х99 полей), человек будет бегать внутри и упирается в стены, а если привязать отображение графики к цифрам, мы увидим(землю и стены), игра может быть любая другая GTA, Need For Speed, Crysis, Assassin's и тд. и вот сейчас мы подходим к тому что какой бы профи в области программирование вы небыли, дизайн должен остаться на потом, в крайнем случае мы напишем совою утилиту которая будет инжектить игру(нужную нам для отображения графики) и подставлять наши данные, поэтому программу надо разделить на две части: серверная(где будут происходить вычисления, передвижения) и клиентская(где будет отображаться все красиво), вместо второй части можно написать инжектор для заливки и подстановки наших данных в игры типа(CS, GTA, Need For Speed, Crysis, Assassin's и тд.).

a) Описав границы и свободное поле для передвижения, мы написали движок для 99% игр.
b) К нашим клеткам на серверной части, в будущем можно привязать любые игры.
c) Клетка на серверной части со значением(1) имеет значение свободное для перемещения, в графической части эта клетка может иметь еще 99x99 полей обеспечив свободное перемещение по полю.
d) Представим квест: в клетке (x:7,y:5) надо получить 3 единицы 1А. для получения надо стать в эту клетку и нажать 3 раза пробел, как это будет выглядеть в будущем: сервер и задание одно для всех, но отображение графической оболочки и текста задания разные(мульти-игра одна для всех).

Примеры квеста для людей по интересам:

Девичья: В новом месте зависти поклонников, идем в область (x:7,y:5) и пытаемся завести 3х поклонников, для заведения поклонников, ищем их методом опроса, шанс на удачу 3%, (для увеличения шанса удачи использовать: короткую юбочку +20% к удачи, доступное поведение +20% к удачи, другой инвентарь).
Военная: Солдат идет зачищать местность 3 от врагов(для увеличения шанса удачи использовать:оптика +20% к удаче, сосредоточенность +20% удаче).
Женская: Пригласить 3 знакомых на день рождения.
Фэнтези: Маг идет собирать 3 травы для зелья.
Экономическая: Менеджер отправляется за новыми 3 клиентами для компании.
Религиозная: Священник(Равин, Мулла, Поп и тд.): Отправляется что бы обратить 3 в свою веру.

Другой квест:
С&C: Разведка доложила что: недалеко от ваших шахт по добыче руды расположились враги, будущее под угрозой!
Женский вариант: Подруги рассказали вам что: рядом с вашим парнем поселилась симпатичная соседка, будущее под угрозой!

Вывод: Хорошая серверная часть на вес золота, графику можно прикрутить потом.
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
Я понял, что лучше пока сделать сам движок, а потом уже ад графикой стараться. Но я пока к графике и не цеплялся. Вчера мне в голову пришла мысль, а как реализовывать "туман войны", я много раз попробовал, было много багов, я даже удалил исходик в котором с туманом работал, но затем после перерыва, когда в голове из полученных ошибок и идеи сформировалась мысль как это реализовать, я это и сделал. :smile:
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
Многомерный маcсив решит все проблемы: $x=99, $y=99, $a[$x*$y+1][255]

$a[...n][0] - Обычные поля карты.

$a[...n][1] - Туман.
$a[...n][1] = "0" Туман включен в клетке.
$a[...n][1] = "1" Туман выключен в клетке.

$a[...n][2] - Предмет который можно поднять один и более раз.
$a[...n][2] = "0" не поднят.
$a[...n][2] = "1" поднят.

в перспективе, поднятые предметы привязываются id игрока.
$b[id игрока][положение на карте точка ...n][id Предмета][количество Предметов]
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
OffTopic:
Black_Hole, а ты часом сам игры не создаешь? :smile:
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
Иногда пишу, когда настроение есть :smile:

Вот мой код твоей игры, возможно что то из кода будет полезно, карта свободно расширяемая параметрами $x $y по краям карты всегда стена, все передвижения сбрасываются в лог текстового файла функцией _log() мне так удобнее обрабатывать, все функции простые тем самым делая код простым для портирования в другой язык, работают стрелки и (F9 для выхода), при запуске там же где находится скрипт создается файл log.txt

Код:
global $x=10, $y=7, $a[$x*$y+1], $b, $c, $d="", $e, $f, $k=0, $S_000="0", $S_001="1", $n[1], $z = $x+1,$mmm
$log = "./log.txt"
FileWrite(FileOpen($log, 16+2), "")
HotKeySet("{UP}", "_UP")
HotKeySet("{DOWN}", "_DOWN")
HotKeySet("{LEFT}", "_LEFT")
HotKeySet("{RIGHT}", "_RIGHT")
HotKeySet("{F9}", "_Exit")

_test()

While 1
Sleep(100)
WEnd

func _UP()
if ($a[$z-$x])>0 then 
$a[$z] = 1
$z -= $x
$a[$z] = 2
endif
_log()
endfunc
func _DOWN()
if ($a[$z+$x])>0 then 
$a[$z] = 1
$z += $x
$a[$z] = 2
endif
_log()
endfunc
func _RIGHT()
if ($a[$z+1])>0 then 
$a[$z] = 1
$z += 1
$a[$z] = 2
endif
_log()
endfunc
func _LEFT()
if ($a[$z-1])>0 then 
$a[$z] = 1
$z -= 1
$a[$z] = 2
endif
_log()
endfunc

func _Exit()
Exit
endfunc

func _test()
for $b=0 to $x*$y
if $b<$x or $b>($x*$y-$x-1) then
$a[$b]=$S_000
else
if $k>0 and $k<($x-1) Then
if $b=($x+1) then 
$a[$b]=2
else
$a[$b]=$S_001
endif
else
$a[$b]=$S_000
endif
endif
$k += 1
if $k=($x) Then
$k=0
endif
$c += 1
$d &= $a[$b]
if $c=$x then
$f = $d & chr(13)
FileWrite(FileOpen($log, 16+1), $f)
$d=""
$c=0
endif
next
FileWrite(FileOpen($log, 16+1), chr(13))
endfunc
func _log()
for $b=1 to $x*$y
$c += 1
$d &= $a[$b]
if $c=$x then
$f = $d & chr(13)
FileWrite(FileOpen($log, 16+1), $f)
$d=""
$c=0
endif
next
FileWrite(FileOpen($log, 16+1), chr(13))
endfunc
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
Вечером разберу твой код) Может что и возьму))
У меня вопрос возник, вот есть функция

Код:
Func Test()
   GUICtrlCreatePic("test.bmp", 20*31 , 80, 20, 20)
   TrayTip("","1 слой", 1000)
   sleep(2000)
   GUICtrlCreatePic("test2.bmp", 20*31 , 80, 10, 10)
   TrayTip("","2 слой", 1000)
      sleep(2000)
   GUICtrlCreatePic("player.bmp", 20*31 , 80, 10, 10)
   TrayTip("","3 слой", 1000)
   sleep(2000)
   GUICtrlCreatePic("fog.bmp", 20*31 , 80, 10, 10)
   TrayTip("","4 слой", 1000)
   
EndFunc


Т.е. в 1 точке создается 4 слоя, по моей логике, они должны накладываться 1 поверх другого. На самом деле получается вот что -
Создается 1 слой - видим 1 слой
Создается 2 слой - видим 1 слой
Создается 3 слой - видим 2 слой
Создается 4 слой - видим 3 слой

В чём может быть проблема?
 

Nazgul666

Знающий
Сообщения
21
Репутация
9
http://autoit-script.ru/index.php/topic,1077.0.html
Вот здесь достаточно описана ваша проблема
 

s0me0ne

Новичок
Сообщения
19
Репутация
2
К моему глубокому сожалению, скорость расчётов производимых интерпретатором AutoIt не достаточна для игр. Я тоже пытался писать на AutoIt игру, но скорость расчёта динамического массива данных крайне мала для нормальной графики/физики.

Вот это => http://www.autoitscript.com/forum/topic/70506-au3irrlicht/ тебе может помочь.
 

Isn

Новичок
Сообщения
119
Репутация
3
Попробуй лучше движок Unity , неплохой редактор ландшафтов, обработка, скрипты на java и C# там намного больше возможностей, на офф сайте триал версия или пробная точно не помню, но можно сделать полноценную игру с более лучшей графикой, на Autoit такого не добиться. В инете на youtube очень много примеров, уроков готовых текстур и т.д для Unity
Пример игры Unity
Сцена игры на Unity
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
Я по будням сижу в общаге с "плохого" ноута, поэтому не получиться во всяких Юнити пока что делать. А тут я делаю, это в принципе основа игры, она практически такая же на всех языках будет. Я так набить руку, по придумывать некоторые алгоритмы, понять как это - делать игру. Потом может переберусь на с++ и т.д. и в итоге исполню мечту детства, напишу нормальную игрушку :smile:
 
Автор
P

polzavatel

Новичок
Сообщения
50
Репутация
2
можно ли отловить нажатие на картинку (в моем случае - блок)

Вот код который я предполагал поможет, но он посылает сообщение на каждую $i

Код:
While 1
       $msg = GUIGetMsg()
   for $i = 1 to 1000 


    Select
        Case $msg = $GUI_EVENT_CLOSE
            Exit
		 Case $msg = $f[1]
			MsgBox(0,'', $i)
		 EndSelect
   Next 

WEnd
 
Верх